大模型用了十年的「笨办法」,被 Kimi 悄悄换掉了

21 阅读6分钟

Kimi 团队上周发了一篇论文,悄悄重写了 Transformer 里一个被用了将近十年的基础组件。残差连接,几乎所有大模型都在用的东西——他们说,这东西有问题,他们修了。

残差连接:一个「民主」但荒谬的设计

先说残差连接(residual connection)是什么。

Transformer 每一层都在做计算,而残差连接的作用是把每一层的输出加回到下一层的输入里——保证梯度能顺畅地向后流,防止深层网络训练崩溃。这个设计源自 2015 年 ResNet,后来几乎被所有大模型原封不动地沿用。

问题在哪?所有层的输出权重相同。第 1 层的结果和第 47 层的结果,对最终计算的贡献完全一样。

有个比喻很到位:这就像在一个委员会里开会,无论是十年前的老顾问还是刚进来的新成员,每人一票,永远平等。委员会越大,每个人的影响力越被稀释。一个 200 层的模型里,第 20 层的输出只有 1/200 的影响力。

这带来了两个工程上头疼的问题:

PreNorm 稀释:随着深度增加,每一层的贡献被越来越多的层稀释,早期层的信息在传到最后几乎被淹没。

隐藏状态无限制增长:所有层输出的累积和会随着深度增长,幅度越来越大,导致训练不稳定。

图:委员会比喻——均等权重 vs 智能选择

这两个问题不是没人注意到,而是过去大家默默接受了——毕竟效果还凑合,改动风险大。

Kimi 团队说,这是个可以解决的问题,而且解法很优雅。

AttnRes:用注意力机制处理「自身历史」

他们的方案叫 Attention Residuals(AttnRes)。思路其实不复杂,一句话能说清楚:

在序列方向,Transformer 用注意力机制让每个 token 选择性地关注其他 token。AttnRes 在深度方向做了完全同样的事——让每一层选择性地关注自己的处理历史。

具体到数学上,标准残差是把所有层输出相加(权重都是 1):

hl=i=0l1hih_l = \sum_{i=0}^{l-1} h_i

AttnRes 把权重变成动态的 softmax 注意力:

hl=i=0l1αilhih_l = \sum_{i=0}^{l-1} \alpha_{i \to l} \cdot h_i

每一层用一个学习得到的「伪查询向量」来决定 α\alpha 的大小——即当前层应该从哪些历史层汲取多少信息。这是输入相关的,不同的输入会产生不同的聚合权重。

效果直接:输出幅度被限制住了,梯度分布更均匀,早期层的信息不再被淹没。

图:AttnRes 原理对比

工程难题:内存怎么办?

如果每一层都要关注所有前层的输出,内存需求是 O(Ld)——L 是层数,d 是隐藏维度。对于一个 48B 的模型,这会炸掉任何正常的显存预算。

这也是为什么「让层关注历史层」这个想法之前有人提过但没人真正大规模落地的原因。

Kimi 的解法是 Block AttnRes

把模型的所有层分成 N 个块(约 8 个)。每个块内部还是用标准残差累积,跨块时才用注意力机制——但注意力只作用于块级别的「摘要表示」,而不是每一层的输出。

内存从 O(Ld) 降到 O(Nd)。8 个块对应的内存开销和全层注意力相比几乎可以忽略,但实验显示它能恢复大部分全 AttnRes 的性能增益。

图:Block AttnRes 分块工作原理

这是典型的「想法很美,工程让它落地」的故事。Full AttnRes 是理论最优,Block AttnRes 是实际可用——后者才是真正的贡献。

代码层面,Block AttnRes 的实现很干净:

def block_attn_res(blocks, partial_block, proj, norm):
    V = torch.stack(blocks + [partial_block])  # [N+1, B, T, D]
    K = norm(V)
    logits = torch.einsum('d, n b t d -> n b t', proj.weight.squeeze(), K)
    h = torch.einsum('n b t, n b t d -> b t d', logits.softmax(0), V)
    return h

整体结构不变,两个 einsum 解决问题,推理延迟增加不到 2%。

图:Block AttnRes 架构图,8块分组

实验数据:1.25x 是什么概念?

他们在 Kimi Linear(48B 参数总量,激活 3B 的 MoE 架构)上用 1.4 万亿 token 预训练,对比标准残差和 Block AttnRes:

计算效率提升 1.25x:意思是加了 AttnRes 的模型,达到相同的下游任务性能,只需要对照组 80% 的计算量。换句话说,你用同等算力,效果相当于多训了 25% 的 compute。

这不是小数,对于训练成本动辄几千万美元的大模型来说,25% 是真实的钱。

Scaling law 实验也支持这个结论——在不同规模的模型上都能观察到一致的改善,说明这不是某个特定规模点的偶然现象。

训练动态方面,AttnRes 模型的隐藏状态幅度增长被有效控制,各层的梯度分布更均匀。这意味着更稳定的训练,减少了调参难度。

图:训练动态对比,幅度增长对比

这个工作放在大背景下意味着什么?

有个有趣的历史视角。

神经网络架构史上有几次重要的「用注意力替代固定规则」:

  • Transformer 用自注意力替代 RNN 的顺序处理(序列方向)
  • Mixture of Experts 用门控网络替代固定的层路由(宽度方向)
  • AttnRes 用注意力替代固定的残差累积(深度方向)

图:从 RNN 到 Transformer 到 AttnRes 的架构演进

有人评论说,这是 Transformer 终于把注意力机制真正用到了所有维度。这个说法有点浪漫化,但也确实点出了问题——过去残差这块是被「特赦」的,AttnRes 把它也纳入了学习范畴。

当然也有泼冷水的声音:改善是真实的,但 1.25x 到底算多大的突破?Scaling law 实验是在相对小的模型上做的,48B MoE 只激活 3B,和真正的大规模训练还有距离。实际部署中 Block 的数量、块大小的选取,也有调参空间尚未完全探索。

一句话总结

AttnRes 把「哪些历史层信息应该被当前层使用」这个判断,从写死的「一律平等」改成了「模型自己学」。在 1.4T token 的训练规模上,这换来了 25% 的计算效率提升,推理延迟几乎不变。

如果后续在更大规模的训练上复现,这个工作大概率会进各家大模型的标配改造清单。

图:AttnRes 对比标准残差,选择性权重 vs 均等累加

🦞 想一起养成你的小龙虾军团?

在公众号对话框回复「小龙虾」,加入龙虾养成群——一个专门交流如何用 OpenClaw 做自媒体、搞变现的玩家社群。

军团越强,变现越快。来一起练级 👇

参考链接