Attention Residuals 阅读笔记:让每一层选择自己需要的历史表示

笔记日期: 2026-09-19
作者: Zhongzhu Zhou
阅读论文: Attention Residuals
论文作者: Kimi Team;Guangyu Chen、Yu Zhang、Jianlin Su 等,完整贡献者与排序见论文附录 A。
arXiv: 2603.15031v1,2026-03-16 提交。
本笔记依据 21 页 v1 全文,包括附录 A、B。

1. 我为什么把它理解成层与层之间的检索机制

读这篇论文时,我先把注意力放在一个很普通的问题上:下一层究竟收到什么?通常的答案是上一层输出,但把残差连接展开之后,答案其实是词嵌入加上所有前面子层输出的总和。每个历史输出都以系数一进入这个总和。后面的子层可以继续加工总和,却没有一个显式接口,让它单独取回某个早期子层的输出。

Attention Residuals,简称 AttnRes,把这个接口变成了可学习的检索。每个子层发出一个查询,对历史输出计算分数,再用 softmax 得到权重。于是两个不同 token 即使走过同一批层,也可以得到不同的历史混合。这里的注意力沿着网络深度展开,而不是沿着句子中的 token 位置展开;它不会替换原有的序列注意力。

更有意思的是查询本身。论文默认使用每层一个固定的可学习向量,而不是从当前输入生成查询。训练结束后这个向量固定,但键仍由输入内容决定,所以权重依然随 token 改变。固定查询还有系统上的价值:只要历史表示已经完成,就可以提前为同一块内的多个未来子层一起计算历史检索。这让一个模型设计选择直接决定了哪些计算可以批处理。

我认为论文最完整的贡献,是把“全量保存每层输出”逐步转化成一个能在大模型中使用的方案。Full AttnRes 保留最细粒度的历史;Block AttnRes 把若干子层输出加成块摘要;流水线缓存减少重复传输;两阶段计算减少重复读内存。只看额外参数很少,会漏掉激活存储和通信这两项真正重要的成本。

主实验使用 48B 总参数、3B 激活参数的 Kimi Linear 架构,按相同的 1.4T token 配方比较。论文表 3 中,十五项任务有十四项提高,MMLU-Pro 在报告精度下持平。这个结果值得认真分析,同时也要区分三个问题:分块模型是否接近全量模型;同一个分块模型能否被等价地重排计算;这种重排在某个硬件上节省多少时间。它们需要的证据并不相同。

图 1:依据论文第 3、4 节绘制的原创流程示意。已经完成的历史可供同一块内的全部固定查询使用;当前块的部分和仍然逐层更新。

2. 前置知识:残差流、归一化,以及容易混淆的层数

设批大小为 BB、序列长度为 TT、隐藏维度为 dd,隐藏状态张量形状为 B×T×dB\times T\times d。为看清层间混合,下面大部分公式只写一个 token,因此每个表示属于 Rd\mathbb R^d。这个简化没有删掉序列交互:序列注意力仍然在子层函数内部工作,只是深度检索对每个 token 分别计算。

论文将一次 attention 和一次 MLP 分别算作一层。我用 LL 表示这种子层数量,用 Lb=L/2L_b=L/2 表示通常所说的 Transformer block 数量。比如消融中的 16 个 Transformer block 实际对应 32 个子层;若每个 AttnRes 块包含 S=4S=4 个子层,就有八个残差块。这里的“块”至少有两种含义,不先区分,后面的内存估算会差一倍。

令 hlh_l 是进入子层 ll 的向量,flf_l 是该子层变换。标准残差为

hl+1=hl+fl(hl).h_{l+1}=h_l+f_l(h_l).

先展开一步,再继续代入,就得到

hl=h1+∑i=1l−1fi(hi).h_l=h_1+\sum_{i=1}^{l-1}f_i(h_i).

这个式子把残差的两种作用分开了。优化角度看,它提供绕过变换的路径;表示角度看,它规定所有历史输出以同样的系数累加。后一个规定通常被当作默认设置,但并没有理由认为所有目标层、所有 token 都需要相同的混合方式。

梯度方面,记 Ji=∂fi/∂hiJ_i=\partial f_i/\partial h_i,则

∂hL∂hl=(I+JL−1)⋯(I+Jl).\frac{\partial h_L}{\partial h_l} =(I+J_{L-1})\cdots(I+J_l).

乘积展开后包含单位矩阵项,这就是直接梯度通路的代数来源。不过,有单位矩阵项不代表整个乘积的每个奇异值都接近一:其余项可能放大,也可能抵消。以后分析 AttnRes 时同样要谨慎,不能因为权重处于零和一之间,就推断整个网络的梯度一定稳定。

PreNorm 在子层变换之前做归一化,而残差累加本身仍可能持续增长。RMSNorm 的一个常见表达是

RMSNorm⁡(v)=g⊙v∥v∥22/d+ϵ,\operatorname{RMSNorm}(v) =g\odot\frac{v}{\sqrt{\|v\|_2^2/d+\epsilon}},

其中 gg 是可学习的逐通道缩放,ϵ\epsilon 防止零附近的除法问题。它控制的是送入某个运算的尺度,不会自动约束网络中所有未归一化的和向量。

对于“残差随深度增长”,我更愿意保留条件。kk 个同向单位向量的和,范数是 kk;kk 个彼此正交单位向量的和,范数是 k\sqrt{k};有相反方向时还能相互抵消。真实网络的增长取决于输出相关性和训练后的幅值。论文图 5 确实展示了其基线模型中随深度增长的现象,但不能把这个观察推广成所有残差网络都必须服从的线性增长定律。

图 2:原创数学示例。左侧说明相关性不同会产生不同的累加尺度;右侧是分数为 0、1、2 时的 softmax 权重。两幅图都不是模型激活的实测结果。

3. Full AttnRes:权重从哪里来,约束又在哪里

把词嵌入写成 v0=h1v_0=h_1,把第 ii 个子层输出写成 vi=fi(hi)v_i=f_i(h_i)。第 ll 个目标子层可以访问 v0,…,vl−1v_0,\ldots,v_{l-1}。它拥有一个可学习伪查询 wl∈Rdw_l\in\mathbb R^d,先计算

zli=wl⊤RMSNorm⁡(vi),z_{li}=w_l^\top\operatorname{RMSNorm}(v_i),

再沿着历史来源这一维做 softmax:

αli=exp⁡(zli)∑j=0l−1exp⁡(zlj),hl=∑i=0l−1αlivi.\alpha_{li}=\frac{\exp(z_{li})}{\sum_{j=0}^{l-1}\exp(z_{lj})}, \qquad h_l=\sum_{i=0}^{l-1}\alpha_{li}v_i.

论文给出的打分式没有额外写 1/d1/\sqrt d。查询是可学习的,能吸收某种缩放,但解释方法时仍应按原定义写清楚,而不是无意识地搬用序列注意力的习惯形式。另一个容易忽略的区别是:键经过 RMSNorm,值没有归一化。前者防止输出仅凭幅值大就获得更大的打分,后者保留了输出本身的尺度信息。

这也解释了为什么固定查询仍能实现内容相关选择。查询规定“这一层倾向于找什么”,不同 token 产生的键决定“这次有哪些内容符合要求”。同一个 wlw_l 与两组不同的历史输出做点积,当然可以得到不同的 softmax。被去掉的只是“查询必须等当前状态算完才能产生”这条依赖。

例如分数为 (0,1,2)(0,1,2),权重约为 (0.090,0.245,0.665)(0.090,0.245,0.665)。把三个分数同时加上十,公共指数因子会被分母消掉,权重不变;把它们都乘以十,则会显著变尖锐。因此 softmax 的平移不变性不能被误认为任意缩放不变性,查询范数和归一化方式仍然影响选择强度。

论文强调伪查询要初始化为零。这样所有初始分数相同,于是

αli=1l,hl=1l∑i=0l−1vi.\alpha_{li}=\frac1l,\qquad h_l=\frac1l\sum_{i=0}^{l-1}v_i.

初始得到的是平均,不是原始残差的求和。理想化 PreNorm 对公共缩放可能不敏感,但真实网络还有 ϵ\epsilon、可学习尺度、非线性和最终输出。因此不能由零初始化直接推出:把一个已经训练好的标准残差模型替换成 AttnRes 后,函数会完全不变。本文的大规模结果来自对修改后架构的训练。

softmax 的非负性和归一化给出一个简单而有用的界:

∥hl∥2≤∑iαli∥vi∥2≤max⁡i∥vi∥2.\|h_l\|_2 \leq\sum_i\alpha_{li}\|v_i\|_2 \leq\max_i\|v_i\|_2.

第一步是三角不等式,第二步利用权重和为一。它说明混合不会比最大的源向量更大,但没有保证源向量本身有固定上界,也没有保证完整网络的雅可比范数有界。这是一个关于聚合操作的结论,足够解释它为什么能改变累加尺度,却不应被包装成普遍的训练稳定性证明。

算法 1:单个 token 的全量深度检索。

  1. 用词嵌入 v0v_0 初始化历史来源列表。
  2. 到达子层 ll 时,对全部可用来源生成归一化键,保留原向量作为值。
  3. 用 wlw_l 打分,减去最大分数后计算指数。
  4. 用指数之和归一化,得到权重并求加权和 hlh_l。
  5. 计算 fl(hl)f_l(h_l),把新输出追加到历史列表。
  6. 按深度顺序重复,最终输出也使用相应聚合。

来源访问总数是 1+2+⋯+L1+2+\cdots+L。略去批和 token 因子,算术量为 O(L2d)O(L^2d),历史表示占 O(Ld)O(Ld) 存储。额外参数很少,与访问激活很便宜,是两个完全不同的判断。

4. 分块到底压缩了什么信息

假设 LL 能被 NN 整除,把所有子层分成 NN 个连续块,每块 S=L/NS=L/N 个子层。块 nn 的完整摘要为

bn=∑j∈Bnfj(hj).b_n=\sum_{j\in\mathcal B_n}f_j(h_j).

执行到块内第 ii 个子层后,部分和记为

bn(i)=∑j∈Bn 的前 i 个子层fj(hj).b_n^{(i)}=\sum_{j\in\mathcal B_n\text{ 的前 }i\text{ 个子层}}f_j(h_j).

词嵌入继续独立保存为 b0=h1b_0=h_1。一个新块的第一个子层只看 b0,…,bn−1b_0,\ldots,b_{n-1};后续子层再多看一个不断变化的部分和 bn(i−1)b_n^{(i-1)}。这里有一个小细节:第一层之前不存在部分和来源,不能随手给 softmax 加一个零向量占位。零值虽然不贡献分子,但仍然贡献分母,会改变其他来源的权重。

分块省下了保存每个子层输出的成本,但也主动丢掉了块内区分能力。如果一个完整块获得权重 αn\alpha_n,展开可得

αnbn=∑j∈Bnαnfj(hj).\alpha_n b_n =\sum_{j\in\mathcal B_n}\alpha_n f_j(h_j).

块内每个输出都获得相同的有效系数。Full AttnRes 可以加强其中一个、压低另一个;Block AttnRes 在求和之后已经做不到这一点。因此“块摘要”不是无损缓存格式,而是一项模型容量选择。它保留了较远历史的可访问性,代价是较粗的检索粒度。

用一个二维例子就能看清这种损失。设两个子层输出分别为 (1,0)(1,0) 和 (−1,1)(-1,1),块摘要是 (0,1)(0,1)。全量检索给它们权重 0.80.8、0.20.2,可得到 (0.6,0.2)(0.6,0.2);对块摘要乘任意一个标量,都无法得到非零的第一维。键归一化不能恢复已经在求和中消失的方向。这个例子只证明有这种表达差异,并不声称真实模型经常发生同样的抵消。

算法 2:分块深度检索与摘要更新。

  1. 已完成历史列表初始化为 [b0][b_0]。
  2. 每个新块开始时,将部分和设为 p=0p=0,局部子层序号设为一。
  3. 构造来源集合:包含所有已完成摘要;只有局部序号大于一时才加入 pp。
  4. 对来源键做 RMSNorm,用当前目标的伪查询打分,并对整个集合统一做 softmax。
  5. 求加权输入 hlh_l,再计算子层输出 yl=fl(hl)y_l=f_l(h_l)。
  6. 更新 p←p+ylp\leftarrow p+y_l,继续下一个子层。
  7. 到块边界时,将 pp 存入已完成历史;最后一个不足整块的部分按实际长度保存。
  8. 全部子层完成后,对完整历史做最终输出聚合。

图 3:32 个子层、每块 4 个子层时的原创来源数量示意。分块后每个历史块仅保留一个可检索来源,当前块则用一个部分和表示。

存储量变成每个 token 的 O(Nd)O(Nd),再加局部工作空间。算术量应同时保留层数和块数:LL 个子层,每个最多访问约 NN 个来源,得到 O(LNd)O(LNd)。论文一处将其简写成 O(N2)O(N^2),另处写成 O(LN)O(LN)。只有把 S=L/NS=L/N 当作固定常数时,两种写法才只差常数因子。研究块大小的取舍时,我会保留 LL,避免把一个正在改变的变量藏进常数。

两个端点也需要仔细解释。S=1S=1 时,每个摘要恰好是一个子层输出,确实恢复 Full AttnRes。N=1N=1 时,全部输出在单块内累加,但词嵌入仍独立存在,注意力仍对嵌入与部分和做归一化混合。这种结构接近残差累加,却不在一般条件下等于单位权重求和。论文把这个端点描述为恢复标准残差,我倾向于把它理解成结构类比;若要主张函数严格相同,需要额外说明缩放条件。

5. 两阶段计算为什么能等价:分母不能丢

一个块开始时,已经完成的历史全部已知,该块内所有伪查询也已知。所以第一阶段可以把这些查询堆起来,一次批量计算它们对历史的检索。但当前块的部分和还没产生,必须在第二阶段随着子层执行逐步计算。如何把两部分合起来,才不会改变原来的 softmax?答案是保留归一化统计,而不只是保留两个局部平均值。

对任意来源集合 AA,定义

mA=max⁡i∈Azi,ℓA=∑i∈Aezi−mA,m_A=\max_{i\in A}z_i, \qquad \ell_A=\sum_{i\in A}e^{z_i-m_A}, oA=∑i∈Aezi−mAvi.o_A=\sum_{i\in A}e^{z_i-m_A}v_i.

oAo_A 是尚未归一化的向量分子,ℓA\ell_A 是缩放后的标量分母,局部输出是 oA/ℓAo_A/\ell_A。这里的 ℓA\ell_A 不是 log-sum-exp;真正的对数和为 mA+log⁡ℓAm_A+\log\ell_A。论文算法注释提到 LSE,但其除法与指数缩放公式对应的是这里的缩放和。解释算法时若混用二者,会得到完全不同的数值。

现在将两个不相交集合 A,DA,D 合并,取共同的最大值 m=max⁡(mA,mD)m=\max(m_A,m_D),并写成

o=emA−moA+emD−moD,o=e^{m_A-m}o_A+e^{m_D-m}o_D, ℓ=emA−mℓA+emD−mℓD,h=o/ℓ.\ell=e^{m_A-m}\ell_A+e^{m_D-m}\ell_D, \qquad h=o/\ell.

推导只有一步关键代入:emA−moAe^{m_A-m}o_A 等于 ∑i∈Aezi−mvi\sum_{i\in A}e^{z_i-m}v_i。另一组也是同样形式,所以相加后就是整个并集的 softmax 分子;分母同理。因此在实数运算下,分阶段计算与一次性计算完全相同。浮点数归约顺序不同可能带来很小的数值误差,但这与模型分块导致的表达损失不是同一类近似。

考虑一个具体的标量例子。第一组来源的分数是 0,log⁡20,\log2,值为 2,52,5。不做稳定缩放时,指数权重为 1,21,2,分子为 1212,分母为 33,局部平均为 44。新来源的值为 88、分数为 log⁡3\log3,它的分子和分母分别为 24,324,3。正确合并结果是 (12+24)/(3+3)=6(12+24)/(3+3)=6。

这个例子中,两个局部平均的简单平均碰巧也是六,因为两组总指数质量相同。如果新来源分数改成 log⁡6\log6,正确结果变成 (12+48)/(3+6)=20/3(12+48)/(3+6)=20/3,简单平均仍然是六,就错了。这个反例说明保存局部输出还不够:必须知道每个输出背后对应多少归一化质量。

算法 3:一个残差块的两阶段执行。

  1. 将块内 SS 个伪查询堆成矩阵 Q∈RS×dQ\in\mathbb R^{S\times d}。
  2. 对已完成历史生成归一化键,批量得到每个目标的 (olH,mlH,ℓlH)(o_l^H,m_l^H,\ell_l^H)。
  3. 初始化当前部分和 p=0p=0。
  4. 块内第一个子层直接使用 olH/ℓlHo_l^H/\ell_l^H,不引入空的局部来源。
  5. 后续子层计算 pp 的分数 zlPz_l^P;单来源的稳定统计为 (p,zlP,1)(p,z_l^P,1)。
  6. 按上述公式合并历史与局部统计,最后做一次分子除分母。
  7. 计算 fl(hl)f_l(h_l),并累加到 pp,然后再进入下一个子层。
  8. 块结束时存下完整的 pp。

批量计算查询不等于并行运行所有非线性子层。第二阶段仍有不可绕开的因果依赖。节省主要来自历史数据只读一次、矩阵运算形状更合适,以及局部操作可与附近算子融合。理解这个差别,才能判断一种“更聪明的查询”会不会破坏系统优化的前提。

6. 分布式训练:先算通信量,再讨论能否被隐藏

在最简单的反向传播中,各层激活本来就要保留,Full AttnRes 可以复用这些信息。但大规模训练常使用激活重计算:普通模型会丢掉一些中间表示,之后再算;AttnRes 的后续子层却还要读取历史来源。此时“本来就在内存里”的前提不再自动成立。流水线并行又会让历史来源跨设备,通信成本随之进入设计。

设物理流水线 rank 数为 PP,每个 rank 有 VV 个虚拟阶段,总逻辑 chunk 数为 C=PVC=PV。按照论文的简化账本,用 NpN_p 表示每个 chunk 平均新增的块表示数量。第 jj 次转换若发送全部历史,就要发送 jNpjN_p 个向量,合计

Comm⁡naive=Npd∑j=1C−1j=C(C−1)2Npd.\operatorname{Comm}_{\rm naive} =N_pd\sum_{j=1}^{C-1}j =\frac{C(C-1)}2N_pd.

这是每个 token 的元素量,要得到实际字节数,还要乘批、序列长度和元素大小。实际块边界未必与流水线边界对齐,因此 NpN_p 只是平均会计量,不是每段都精确生成同样整数个摘要的保证。

缓存的想法很直接:同一个物理 rank 在较早的虚拟阶段已经收到的摘要,可以留在本地。下一次轮到它时,只发送它上次离开后新生成的摘要。第一次遍历照常积累,后续遍历发送增量,论文给出

Comm⁡cache=[P(P−1)2+(V−1)P2]Npd.\operatorname{Comm}_{\rm cache} =\left[\frac{P(P-1)}2+(V-1)P^2\right]N_pd.

当 P=4,V=2P=4,V=2,朴素账本是 28Npd28N_pd,缓存后是 22Npd22N_pd,少六个单位。这对应简化模型中约 21.4% 的通信量下降,不能被说成八倍训练加速。V=1V=1 时两式相同,因为没有先前的虚拟阶段可供复用;这个端点也帮助检查公式的直觉。

图 4:将论文式 7、8 代入四个物理 rank 得到的原创计算图。纵轴是传输量的归一化账本,不是带宽测试或端到端时间测量。

论文还指出,单次转换峰值开销的依赖可从 CC 缩小到 PP。这可能使通信更容易与计算重叠,但“量少了”和“完全藏进计算时间里”仍有距离。带宽、消息延迟、微批大小、每段计算长度,以及流水线调度都会影响关键路径。报告给出的流水线训练额外开销小于 4%,应与其测试设置一起理解,不是任何集群都适用的硬上界。

从算法依赖关系看,缓存对象还必须区分微批和序列片段。两个对象同样叫第几个块,并不意味着它们属于同一个输入,也不能互换。反向传播还要汇总经历史来源传回的梯度。这些是数学数据流要求,不是对某个仓库写法的判断。缓存优化真正复用的是同一对象的重复传输,而不是跨样本借用表示。

7. 推理成本的三个口径:存多少、搬多少、花多久

论文表 1 比较的是残差机制引入的内存访问,不包含 attention 和 MLP 函数内部的读写。示例采用 L=128,N=8,S=16L=128,N=8,S=16,mHC 使用四条残差流。标准残差是 3d3d 个元素访问,Block AttnRes 是 5.5d5.5d,优化调度后的 Full AttnRes 是 24d24d,mHC 约为 34d34d,最后一个数省略了较小的标量项。

图 5:依据论文表 1 重绘的残差读写账本。此处不包含层函数内部流量,柱高不能直接换算成完整模型的吞吐或延迟。

附录 B 推导了 Full AttnRes 的 24d24d。这里的分块只是调度方法,仍然保留每个子层的独立输出,和 Block AttnRes 的模型近似不同。在调度块 nn 之前有 (n−1)S(n-1)S 个历史来源,键和值合计读取 2(n−1)Sd2(n-1)Sd。对所有块求和,得到

RH=∑n=1N2(n−1)Sd=dL(N−1).R_H=\sum_{n=1}^{N}2(n-1)Sd =dL(N-1).

当前块内部仍需顺序访问,局部第 tt 个子层前面有 t−1t-1 个来源,因此

RPblock=∑t=1S2(t−1)d=S(S−1)d.R_P^{\rm block} =\sum_{t=1}^{S}2(t-1)d =S(S-1)d.

全模型读取量为 RH+NRPblockR_H+NR_P^{\rm block},除以总子层数 L=NSL=NS,每层均摊读取为 (N+S−2)d(N+S-2)d。两个阶段各写一次结果,再加 2d2d,于是总读写为 (N+S)d(N+S)d。代入八和十六,得到二十四。

这个式子还给出一个纯调度上的小结论:固定 LL,访问因子是 S+L/SS+L/S,对连续的 SS 求导,得到 1−L/S2=01-L/S^2=0,最小值在 S=LS=\sqrt L 附近。实际还要处理整数划分、硬件矩阵块、容量和局部串行长度,所以它不是现成的最优配置。尤其不能直接把这个调度最优值当成 Block AttnRes 的架构最优块大小,因为后者改变了模型可以选择哪些来源。

Block AttnRes 只保存块摘要,按论文账本,每层成本是 (N/S+5)d(N/S+5)d。示例中为 8/16+5=5.58/16+5=5.5。它仍约为标准残差读写的 1.83 倍,但报告称典型工作负载下端到端推理开销小于 2%。两者不矛盾:残差访问只占完整模型工作的一部分,且批处理、融合和重叠会改变其时间占比。同样,也不能用 34/5.534/5.5 宣称模型相对 mHC 实测快了六倍。

长上下文 prefill 关注的另一个问题是存储容量。TT 个 token、每个保留 NN 个摘要,需要 NTdNTd 个元素;若每个元素占 bb 字节,就需要 bNTdbNTd 字节。沿序列切分到 PP 个设备后,每设备变成 bNTd/PbNTd/P。论文中 128K 上下文、八个块的约 15 GB 示例,经八路切分降到约 1.9 GB;再用 16K chunk,活跃长度又缩小八倍,对应这一项约 0.234 GB。

这不是完整模型内存下降六十四倍。权重、序列注意力的 KV cache、线性注意力状态、通信缓冲区和峰值临时空间都不在这个孤立项中。深度历史和序列 KV cache 也不是同一个东西:前者让同一 token 跨层取回表示,后者让一个注意力层访问此前的 token。KDA/MLA 混合模型可能同时保有多种状态,内存核算时需要分别列出。

8. 缩放实验和主实验分别说明了什么

表 2 的五个规模是 194M、241M、296M、436M、528M 激活非嵌入参数,token 预算从 38.7B 到 119.0B。每个规模内,基线、Full 和 Block 使用相同配置,上下文为 8192,学习率采用 cosine 日程。跨规模配置和训练数据量都在变化,因此这是一组配对比较,不是固定 token 数只扫描参数量的实验。

图 6:论文表 2 的验证损失精确数值重绘。各规模 AttnRes 均优于对应基线;但 241M 处 mHC(-lite) 的损失低于 Full AttnRes,因此不能概括为 Full 在所有行都领先。

最大一组的基线、Block、Full 损失分别为 1.719、1.693、1.692。以损失降低量计算,Block 保留 0.026/0.027≈96.3%0.026/0.027\approx96.3\% 的提升;436M 处则为 0.020/0.029≈69.0%0.020/0.029\approx69.0\%。因此“保留大部分收益”可以描述某些规模,但不是恒定的百分比,也不能不带条件地延伸到其他模型。

论文给出的三条拟合曲线为

LB(C)=1.891C−0.057,\mathcal L_B(C)=1.891C^{-0.057}, Lblock(C)=1.870C−0.058,Lfull(C)=1.865C−0.057.\mathcal L_{\rm block}(C)=1.870C^{-0.058}, \qquad \mathcal L_{\rm full}(C)=1.865C^{-0.057}.

CC 的单位为 PFLOP/s-days。所谓计算优势,是在相同目标损失下反解各自需要多少计算。对一般曲线 ℓ∗=AC−a\ell_*=AC^{-a},有

Ca=A/ℓ∗,C=(A/ℓ∗)1/a.C^a=A/\ell_*,\qquad C=(A/\ell_*)^{1/a}.

这才是约 1.25 倍优势的含义,而不是计时器显示训练快了 25%。由于指数很小,反解会放大拟合参数的舍入误差,计算比也会随目标损失变化。论文没有在这里给拟合置信区间,所以应把它看成已测区间中的拟合估计,不是任何规模和硬件上都成立的常数。

大模型实验采用另一套配方,不能把缩放研究中的配置混进去。它有 27 个 Transformer block,即 54 个子层;总参数 48B、激活参数 3B;256 个路由专家中选择八个,另有一个共享专家;KDA 与 MLA 以 3:1 交错。AttnRes 每六个子层形成一个摘要,因此是九个摘要加词嵌入,共十个深度来源。

主训练使用 4096 上下文、Muon、8M token 全局批大小,先进行 1T token 的 warmup-stable-decay 预训练,再进行约 400B 高质量 token 的 mid-training。论文也描述了后续延长到 32K 上下文。这里的九块设置与小规模实验约八块的设置不同,而 128K 内存数字又是系统部分的独立示例,应分别标注。

图 7:根据论文表 3 计算的百分点变化。GPQA-Diamond 从 36.9 到 44.4,提升 7.5 个百分点;MMLU-Pro 两者均为 52.2。没有误差条是因为来源未提供相应统计,并不表示结果没有不确定性。

最显著的变化包括 GPQA-Diamond +7.5、Math +3.6、HumanEval +3.1、C-Eval +2.9 个百分点。MMLU 提升 1.1,HellaSwag 提升 0.2。组合推理和代码任务改善较大,与“后层更容易取回并组合早期信息”的假说相容。但架构同时改变了优化轨迹、表示尺度和检索方式,仅凭最终分数无法把收益全部归因于其中某一个机制。

训练曲线显示 AttnRes 的验证损失更低,输出幅值在块边界附近呈受控的周期变化,梯度分布也更均匀。这些是支持动机的观察,不是因果干预实验。尤其对于样本量较小的评测,单次大幅提高仍需要结合提示模板、解码方式和抽样波动来判断,不能直接当成一般推理能力增加了同样的百分比。

9. 消融里的取舍:更强的版本为什么没有成为默认

我很喜欢这组消融的一点是:论文没有把最方便部署的方案伪装成精度最优。输入相关查询的 Full AttnRes 损失为 1.731,固定查询版本为 1.737。默认选择后者,是为了避免每层额外的 d×dd\times d 投影,并保留提前批量处理历史的能力。这是用一部分已观察到的建模能力交换系统可调度性。

图 8:论文表 4 的精确消融数值重绘。损失越小越好。动态查询版本数值最好,但它依赖当前输入,不能沿用相同的提前批处理条件。

把内容相关权重换成静态可学习权重,损失变成 1.749;Full 为 1.737。这个比较支持在当前配方下使用输入相关选择,但不能证明所有静态混合设计都无效。DenseFormer 在本表是 1.767,也只是该设置的结果;优化参数和尺度匹配还可能影响比较。

把 softmax 换成 sigmoid,损失是 1.741。论文将差异解释为竞争式归一化的好处:一个来源占据更多概率质量,其他来源就相应减少。然而独立 sigmoid 门还会改变总权重和,因此选择性与整体尺度同时变化。若想更明确地识别原因,可以比较归一化后的 sigmoid 门,并匹配混合输出的范数。

去掉键 RMSNorm,Full 损失为 1.743,Block 为 1.750。这符合一个直觉:完整摘要与部分和包含的输出数量不同,若不处理尺度,较大幅值可能主导打分。但值仍是原向量,所以这项归一化只是减少打分中的幅值偏置,不能让输出信号与所有幅值无关。

分块多头版本采用十六个头,损失为 1.752,单头分块为 1.746。作者据此认为一层输出作为整体的相关性较重要。我会把它留作一种解释,而不是普遍结论。头宽、优化敏感性、通道间协调也可能参与其中;仅有一个多头配置不足以说明所有特征总该选择同一段历史。

另一个很有参考价值的对照是滑动窗口。它保留嵌入和最近八个子层输出,损失为 1.764,接近 1.766 的基线;块大小四的分块模型却达到 1.746。来源预算相近时,粗粒度保留远处历史似乎比只精细保留最近历史更有用。这条发现对内存受限的模型设计尤其值得追踪。

图 9:左侧重绘论文图 6 的块大小结果,虚线为基线;右侧是第 4.2 节约 15 GB 示例的算术缩放。左右分别属于质量实验和容量估算,不是同一组测量。

块大小 S=32,16,8,4,2S=32,16,8,4,2 时,损失依次为 1.757、1.753、1.748、1.746、1.746;S=1S=1 的 Full 则为 1.737。从四减到二在报告精度下持平,继续减到一又有明显变化。它提示我们,粒度与质量之间未必是简单平滑的关系;嵌入来源、层类型排列、优化过程,都可能让某些边界比另一些更重要。

固定约 6.5×10196.5\times10^{19} FLOPs、2.3×1082.3\times10^8 激活参数的架构扫描中,最优宽深比从基线约六十移到 AttnRes 约四十五。这说明在该范围内,更深、更窄可能变得更划算。但推理需要按深度顺序执行,更深也可能更慢。因此训练损失最优点只能作为部署决策的一个输入,不能替代延迟、吞吐和内存约束。

10. 再向下一层:梯度公式与矩阵结构的边界

注意力热图看起来直观,但权重并不是完整的影响系数。即使先固定其他来源,只研究一个源向量 vjv_j 对混合结果的局部影响,也至少包含两条路径:它直接作为值进入加权和;它还作为键改变自己以及其他来源的权重。

先从 softmax 的导数开始。对任意 i,ji,j,

∂αi∂zj=αi(1i=j−αj).\frac{\partial\alpha_i}{\partial z_j} =\alpha_i(\mathbf1_{i=j}-\alpha_j).

将 h=∑iαivih=\sum_i\alpha_i v_i 对 zjz_j 求导,逐项代入可得

∂h∂zj=∑iviαi(1i=j−αj)=αj(vj−h).\frac{\partial h}{\partial z_j} =\sum_i v_i\alpha_i(\mathbf1_{i=j}-\alpha_j) =\alpha_j(v_j-h).

再考虑 zj=w⊤RMSNorm⁡(vj)z_j=w^\top\operatorname{RMSNorm}(v_j),用链式法则得到

∂h∂vj=αjI+αj(vj−h)(∇vjzj)⊤.\frac{\partial h}{\partial v_j} =\alpha_j I+ \alpha_j(v_j-h)\left(\nabla_{v_j}z_j\right)^\top.

第一项是值通路,第二项是路由通路。这还只是把其他来源当成固定量的局部偏导;完整网络里,后续来源本身也可能依赖 vjv_j,还会增加别的传播路径。因此 αj≤1\alpha_j\leq1 不能推出完整梯度范数不超过一;某来源平均权重很低,也不等于把它删掉就不会影响模型。

为理解归一化的作用,暂时省略 ϵ\epsilon 和可学习通道尺度,令 r=∥v∥/dr=\|v\|/\sqrt d。对 v/rv/r 求导,可写成

Jnorm(v)=1r(I−vv⊤∥v∥22).J_{\rm norm}(v) =\frac1r\left(I-\frac{vv^\top}{\|v\|_2^2}\right).

括号中的矩阵去掉沿 vv 的径向分量,剩下的切向变化再乘 1/r1/r。这解释了为什么纯粹的正比例放大不会改变归一化键,也提醒我们小范数附近需要 ϵ\epsilon。真实 RMSNorm 保留 ϵ\epsilon 后,零附近的表达有所不同;不能把这个便于理解的简化导数直接套到所有输入。

论文还从深度混合矩阵的角度比较各种残差方案。这里最好先问清楚“秩”指什么。标准残差展开后的系数矩阵是下三角全一矩阵,主对角线非零,所以普通矩阵秩已经等于 LL。它之所以能用一个很小的递归状态表示,是因为跨越某个深度切分的非对角子块只有秩一。这种结构与半可分离矩阵有关,和整张矩阵的普通秩不是同一个概念。

因此,Full AttnRes 的矩阵可以有普通秩 LL,并不能单靠这一点证明它比标准残差更有表达能力。真正需要比较的是跨深度切分的结构限制、可独立赋权的来源,以及输入相关性。Block AttnRes 又让同块内来源共享系数,形成另一种结构约束。

此外,混合系数随输入变化,而每个 viv_i 也由前面的计算产生。把所有关系写成矩阵形式,不意味着完整网络突然变成了一个固定线性算子。我认为第 6.2 节提供了有用的设计视角,但普通秩、半可分离秩与文中的有效秩讨论必须分别定义,才能避免由漂亮的矩阵图得出过强的容量结论。

11. 局限:现有证据还不足以回答哪些问题

首先,主要结果来自一类混合 MoE 架构。它没有直接证明同样收益会出现在任意 dense decoder、不同优化器、不同后训练目标或极深网络中。大模型采用九块,小规模研究约八块;主训练 4K 上下文,缩放训练 8K,系统内存示例 128K。将这些数字保留在各自语境里,才不会拼出一个论文并未实际测试的配置。

其次,表格没有给出随机种子波动和置信区间。任务评估沿用 Kimi Linear 的流程,但这份报告并没有重新列出所有提示模板、解码设置与计分细节。想做严谨比较,需要固定这些条件;若当前文档没有给全,就应承认仅凭这份文档还不能完整重建实验。这个信息缺口不否定结果,却限制了我们对小差异的解释。

第三,低于 2% 的推理开销缺少一张足够完整的工作负载矩阵来界定适用范围。批大小、序列长度、精度、设备、并行布局,以及 prefill 与 decode 的比例,都会影响残差操作占总时间的比例。这个结果令人有兴趣继续测试,但不能直接预测另一个服务的尾延迟或吞吐,更不能从理论读写量推断所有机器的时间收益。

第四,分块仍然会丢信息。来源预算固定意味着某些层间差异被压缩掉;更大的模型也可能拥有不同的历史使用模式。因此八块左右有效,是一个值得利用的经验起点,而不是长期稳定的最优常数。学习边界、使用不等长块或者保留少量例外来源,都可能改善表达,但它们同时会增加调度和训练的复杂度。

最后,token 平均热图会隐藏请求、任务和位置之间的变化。词嵌入长期获得权重,可能意味着原始信息有用,也可能是某种 attention sink,或者只是稳定的路由偏好。单看颜色无法在这些解释中作决定。真正更接近因果的证据,是干预一个来源,再测量损失、输出和各项任务的变化。

12. 独立批判性分析:我会怎样继续推进这项研究

先拆开“归一化平均”和“内容选择”。 零查询初始化已经把求和改成平均。一个更有解释力的对照,应包括标准残差、尺度匹配的固定平均、可学习静态混合和内容相关混合,并尽量保持归一化位置、存储来源和优化机会相当。这样才有机会识别收益中有多少来自更平稳的尺度,有多少来自确实选中了更合适的历史。

这个实验也要避免新的混淆。例如为了保留单位权重残差的幅值而乘一个随来源数变化的因子,会进一步影响梯度;只匹配某层的输出范数,还不代表整个训练轨迹相同。因此需要在设计阶段明确究竟控制哪些变量,并同时记录损失与幅值变化。把控制条件说清楚,比直接给所有变化统称“信息流更好”更有用。

把几个理论说法改写成可检查的定义。 N=1N=1 是否严格恢复残差、复杂度何时可以写成 O(N2)O(N^2)、矩阵秩究竟度量什么,都会影响后续读者如何使用这项方法。我会直接列出每一步来源集合,保留 O(LNd)O(LNd) 的一般算术量,并给跨深度切分的非对角秩下定义。这样做并不会削弱实验收益,反而让设计依据更清楚。

对于全量与分块的关系,还可以加入一个明确的反例和一个充分条件:前面二维抵消例子说明一般情况下不等价;如果同块内所有全量系数恰好相同,而且块打分与归一化质量也相应匹配,才可能在那个输入上复现同样的贡献。后一个条件很强,不应被当成普遍事实。把“某些输入可近似”和“架构严格等价”分开,有助于解释为何少量摘要能保留大部分收益,却仍留有质量差距。

直接测量块摘要的瓶颈。 只比较 Full 与 Block 的最终损失,看不出信息在哪里丢失。我会统计块内抵消程度、不同任务的来源重要性,以及删除某块或换成同范数向量后造成的损失变化。在保存相同数量摘要的前提下,对比固定边界、按 attention/MLP 类型对齐的边界和可学习边界。如果更合理的边界就能缩小很大一部分差距,可能无需增加缓存容量。

这里还值得观察是否存在少量“关键独立来源”。比如绝大多数层可以按块求和,而某个早期输出需要长期单独保留。一个固定额外槽位的设计,可能比让所有块都变小更省。但这只是待测试的改进方向;来源选择必须在训练和推理中一致,额外槽位的更新规则也需要计算成本分析。

把动态查询放回质量与延迟曲线上比较。 动态查询在表 4 中损失最低,只是失去了当前固定查询的批处理优势。它不必被简单归入“不实用”。可以把动态 Full、固定 Full 和固定 Block 放在同一内存限制下,比较不同批大小的 prefill、decode、吞吐,以及达到同一验证损失的训练时间。离线任务与交互服务对延迟的权重不同,最佳方案也可能不同。

这种比较还应报告真实峰值内存,而不只是历史摘要的容量。某种方案少保存了摘要,却增加较大的临时矩阵或通信缓冲,就可能在峰值上失去优势。同样,若一个优化主要降低大批量吞吐成本,就不能用它代替小批量逐 token 延迟的结论。系统评估的对象应该是一组具体工作负载,而不是一个抽象的“推理速度”。

验证远处历史是否具有因果作用。 滑动窗口对照说明只保留最近输出不够,但并没有定位哪些远处来源有用。可在冻结模型上屏蔽某些历史来源,与移除相同注意力质量、相近源范数的随机屏蔽做比较;再对选定结构重新训练,区分即时依赖与重新适应后的能力。这里提出的是后续实验,并不是本笔记已经执行的模型实验。

给接近的比较补上不确定性。 241M 处 mHC(-lite) 为 1.869,Full 为 1.874,其他规模的顺序又不完全相同。直接说 Full 始终优于 mHC 超出了表格支持范围。多种子重复这些接近的设置,比仅增加更多单次排名更有信息。同理,MMLU-Pro 应保留为显示精度下的持平,不能把没有显示出来的小数当成确定胜负。

如果我要据此设计一轮研究,首先会固定数学架构和层数口径,然后列清训练配方、数据范围与硬件条件。能用小型确定性计算先确认的内容包括:softmax 公共平移不变性、两组来源的稳定合并、首层不加入空部分和,以及通信公式在 V=1V=1 时的退化关系。它们确认的是解释和公式的内部一致性,不是模型训练质量已经被复现。

13. 结论

Attention Residuals 让我重新注意到一件被默认设置掩盖的事:层与层之间如何组合历史,本身也是模型设计。Full AttnRes 把每个历史输出变成可按内容检索的对象;Block AttnRes 用更少的摘要换取可承受的存储与通信;固定伪查询则让历史部分可以提前批量计算。系统部分并非附带优化,因为如果没有它,激活流量可能抵消这个参数很轻的改动带来的吸引力。

这篇论文给出的结果支持在其模型家族中继续探索这条路线。我最想保留的思路是同时考虑“保存了哪些信息”和“取这些信息要花多少钱”:摘要决定后来还能恢复什么,调度决定恢复一次有多贵。接下来的研究需要更清楚地区分尺度控制与内容选择,测量分块丢失的信息,并把质量提升放回具体训练和服务条件下判断。

参考来源与图表说明

  • Kimi Team,Attention Residuals,arXiv:2603.15031v1,2026-03-16。本文的论文公式、实验数值和系统账本均指向此版本;完整作者与贡献顺序见附录 A,Full AttnRes 的 I/O 推导见附录 B。
  • 论文提供的官方项目入口。
  • 九张图均为原创解释图,或依据明确标注的论文数值重新绘制。假设向量、来源计数、通信与容量估算均有说明,没有把它们写成模型实测。原论文采用 CC BY-NC-ND 4.0;本笔记没有复制或修改原论文图像。
  • 文中的数学例子和表格复算是独立解释性计算;没有声称完成模型训练、作者实验或生产环境延迟的独立复现。