Kimi 团队上周发了一篇论文悄悄重写了 Transformer 里一个被用了将近十年的基础组件。残差连接几乎所有大模型都在用的东西——他们说这东西有问题他们修了。残差连接一个「民主」但荒谬的设计先说残差连接residual connection是什么。Transformer 每一层都在做计算而残差连接的作用是把每一层的输出加回到下一层的输入里——保证梯度能顺畅地向后流防止深层网络训练崩溃。这个设计源自 2015 年 ResNet后来几乎被所有大模型原封不动地沿用。问题在哪所有层的输出权重相同。第 1 层的结果和第 47 层的结果对最终计算的贡献完全一样。有个比喻很到位这就像在一个委员会里开会无论是十年前的老顾问还是刚进来的新成员每人一票永远平等。委员会越大每个人的影响力越被稀释。一个 200 层的模型里第 20 层的输出只有 1/200 的影响力。这带来了两个工程上头疼的问题PreNorm 稀释随着深度增加每一层的贡献被越来越多的层稀释早期层的信息在传到最后几乎被淹没。隐藏状态无限制增长所有层输出的累积和会随着深度增长幅度越来越大导致训练不稳定。这两个问题不是没人注意到而是过去大家默默接受了——毕竟效果还凑合改动风险大。Kimi 团队说这是个可以解决的问题而且解法很优雅。AttnRes用注意力机制处理「自身历史」他们的方案叫 Attention ResidualsAttnRes。思路其实不复杂一句话能说清楚在序列方向Transformer 用注意力机制让每个 token 选择性地关注其他 token。AttnRes 在深度方向做了完全同样的事——让每一层选择性地关注自己的处理历史。具体到数学上标准残差是把所有层输出相加权重都是 1h l ∑ i 0 l − 1 h i h_l \sum_{i0}^{l-1} h_ihli0∑l−1hiAttnRes 把权重变成动态的 softmax 注意力h l ∑ i 0 l − 1 α i → l ⋅ h i h_l \sum_{i0}^{l-1} \alpha_{i \to l} \cdot h_ihli0∑l−1αi→l⋅hi每一层用一个学习得到的「伪查询向量」来决定α \alphaα的大小——即当前层应该从哪些历史层汲取多少信息。这是输入相关的不同的输入会产生不同的聚合权重。效果直接输出幅度被限制住了梯度分布更均匀早期层的信息不再被淹没。工程难题内存怎么办如果每一层都要关注所有前层的输出内存需求是 O(Ld)——L 是层数d 是隐藏维度。对于一个 48B 的模型这会炸掉任何正常的显存预算。这也是为什么「让层关注历史层」这个想法之前有人提过但没人真正大规模落地的原因。Kimi 的解法是Block AttnRes把模型的所有层分成 N 个块约 8 个。每个块内部还是用标准残差累积跨块时才用注意力机制——但注意力只作用于块级别的「摘要表示」而不是每一层的输出。内存从 O(Ld) 降到 O(Nd)。8 个块对应的内存开销和全层注意力相比几乎可以忽略但实验显示它能恢复大部分全 AttnRes 的性能增益。这是典型的「想法很美工程让它落地」的故事。Full AttnRes 是理论最优Block AttnRes 是实际可用——后者才是真正的贡献。代码层面Block AttnRes 的实现很干净defblock_attn_res(blocks,partial_block,proj,norm):Vtorch.stack(blocks[partial_block])# [N1, B, T, D]Knorm(V)logitstorch.einsum(d, n b t d - n b t,proj.weight.squeeze(),K)htorch.einsum(n b t, n b t d - b t d,logits.softmax(0),V)returnh整体结构不变两个 einsum 解决问题推理延迟增加不到 2%。实验数据1.25x 是什么概念他们在 Kimi Linear48B 参数总量激活 3B 的 MoE 架构上用 1.4 万亿 token 预训练对比标准残差和 Block AttnRes计算效率提升 1.25x意思是加了 AttnRes 的模型达到相同的下游任务性能只需要对照组 80% 的计算量。换句话说你用同等算力效果相当于多训了 25% 的 compute。这不是小数对于训练成本动辄几千万美元的大模型来说25% 是真实的钱。Scaling law 实验也支持这个结论——在不同规模的模型上都能观察到一致的改善说明这不是某个特定规模点的偶然现象。训练动态方面AttnRes 模型的隐藏状态幅度增长被有效控制各层的梯度分布更均匀。这意味着更稳定的训练减少了调参难度。这个工作放在大背景下意味着什么有个有趣的历史视角。神经网络架构史上有几次重要的「用注意力替代固定规则」Transformer 用自注意力替代 RNN 的顺序处理序列方向Mixture of Experts 用门控网络替代固定的层路由宽度方向AttnRes 用注意力替代固定的残差累积深度方向有人评论说这是 Transformer 终于把注意力机制真正用到了所有维度。这个说法有点浪漫化但也确实点出了问题——过去残差这块是被「特赦」的AttnRes 把它也纳入了学习范畴。当然也有泼冷水的声音改善是真实的但 1.25x 到底算多大的突破Scaling law 实验是在相对小的模型上做的48B MoE 只激活 3B和真正的大规模训练还有距离。实际部署中 Block 的数量、块大小的选取也有调参空间尚未完全探索。一句话总结AttnRes 把「哪些历史层信息应该被当前层使用」这个判断从写死的「一律平等」改成了「模型自己学」。在 1.4T token 的训练规模上这换来了 25% 的计算效率提升推理延迟几乎不变。如果后续在更大规模的训练上复现这个工作大概率会进各家大模型的标配改造清单。想一起养成你的小龙虾军团在公众号对话框回复「小龙虾」加入龙虾养成群——一个专门交流如何用 OpenClaw 做自媒体、搞变现的玩家社群。军团越强变现越快。来一起练级 参考链接Kimi 官方 GitHubhttps://github.com/MoonshotAI/Attention-ResidualsKimi 官方推文https://x.com/Kimi_Moonshot/status/2033378587878072424
大模型用了十年的「笨办法」,被 Kimi 悄悄换掉了
Kimi 团队上周发了一篇论文悄悄重写了 Transformer 里一个被用了将近十年的基础组件。残差连接几乎所有大模型都在用的东西——他们说这东西有问题他们修了。残差连接一个「民主」但荒谬的设计先说残差连接residual connection是什么。Transformer 每一层都在做计算而残差连接的作用是把每一层的输出加回到下一层的输入里——保证梯度能顺畅地向后流防止深层网络训练崩溃。这个设计源自 2015 年 ResNet后来几乎被所有大模型原封不动地沿用。问题在哪所有层的输出权重相同。第 1 层的结果和第 47 层的结果对最终计算的贡献完全一样。有个比喻很到位这就像在一个委员会里开会无论是十年前的老顾问还是刚进来的新成员每人一票永远平等。委员会越大每个人的影响力越被稀释。一个 200 层的模型里第 20 层的输出只有 1/200 的影响力。这带来了两个工程上头疼的问题PreNorm 稀释随着深度增加每一层的贡献被越来越多的层稀释早期层的信息在传到最后几乎被淹没。隐藏状态无限制增长所有层输出的累积和会随着深度增长幅度越来越大导致训练不稳定。这两个问题不是没人注意到而是过去大家默默接受了——毕竟效果还凑合改动风险大。Kimi 团队说这是个可以解决的问题而且解法很优雅。AttnRes用注意力机制处理「自身历史」他们的方案叫 Attention ResidualsAttnRes。思路其实不复杂一句话能说清楚在序列方向Transformer 用注意力机制让每个 token 选择性地关注其他 token。AttnRes 在深度方向做了完全同样的事——让每一层选择性地关注自己的处理历史。具体到数学上标准残差是把所有层输出相加权重都是 1h l ∑ i 0 l − 1 h i h_l \sum_{i0}^{l-1} h_ihli0∑l−1hiAttnRes 把权重变成动态的 softmax 注意力h l ∑ i 0 l − 1 α i → l ⋅ h i h_l \sum_{i0}^{l-1} \alpha_{i \to l} \cdot h_ihli0∑l−1αi→l⋅hi每一层用一个学习得到的「伪查询向量」来决定α \alphaα的大小——即当前层应该从哪些历史层汲取多少信息。这是输入相关的不同的输入会产生不同的聚合权重。效果直接输出幅度被限制住了梯度分布更均匀早期层的信息不再被淹没。工程难题内存怎么办如果每一层都要关注所有前层的输出内存需求是 O(Ld)——L 是层数d 是隐藏维度。对于一个 48B 的模型这会炸掉任何正常的显存预算。这也是为什么「让层关注历史层」这个想法之前有人提过但没人真正大规模落地的原因。Kimi 的解法是Block AttnRes把模型的所有层分成 N 个块约 8 个。每个块内部还是用标准残差累积跨块时才用注意力机制——但注意力只作用于块级别的「摘要表示」而不是每一层的输出。内存从 O(Ld) 降到 O(Nd)。8 个块对应的内存开销和全层注意力相比几乎可以忽略但实验显示它能恢复大部分全 AttnRes 的性能增益。这是典型的「想法很美工程让它落地」的故事。Full AttnRes 是理论最优Block AttnRes 是实际可用——后者才是真正的贡献。代码层面Block AttnRes 的实现很干净defblock_attn_res(blocks,partial_block,proj,norm):Vtorch.stack(blocks[partial_block])# [N1, B, T, D]Knorm(V)logitstorch.einsum(d, n b t d - n b t,proj.weight.squeeze(),K)htorch.einsum(n b t, n b t d - b t d,logits.softmax(0),V)returnh整体结构不变两个 einsum 解决问题推理延迟增加不到 2%。实验数据1.25x 是什么概念他们在 Kimi Linear48B 参数总量激活 3B 的 MoE 架构上用 1.4 万亿 token 预训练对比标准残差和 Block AttnRes计算效率提升 1.25x意思是加了 AttnRes 的模型达到相同的下游任务性能只需要对照组 80% 的计算量。换句话说你用同等算力效果相当于多训了 25% 的 compute。这不是小数对于训练成本动辄几千万美元的大模型来说25% 是真实的钱。Scaling law 实验也支持这个结论——在不同规模的模型上都能观察到一致的改善说明这不是某个特定规模点的偶然现象。训练动态方面AttnRes 模型的隐藏状态幅度增长被有效控制各层的梯度分布更均匀。这意味着更稳定的训练减少了调参难度。这个工作放在大背景下意味着什么有个有趣的历史视角。神经网络架构史上有几次重要的「用注意力替代固定规则」Transformer 用自注意力替代 RNN 的顺序处理序列方向Mixture of Experts 用门控网络替代固定的层路由宽度方向AttnRes 用注意力替代固定的残差累积深度方向有人评论说这是 Transformer 终于把注意力机制真正用到了所有维度。这个说法有点浪漫化但也确实点出了问题——过去残差这块是被「特赦」的AttnRes 把它也纳入了学习范畴。当然也有泼冷水的声音改善是真实的但 1.25x 到底算多大的突破Scaling law 实验是在相对小的模型上做的48B MoE 只激活 3B和真正的大规模训练还有距离。实际部署中 Block 的数量、块大小的选取也有调参空间尚未完全探索。一句话总结AttnRes 把「哪些历史层信息应该被当前层使用」这个判断从写死的「一律平等」改成了「模型自己学」。在 1.4T token 的训练规模上这换来了 25% 的计算效率提升推理延迟几乎不变。如果后续在更大规模的训练上复现这个工作大概率会进各家大模型的标配改造清单。想一起养成你的小龙虾军团在公众号对话框回复「小龙虾」加入龙虾养成群——一个专门交流如何用 OpenClaw 做自媒体、搞变现的玩家社群。军团越强变现越快。来一起练级 参考链接Kimi 官方 GitHubhttps://github.com/MoonshotAI/Attention-ResidualsKimi 官方推文https://x.com/Kimi_Moonshot/status/2033378587878072424