Attention Residuals:用 softmax attention 替换固定残差,让深层 LLM 的信息聚合更聪明

  • 关联论文:2603.15031
  • 作者:flyP
  • 更新:2026-07-04

一句话结论

Attention Residuals(AttnRes)把 Transformer 里"每层都用权重 1 累加上一层输出"的固定 PreNorm 残差,改成"用 softmax attention 在前面所有层的输出上做加权聚合",从而让深层模型不再被"残差稀释"问题拖垮;它已经作为 drop-in 替换集成进 Kimi Linear(48B 总参 / 3B 激活),在 1.4T token 预训练上验证有效。

它要解决什么真问题

过去几年所有主流 LLM——从 LLaMA 到 Qwen 到 Kimi——几乎都用同一种骨架:

x_{l+1} = x_l + f_l(x_l)            # PostNorm
或
x_{l+1} = x_l + f_l(Norm(x_l))      # PreNorm(主流)

残差连接 + PreNorm 让深层网络能训得动,但它有一个隐藏代价:每一层都用固定权重 1 把自己这一层的输出加到主线上。当层数 L 很大时,主线信号被前面所有层的"等权累加"慢慢稀释——论文里称之为 PreNorm dilution

  • 每一层自己的贡献相对主线越来越小,梯度回流也变得不均匀;
  • 深层和浅层的输出 magnitude 差距拉大,导致 hidden state 在深度方向上"漂移";
  • 模型实际上更像是在做很多次"轻微扰动"而不是真正的层层抽象。

直觉上:如果某一层对当前 token 其实不重要(例如某些层对某些 token 是冗余的),传统残差依然把它强行累加进来;如果某一层对当前 token 极关键,传统残差也只能给它 1 倍权重,没法突出它。

AttnRes 的核心主张:聚合方式本身就该是 input-dependent 的,应该让每一层用学到的、随输入变化的权重去"挑"前面哪些层的结果对当前最有用。

核心方法

1. 范式层面:从固定残差到 attention 残差

标准 PreNorm 残差(沿深度方向聚合):

x_{l+1} = x_l + f_l(x_l)             # 权重恒为 1

AttnRes(沿深度方向的 softmax attention 聚合):

对当前层 l 的输入 x_l:
    q_l = W_q · x_l
    k_i = W_k · x_i     (i = 1..l-1,前置层输出)
    v_i = W_v · x_i
    α_i = softmax_i( q_l · k_i / sqrt(d) )
    x_{l+1} = Σ_i α_i · v_i + f_l(x_l)   # 跨层 attention + 当前层变换

也就是说,x_{l+1} 不再是 x_l + f_l(x_l),而是"前面所有层输出的 attention 加权和 + 当前层自己的变换"

这是一种把"序列维度的 self-attention"思想移植到"深度维度"的方案。在标准 Transformer 里,我们对 token 序列做 attention;在 AttnRes 里,我们对层序列做 attention。结构同构,只是被聚合的对象从"同一层不同位置"变成"同一位置不同层"。

2. Block AttnRes:解决"对所有前置层做 attention"的工程问题

如果真的对每一层 l 都去 attend 前面所有 L 层,会有两个硬伤:

  • 显存爆炸:要把所有前置层的 K/V 都存下来,深度 L 一大就吃不消。
  • 通信开销爆炸:分布式训练时,跨层 K/V 要在 GPU 之间来回搬运。

论文提出 Block AttnRes:把连续的若干层划成一个 block,跨层 attention 只在 block 边界处发生。

[Layer 1] [Layer 2] ... [Layer B]   →  block 输出 B_1
[Layer B+1] ... [Layer 2B]          →  block 输出 B_2   ← AttnRes 在 B_1, B_2, ... 之间聚合
...

具体做法:

  • block 内部仍用标准 PreNorm 残差(保住训练稳定性与现有优化);
  • block 与 block 之间用 attention 聚合(获得 input-dependent 跨层权重);
  • K/V 只在 block 边界缓存,显存从 O(L) 降到 O(L/B),B 是 block size。

再叠加两个工程技巧让它真正能跑大规模:

  1. 基于缓存的流水线通信(cache-based pipeline communication):在流水线并行里,把 block 边界的 K/V 缓存到下一阶段,避免重复通信。
  2. 两阶段计算策略(two-phase computation):第一阶段用普通残差快速算到 block 边界;第二阶段再补 AttnRes 聚合,分摊计算峰。

合在一起,Block AttnRes 就是"标准残差的 drop-in 替换",额外开销极小。

3. 与 Kimi Linear 架构的集成

Kimi Linear 是 Moonshot/Kimi Team 之前提出的架构变体(48B 总参数 / 3B 激活,类似 MoE 的稀疏激活)。AttnRes 在 Kimi Linear 上的预训练做了 1.4T tokens,结果显示:

  • 缓解 PreNorm dilution:层间输出 magnitude 趋于均匀,梯度分布也更均衡。
  • 下游任务全面提升:在所有评测任务上都观察到改进(论文摘要级陈述)。
  • Scaling law 一致:不同模型规模下 AttnRes 相对标准残差都有正收益,不是某个尺寸的偶然现象。

4. 关键伪代码(简化版)

# 标准 PreNorm 残差
def standard_residual(x, layer_fn):
    return x + layer_fn(norm(x))

# 完整 AttnRes(学术版)
def attnres_full(x, layer_fn, q_proj, k_proj, v_proj, prev_outputs):
    # prev_outputs: list of x_1, x_2, ..., x_{l-1}
    keys   = stack([k_proj(pi) for pi in prev_outputs])   # (l-1, d)
    values = stack([v_proj(pi) for pi in prev_outputs])   # (l-1, d)
    query  = q_proj(x)                                    # (d,)
    attn   = softmax(query @ keys.T / sqrt(d))            # (l-1,)
    agg    = attn @ values                                # (d,)
    return agg + layer_fn(norm(x))

# Block AttnRes(实用版)
def block_attnres(x, block_layers, q_proj, k_proj, v_proj, prev_block_outputs):
    # block 内部: 标准残差
    for layer in block_layers:
        x = standard_residual(x, layer)
    # block 边界: AttnRes 聚合
    keys   = stack([k_proj(b) for b in prev_block_outputs])
    values = stack([v_proj(b) for b in prev_block_outputs])
    query  = q_proj(x)
    attn   = softmax(query @ keys.T / sqrt(d))
    agg    = attn @ values
    return agg + x

5. 适用前提与失败模式

  • 前提 1:层数够多才有意义。在 L=12 左右的模型上,跨层 attention 的"挑选空间"很小,收益有限;L≥40 这种深层模型上更值得上。
  • 前提 2:block size B 是一个超参。B 太大退化成完整 AttnRes,开销上去;B 太小退化成标准残差,收益被吃掉。论文应做了消融,但具体数值未在摘要中给出
  • 失败模式:如果模型浅层就已经把任务做完,深层其实是冗余的,AttnRes 的 attention 权重会自然压低深层贡献——这是设计的预期行为,但训练初期若学习率过高,可能出现 attention 权重 collapse 到某几层的现象。

关键实验与数据

论文摘要明确给出的数字与陈述:

  • 基座集成:Kimi Linear,48B 总参 / 3B 激活。
  • 训练规模:1.4T tokens 预训练。
  • 观测现象:AttnRes 让输出 magnitude 跨深度更均匀,梯度分布更均衡(缓解 PreNorm dilution)。
  • 下游效果:在所有评测任务上一致提升(原文摘要级表述)。
  • Scaling law:在多个模型尺寸上验证了"越深/越大越受益"的趋势(原文摘要级表述)。

未在摘要中明确、但很可能在正文/附录中存在、本解读不擅自填的内容:

  • 具体下游基准分数(如 MMLU / GSM8K / HumanEval 的绝对值与对比);
  • Block size B 的消融表;
  • AttnRes 与 PostNorm、PreNorm、ReZero 等其它残差变体的详细对比;
  • 不同 block size 下吞吐/显存的具体数字。

这部分请以原文正文/附录为准。

亮点与局限

亮点

  1. 结构简单、收益直接:本质是"残差处换聚合函数",概念干净,不引入新的训练目标或正则项。
  2. drop-in 友好:Block AttnRes 对外接口与标准残差一致,现成训练框架改一行就能上。
  3. 工程成本可控:Block + 缓存 + 两阶段,把显存和通信开销压到与标准残差接近的水平。
  4. 工业级验证:不是 toy 实验,是在 48B 级别 MoE、1.4T tokens 上验证的。
  5. 与架构解耦:理论上能叠到任何 Transformer-based LLM 上(dense / MoE / linear attention 都行),不仅 Kimi Linear。

局限

  1. 深层才显著:对浅层模型收益有限,"杀鸡用牛刀"风险。
  2. block size 引入新超参:B 的选择直接影响收益/开销权衡,需要消融;论文摘要未给推荐值。
  3. 调试更复杂:跨层 attention 权重是新的可观测对象,定位问题时多一层诊断成本。
  4. 与其它架构修改的叠加未知:与 RoPE 缩放、KV 压缩、Linear Attention 等叠用时的交互,原文未明确
  5. 对超短训练任务不一定划算:如果只是几亿 token 的小训练,PreNorm dilution 还来不及累积,AttnRes 收益会被淹没在噪声里。

为什么 MoE / 深层模型更需要 AttnRes

PreNorm dilution 在不同架构里的严重程度并不一样。AttnRes 论文选了 Kimi Linear(48B/3B MoE)作为验证对象,本身就说明 MoE 是 dilution 严重的高发区。原因是叠加的:

  • 路由不均加剧深层漂移:MoE 每层只激活部分专家,未被路由到的 token 在该层几乎是"路过",但仍被等权加到主线。这等于给主线加了大量噪声贡献。
  • 深层放大器效应:标准残差把每一层的扰动都"原样保留"到主线,L 越大扰动叠加越多,hidden state 在 depth 方向上的分布越来越散。
  • 专家负载与残差耦合:如果某些层专家总被选、另一些几乎不选,等权残差会让"热门专家"的输出越来越主导主线,进一步削弱深层多样性。

AttnRes 的 input-dependent 跨层 attention 在这种场景下有两层收益:

  1. 浅层被高频复用的"模板性"输出,attention 权重会自动压低;
  2. 深层那些"对当前 token 真有用"的专家输出,能被 attention 放大。

这也是为什么论文在 1.4T tokens 这种规模上才能把 AttnRes 的收益稳定地测出来——稀释效应需要训练足够深、足够宽才能累积成可观测的差距。

与其它"修残差"路径的对比

  • ReZero / SkipInit(标量门控):给每条残差路径乘一个可学习标量 α,初始化为 0。优点是几乎零开销;缺点是所有 token 共享同一个 α,无法做 input-dependent 区分。AttnRes 是它的"向量化、上下文相关"升级。
  • Adaptive Computation Time (ACT):在"是否继续算"层面做条件化(早期退出 / 多算一步)。AttnRes 在"已经算了之后如何聚合"层面做条件化,两者正交,可以并存。
  • HyperNetworks / Meta-Residual:用单独的网络生成主网络的参数或残差强度,开销通常 > 5%,对工业级训练不友好。AttnRes 只多一个跨层 attention,且只在 block 边界发生,开销 < 1%(原文未明确具体数字,此为量级估算)。
  • Layer Drop / Stochastic Depth:在训练时随机丢掉某些层,推理时用期望补偿。这其实是另一种"缓解深层冗余"的思路,但它是 noise injection、不是 input-dependent 选择。AttnRes 与之正交,可叠加。

对工程落地的启发

  1. 训练超深 LLM 的基础设施团队:如果你正在训 50B+ 的模型、且观察到深层与浅层输出 magnitude 显著不均,AttnRes 是一个工程成本很低的"修残差"选项,值得在 ablation 里加一组。
  2. 复现 / 二次预训练团队:Block AttnRes 接口上等价于"在 block 边界多了一次跨层 attention",改起来比换 attention 主体或换 norm 简单得多。
  3. MoE 团队:论文已经在 48B/3B MoE(Kimi Linear)上验证,可以放心往自家 MoE 上试。
  4. 可观测性建设:跨层 attention 权重本身就是一个新的"模型深度维度健康度"指标,可以加进训练 dashboard,对诊断深层塌缩有用。
  5. 慎用点:层数 < 24、训练 token < 100B 的项目大概率拿不到正收益,ROI 不划算。

与同方向工作的关系

  • vs 标准 PreNorm 残差:AttnRes 是 PreNorm 的"input-dependent" 升级版,目标相同(让深层可训),但手段不同(让聚合权重可学习)。
  • vs PostNorm:PostNorm 早期被深层模型抛弃,AttnRes 通过 softmax 自然避免了 PostNorm 的训练不稳问题。
  • vs ReZero / SkipInit:这些是给残差乘一个可学习的标量 α(甚至初始化为 0),AttnRes 是给每条残差路径一个 input-dependent 向量权重,表达力更强。
  • vs Adaptive Computation Time (ACT) / Conditional Compute:ACT 在"是否继续算"层面做条件化,AttnRes 在"如何聚合前置层"层面做条件化,两者正交,可叠加。
  • vs HyperNetworks / Learned Residuals:HyperNet 类的方案用单独网络生成主网络参数,开销巨大;AttnRes 只在残差处加轻量 attention,开销小得多。
  • vs MESA / Differential Transformer 等新型注意力:AttnRes 改的是"残差",不是"注意力主体",可与这些新 attention 机制正交组合。

适合谁读

  • 大模型预训练 / Infra 团队:关心"如何让 50B+ 模型更深更稳",AttnRes 是 2026 年值得关注的一条工程路径。
  • 架构研究者:喜欢从"残差"这种基础组件入手做修改的,这是教科书级 case study。
  • MoE / Linear Attention 研究者:论文已经证明在 Kimi Linear 上 work,可作为新架构默认的残差方案。
  • 不推荐:做小模型(< 10B)、短训练(< 100B tokens)或应用层 fine-tune 的同学——对你没有性价比。

一句话回顾

Attention Residuals 把"残差"从固定的常数累加升级成 input-dependent 的 attention 聚合,是 2026 年 LLM 基础架构方向上一个简洁却工业级的工作;它最值得被记住的不是"再涨了多少分",而是它揭示的洞察——残差连接本身也可以被 attention 化,这件事打开了"深度维度的可学习聚合"这条新设计轴。

参考

  • 论文:https://arxiv.org/abs/2603.15031
  • 团队:Moonshot AI / Kimi Team(Yulun Du 等)
  • 集成对象:Kimi Linear(48B 总参 / 3B 激活)
  • 训练规模:1.4T tokens 预训练
  • 收录与版本:arXiv v1,2026-03-16(attnres tech report)

工程落地与核查(Jay)

1. 事实核查

核查项 状态 说明
Kimi Linear 集成声明 ⚠️ 待核实 原文摘要未明确"Kimi 已上线",可能仅是"集成实验"而非生产部署;解读中"集成进 Kimi Linear"措辞较生产化,有过度推断风险
48B/3B 架构描述 ✅ 基本支持 Moonshot AI 确有 Kimi Math / Kimi k1.5 等工作,但"Kimi Linear"是否为该厂公开命名的生产架构,需交叉核验
Block AttnRes 开销 "< 1%" ⚠️ 存疑 原文摘要未给具体数字;解读中"开销 < 1%"是量级估算而非原文数据,属合理推断但应注明
Block size B 推荐值 ❌ 原文无 摘要未给出,解读中已标注,未擅自填充
下游任务"全面提升" ⚠️ 方向性陈述 摘要仅定性,无具体 benchmark 数字;部署时不宜直接引用为"绝对提升"

2. 实际系统落地路径

适用场景判断(优先上车的情形): - 训练 50B+ 参数规模的 Dense / MoE 模型,已观察到深层 hidden state magnitude 显著不均 - 已有成熟的 Block-wise 流水线并行基础设施(block boundary cache 是 AttnRes 工程落地的硬前提) - 训练 tokens 规模 ≥ 500B,短训练(如 < 100B)看不到收益

Block AttnRes 最小可跑集成步骤

# 以 HuggingFace Transformers 为例(伪代码,示意接口)
# 核心改动点在 BlockTransformerBlock.forward() 的残差处
from transformers import LlamaForCausalLM, LlamaConfig

class BlockAttnResConfig:
    block_size: int = 8       # B,建议从 4/8/12 消融,不建议 >16
    enable_cross_block: bool = True

class BlockAttnResModel(LlamaForCausalLM):
    def __init__(self, config):
        super().__init__(config)
        # 注入跨层 QKV 投影(block boundary only)
        self.cross_block_q = nn.Linear(config.hidden_size, config.hidden_size)
        self.cross_block_k = nn.Linear(config.hidden_size, config.hidden_size)
        self.cross_block_v = nn.Linear(config.hidden_size, config.hidden_size)
        self.block_outputs_cache = []  # 手动管理 block 输出缓存

    def forward(self, input_ids, ...):
        # block 内部: 标准 PreNorm 残差
        for block_idx in range(num_layers // self.config.block_size):
            block_hidden = standard_block_forward(hidden_states)
            # block 边界: AttnRes 聚合
            if self.config.enable_cross_block:
                hidden_states = block_attn_aggregate(
                    block_hidden,
                    self.block_outputs_cache,
                    self.cross_block_q,
                    self.cross_block_k,
                    self.cross_block_v
                )
            self.block_outputs_cache.append(hidden_states.detach())  # 不跟踪梯度
        return output

3. 坑位清单

坑 1:block size 选型是成败关键 - B 太小(如 2)≈ 标准残差,AttnRes 优势被吃掉 - B 太大(如 32)≈ 完整跨层 attention,显存和延迟显著上升 - 建议:先在 1/10 规模(≤ 7B)上扫 B ∈ {4, 6, 8, 12, 16},找最优值再迁移到大模型

坑 2:缓存管理增加训练框架复杂度 - block_outputs_cache 必须与流水线并行调度严格对齐;缓存跨越 micro-batch 边界时需要额外同步 - 使用 NVIDA Megatron-LM / DeepSpeed 的话,需要在自定义 Transformer Block 钩子里实现缓存逻辑

坑 3:attention 权重 collapse(训练初期) - 若学习率太高,跨层 attention softmax 容易塌缩到对某几个 block 持续高权重 - 缓解:warmup 阶段强制 temperature = 1.0(不做 softmax 归一化),等权重稳定后再开启 learned temperature

坑 4:drop-in 说法有前提 - Block AttnRes 需要修改模型 forward 逻辑,并非单纯替换残差函数;对已有序列化模型(checkpoint)的复用需要额外迁移工具 - 对已有 SGLang / vLLM 推理框架的适配,需要在 attention kernel 层加跨 block 的 K/V 读取逻辑,改动比训练侧更大

坑 5:与某些注意力变体的冲突 - 与 StreamingLLM(保存 sink tokens)的思路有潜在冲突:两者都在改 attention pattern,叠加时需做消融 - 与 Gradient Cache(用于续训)的兼容性未经验证

4. 工程核查速查

✅ 论文 GitHub / arXiv 核查: arxiv.org/abs/2603.15031 (v1 2026-03-16)
⚠️  配套代码: 需核验原文是否有开源 repo (摘要未提及)
⚠️  Kimi Linear 命名: 与 Kimi k1.5 / Kimi Math 等公开命名是否一致,待核实
⚠️  开销 1% 以内: 原文摘要无此数字,属量级估算,非实证
❌  Block size 推荐值: 原文无,解读未擅自填 ✓