mobile wallpaper 1mobile wallpaper 2mobile wallpaper 3mobile wallpaper 4
679 字
2 分钟
Kimi AttnRes 与注意力残差:2026 年的架构革新
2025-03-12

2025 年末,马斯克在 X 上转发了一篇论文,配文:「This is interesting.」

这篇论文来自月之暗面(Moonshot AI),标题是《Attention Residuals Prevent Layer Dilution》。

它提出了一个看似简单但影响深远的问题:残差连接真的完美吗?

研究团队发现,传统的残差连接在深层网络中会导致「层稀释」问题。解决方案是用动态注意力机制替代固定的残差连接。在 48B 参数模型上,困惑度降低 3.9%,训练效率提升 1.25 倍。

这是对 Transformer 架构的一次深度反思。

本文要点#

  • 残差连接的「层稀释」问题
  • PreNorm 与 PostNorm 的权衡
  • Attention Residuals 核心思想
  • Block AttnRes 高效实现
  • 48B 参数实验验证
  • 对未来模型架构的启示

一、残差连接的隐性问题#

1.1 残差连接的辉煌#

┌─────────────────────────────────────────────────────────────┐
│ 残差连接的历史 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 2015 年:ResNet 提出 │
│ • 解决深层网络训练难题 │
│ • 让网络突破 1000 层 │
│ │
│ 2017 年:Transformer 继承 │
│ • 每层都有残差连接 │
│ • 成为 Transformer 的标准设计 │
│ │
│ 标准形式: │
│ output = x + Layer(x) │
│ │
│ 看似完美: │
│ • 梯度直通,解决梯度消失 │
│ • 信息保留,避免信息丢失 │
│ • 训练稳定,收敛更快 │
│ │
└─────────────────────────────────────────────────────────────┘

1.2 层稀释问题#

flowchart TD A["输入 x₀"] --> B["Layer 1"] B --> C["x₁ = x₀ + Δ₁"] C --> D["Layer 2"] D --> E["x₂ = x₁ + Δ₂ = x₀ + Δ₁ + Δ₂"] E --> F["..."] F --> G["xₙ = x₀ + ΣΔᵢ"] H["问题分析"] --> I["每层贡献固定为 1"] I --> J["深层贡献被稀释"] J --> K["x₀ 在输出中占比 1/(n+1)"] style J fill:#ff9800,color:#fff style K fill:#f44336,color:#fff
┌─────────────────────────────────────────────────────────────┐
│ 层稀释的数学分析 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 输出 = x₀ + Δ₁ + Δ₂ + ... + Δₙ │
│ │
│ 如果每层的 Δᵢ 期望为 0: │
│ • 输出主要来自 x₀ 和噪声累积 │
│ • 深层学到的特征被「稀释」 │
│ │
│ 具体数值: │
│ • 12 层模型:每层贡献约 7.7% │
│ • 24 层模型:每层贡献约 4.0% │
│ • 48 层模型:每层贡献约 2.0% │
│ • 96 层模型:每层贡献约 1.0% │
│ │
│ 实际影响: │
│ • 模型倾向于「复制」而非「变换」 │
│ • 深层能力浪费 │
│ • 增加层数收益递减 │
│ │
└─────────────────────────────────────────────────────────────┘

1.3 PreNorm 让问题更严重#

┌─────────────────────────────────────────────────────────────┐
│ PreNorm 的稀释效应 │
├─────────────────────────────────────────────────────────────┤
│ │
│ PreNorm 架构: │
│ output = x + Layer(LayerNorm(x)) │
│ │
│ 额外问题: │
│ • LayerNorm 会压缩方差 │
│ • 每层看到的是「压缩后」的信号 │
│ • 信息传递效率降低 │
│ │
│ 为什么 PreNorm 更流行? │
│ • 训练更稳定 │
│ • 可以训练更深的网络 │
│ • 是当前主流选择 │
│ │
│ 困境: │
│ • PostNorm:训练不稳定,但信息保留好 │
│ • PreNorm:训练稳定,但稀释更严重 │
│ │
│ 有没有两全其美的方案? │
│ │
└─────────────────────────────────────────────────────────────┘

二、Attention Residuals 核心思想#

2.1 核心洞察#

flowchart TB A["核心问题"] --> B["固定权重 1:1"] B --> C["解决方案"] C --> D["动态学习权重"] E["灵感来源"] --> F["注意力机制"] F --> G["让模型自己决定权重"]
┌─────────────────────────────────────────────────────────────┐
│ Attention Residuals 思想 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 核心问题: │
│ • 残差连接的权重固定为 1:1 │
│ • 为什么不让模型学习这个权重? │
│ │
│ 解决方案: │
│ • 用注意力机制计算残差权重 │
│ • Query = 原始输入 x │
│ • Key/Value = 层输出 Δ │
│ • 权重由内容相关性决定 │
│ │
│ 公式: │
│ output = Attention(Q=x, K=Δ, V=Δ) │
│ │
│ 优势: │
│ • 模型自己决定何时信任原始输入 │
│ • 模型自己决定何时信任变换结果 │
│ • 不同位置可以有不同的权重 │
│ │
└─────────────────────────────────────────────────────────────┘

2.2 架构对比#

flowchart TB subgraph 标准残差 A1[x] --> B1["+"] C1["Layer(x)"] --> B1 B1 --> D1["x + Layer(x)"] end subgraph 注意力残差 A2[x] --> B2[注意力模块] C2["Layer(x)"] --> B2 B2 --> D2["Attn(x, Layer(x))"] end style D1 fill:#ff9800,color:#fff style D2 fill:#4caf50,color:#fff

2.3 代码实现#

import torch
import torch.nn as nn
import torch.nn.functional as F
import math
class AttentionResidual(nn.Module):
"""注意力残差模块"""
def __init__(self, hidden_dim, num_heads=8):
super().__init__()
self.num_heads = num_heads
self.head_dim = hidden_dim // num_heads
self.scale = self.head_dim ** -0.5
# Q, K, V 投影
self.q_proj = nn.Linear(hidden_dim, hidden_dim)
self.k_proj = nn.Linear(hidden_dim, hidden_dim)
self.v_proj = nn.Linear(hidden_dim, hidden_dim)
self.out_proj = nn.Linear(hidden_dim, hidden_dim)
def forward(self, x, delta):
"""
Args:
x: 原始输入 [batch, seq_len, hidden_dim]
delta: 层变换输出 [batch, seq_len, hidden_dim]
"""
batch_size, seq_len, hidden_dim = x.shape
# 投影
Q = self.q_proj(x) # Query 来自原始输入
K = self.k_proj(delta) # Key 来自变换输出
V = self.v_proj(delta) # Value 来自变换输出
# 重塑为多头
Q = Q.view(batch_size, seq_len, self.num_heads, self.head_dim).transpose(1, 2)
K = K.view(batch_size, seq_len, self.num_heads, self.head_dim).transpose(1, 2)
V = V.view(batch_size, seq_len, self.num_heads, self.head_dim).transpose(1, 2)
# 计算注意力
attn = (Q @ K.transpose(-2, -1)) * self.scale
attn = F.softmax(attn, dim=-1)
# 应用注意力
out = (attn @ V).transpose(1, 2).reshape(batch_size, seq_len, hidden_dim)
return self.out_proj(out)
class AttnResTransformerLayer(nn.Module):
"""使用注意力残差的 Transformer 层"""
def __init__(self, hidden_dim, num_heads, ffn_dim):
super().__init__()
self.norm1 = nn.LayerNorm(hidden_dim)
self.norm2 = nn.LayerNorm(hidden_dim)
self.attn = nn.MultiheadAttention(hidden_dim, num_heads, batch_first=True)
self.ffn = nn.Sequential(
nn.Linear(hidden_dim, ffn_dim),
nn.GELU(),
nn.Linear(ffn_dim, hidden_dim)
)
# 注意力残差
self.attn_res = AttentionResidual(hidden_dim, num_heads)
self.ffn_res = AttentionResidual(hidden_dim, num_heads=1)
def forward(self, x):
# 自注意力
attn_out, _ = self.attn(self.norm1(x), self.norm1(x), self.norm1(x))
x = self.attn_res(x, attn_out)
# FFN
ffn_out = self.ffn(self.norm2(x))
x = self.ffn_res(x, ffn_out)
return x

三、Block AttnRes 高效实现#

3.1 计算复杂度问题#

┌─────────────────────────────────────────────────────────────┐
│ 计算复杂度分析 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 标准残差:O(d) │
│ • 简单的逐元素加法 │
│ │
│ 注意力残差:O(d² + L²d) │
│ • 需要额外的注意力计算 │
│ • d = 隐藏维度,L = 序列长度 │
│ │
│ 问题: │
│ • 计算开销显著增加 │
│ • 需要高效的实现方式 │
│ │
└─────────────────────────────────────────────────────────────┘

3.2 Block 策略#

flowchart TB A["输入维度 d"] --> B["分成 k 块"] B --> C["每块维度 d/k"] C --> D["块内注意力"] D --> E["合并输出"] F["复杂度降低"] --> G["从 O(d²) 到 O(d²/k)"]
class BlockAttentionResidual(nn.Module):
"""分块注意力残差,降低计算复杂度"""
def __init__(self, hidden_dim, num_heads=8, num_blocks=4):
super().__init__()
self.num_blocks = num_blocks
self.block_dim = hidden_dim // num_blocks
# 每个块独立的注意力
self.blocks = nn.ModuleList([
AttentionResidual(self.block_dim, num_heads // num_blocks)
for _ in range(num_blocks)
])
def forward(self, x, delta):
"""
分块计算注意力残差
"""
batch_size, seq_len, hidden_dim = x.shape
outputs = []
for i in range(self.num_blocks):
start = i * self.block_dim
end = start + self.block_dim
x_block = x[:, :, start:end]
delta_block = delta[:, :, start:end]
out = self.blocks[i](x_block, delta_block)
outputs.append(out)
return torch.cat(outputs, dim=-1)

3.3 效率对比#

┌─────────────────────────────────────────────────────────────┐
│ 实现方案对比 │
├───────────────┬─────────────┬─────────────┬─────────────────┤
│ 方案 │ 计算复杂度 │ 参数增量 │ 效果 │
├───────────────┼─────────────┼─────────────┼─────────────────┤
│ 标准残差 │ O(d) │ 0 │ 基线 │
│ Full AttnRes │ O(d²) │ 3d² │ 最佳 │
│ Block AttnRes │ O(d²/k) │ 3d²/k │ 接近最佳 │
└───────────────┴─────────────┴─────────────┴─────────────────┘
k = 4 时,计算复杂度降低约 4 倍,效果损失很小

四、48B 参数实验验证#

4.1 实验设置#

┌─────────────────────────────────────────────────────────────┐
│ 实验配置 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 模型规格: │
│ • 参数量:48B │
│ • 层数:64 │
│ • 隐藏维度:8192 │
│ • 训练数据:2T tokens │
│ │
│ 对比方法: │
│ • PreNorm(标准残差) │
│ • DeepNorm │
│ • Sandwich Norm │
│ • Attention Residuals │
│ │
│ 评估基准: │
│ • 困惑度(PPL) │
│ • 下游任务性能 │
│ • 训练稳定性 │
│ │
└─────────────────────────────────────────────────────────────┘

4.2 主要结果#

xychart-beta title "48B 模型困惑度对比(越低越好)" x-axis ["PreNorm", "DeepNorm", "Sandwich", "AttnRes"] y-axis "困惑度" 4.0 --> 4.5 bar [4.35, 4.28, 4.25, 4.18]
┌─────────────────────────────────────────────────────────────┐
│ 实验结果详情 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 困惑度降低: │
│ • vs PreNorm:-3.9% │
│ • vs DeepNorm:-2.3% │
│ • vs Sandwich:-1.6% │
│ │
│ 下游任务提升: │
│ • MMLU:+2.1% │
│ • GSM8K:+3.5% │
│ • HumanEval:+4.2% │
│ │
│ 训练效率: │
│ • 收敛速度提升 1.25 倍 │
│ • 梯度更稳定 │
│ • 损失曲线更平滑 │
│ │
│ 层贡献分析: │
│ • 深层贡献显著增加 │
│ • 各层权重分布更均匀 │
│ • 解决了「复制偏好」问题 │
│ │
└─────────────────────────────────────────────────────────────┘

4.3 层贡献可视化#

xychart-beta title "各层对输出的贡献权重" x-axis ["Layer 1", "Layer 16", "Layer 32", "Layer 48", "Layer 64"] y-axis "贡献权重" 0 --> 3 line [1.0, 1.0, 1.0, 1.0, 1.0] line [0.8, 1.2, 1.5, 2.0, 2.5]
图中:
- 蓝线:标准残差(固定权重 1.0)
- 红线:Attention Residuals(动态学习权重)
关键发现:
• AttnRes 深层贡献权重显著高于浅层
• 说明模型学会了「信任」深层的变换结果
• 解决了层稀释问题

五、为什么马斯克点赞?#

5.1 技术创新点#

┌─────────────────────────────────────────────────────────────┐
│ 创新价值分析 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 1. 问题定义精准 │
│ • 发现了残差连接的「层稀释」问题 │
│ • 数学推导清晰 │
│ • 现象可观测、可验证 │
│ │
│ 2. 解决方案优雅 │
│ • 用注意力替代固定残差 │
│ • 与现有架构兼容 │
│ • 不引入过多复杂度 │
│ │
│ 3. 实验验证充分 │
│ • 48B 参数规模验证 │
│ • 多个基线对比 │
│ • 结果显著 │
│ │
│ 4. 实用价值高 │
│ • 可直接应用于现有模型 │
│ • 训练效率提升 │
│ • 无需额外数据 │
│ │
│ 5. 开源贡献 │
│ • 论文、代码、模型权重全部开源 │
│ • 推动 AI 社区进步 │
│ │
└─────────────────────────────────────────────────────────────┘

5.2 对行业的启示#

┌─────────────────────────────────────────────────────────────┐
│ 行业影响 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 短期影响: │
│ • 新模型可能采用 AttnRes 架构 │
│ • 现有模型可能进行架构升级 │
│ │
│ 中期影响: │
│ • 改变 Transformer 架构设计范式 │
│ • 影响下一代大模型设计 │
│ │
│ 长期影响: │
│ • 推动对残差连接的重新思考 │
│ • 可能启发更多架构创新 │
│ │
│ 商业价值: │
│ • 相同算力下更好的模型性能 │
│ • 可能降低模型训练成本 │
│ │
└─────────────────────────────────────────────────────────────┘

六、未来研究方向#

6.1 可能的改进#

┌─────────────────────────────────────────────────────────────┐
│ 未来研究方向 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 效率优化: │
│ • 更高效的注意力计算 │
│ • 稀疏注意力变体 │
│ • 硬件感知优化 │
│ │
│ 架构探索: │
│ • 与其他改进的结合 │
│ • 不同层的差异化设计 │
│ • 动态深度调整 │
│ │
│ 理论深化: │
│ • 残差连接的最优形式 │
│ • 层稀释的理论分析 │
│ • 最优深度与宽度的关系 │
│ │
│ 应用拓展: │
│ • 多模态模型 │
│ • MoE 架构 │
│ • 推理优化 │
│ │
└─────────────────────────────────────────────────────────────┘

常见问题 FAQ#

Q1:Attention Residuals 可以和标准残差混用吗?

A:可以。论文建议在深层使用 AttnRes,浅层可以使用标准残差,以平衡效果和效率。

Q2:Block AttnRes 的块数如何选择?

A:论文推荐 4-8 块。块数越多效果越好,但计算成本也越高。

Q3:AttnRes 对训练稳定性有影响吗?

A:实验显示 AttnRes 的训练稳定性与 PreNorm 相当,甚至更好。注意力机制天然的归一化效果有助于稳定训练。

Q4:现有模型可以直接升级到 AttnRes 吗?

A:需要重新训练。AttnRes 改变了模型计算方式,不能直接迁移权重。

Q5:推理时 AttnRes 会增加延迟吗?

A:会增加一些延迟,因为额外的注意力计算。但 Block AttnRes 可以控制开销。


小结#

Attention Residuals 是对 Transformer 架构的一次深刻反思。

核心贡献:

┌─────────────────────────────────────────────────────────────┐
│ AttnRes 核心总结 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 发现问题:残差连接导致层稀释 │
│ │
│ 解决方案:用注意力学习动态残差权重 │
│ │
│ 实验验证:48B 模型困惑度降低 3.9% │
│ │
│ 效率优化:Block AttnRes 降低计算开销 │
│ │
│ 行业影响:马斯克点赞,可能影响下一代模型架构 │
│ │
└─────────────────────────────────────────────────────────────┘

即使是成熟的架构,仍有创新空间。


参考资料#

支持与分享

如果这篇文章对你有帮助,欢迎支持作者或分享给更多人

Kimi AttnRes 与注意力残差:2026 年的架构革新
https://blog.souloss.com/posts/machine-learning/llm-paper-history/kimi-attnres-and-architecture-innovation/
作者
Souloss
发布于
2025-03-12
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时