省下1.25倍算力!Kimi这篇论文,可能改写所有大模型的训练方式

图片

大模型越做越大,层数越堆越多。

但有一个问题一直没人正面解决:堆得越深,后面的层越来越不管用。

Kimi刚刚发了一篇论文,把这个问题挖出来,给出了解法,在自家48B大模型上验证有效,所有测试任务全部提升。

图片

论文代码已开源:

https://github.com/MoonshotAI/Attention-Residuals

先说问题是什么

现在所有主流大模型,内部都有一个叫残差连接的东西。

它的工作方式非常简单:每一层处理完信息之后,把处理结果和原来的输入加在一起,传给下一层。

2015年被何凯明大神用在图像识别里大放异彩,之后就成了所有深度学习模型的标配,一直用到今天。

它解决了一个重要问题:让梯度能顺畅地往回传,使得几百层的深度网络可以被训练起来。

但它有一个隐藏的毛病,长期以来没被重视。

每一层做完累加之后,信息就被压进了一个混合状态里。越往后,这个混合状态就越臃肿,前面所有层的内容都混在里面,权重还完全一样。

后面的层没有办法说:我现在需要的是第5层的信息,不是第12层的。 它只能接收一锅乱炖。

这带来了一个实际后果:

随着网络越来越深,这个混合状态的数值会越来越大。后面的层想要让自己的输出还能有影响力,就必须学习输出更大的数值,才能在这个越来越大的池子里不被淹没。

研究人员把这个问题叫做 PreNorm稀释——越深的层,贡献越被稀释。实验证明,一个很深的模型里,删掉相当多的层,效果几乎不变。大量层形同虚设。


Kimi的解法:让每一层自己选择听谁的

Kimi的思路其实很直觉:

既然问题是每层只能接收一个乱炖的混合状态,那就不要混了,让每层自己去选。

他们提出的方案叫Attention Residuals(AttnRes),中文可以理解为注意力残差。

图片

原来的做法:每一层 = 前面所有层的输出,等权加在一起

新的做法:每一层 = 前面所有层的输出,按需加权求和,权重由这一层自己学

关键是这个权重怎么来的——用的是大家已经熟悉的注意力机制,就是Transformer里让模型决定关注哪些词的那个机制。只不过这里不是关注哪些词,而是关注哪些层。

每一层有一个自己专属的小向量(只有一个,极其轻量),用它去跟前面所有层的输出算相似度,相似度高的层权重就大,相似度低的权重就小,最后加权求和。

这样,注意力层和MLP层可以关注不同的历史层,早期层的信息不会被淹没,可以按需取用。

整个改动增加的参数量,相比几十亿参数的大模型来说,可以忽略不计。


但有个工程问题需要解决

这个方案理论上很美,工程上有个麻烦。

每一层要关注前面所有层的输出,就必须把前面所有层的输出都存着。

对于一个几十层的小模型,这没问题。

但现代大模型动辄上百层,训练时还会把模型切成很多份分布到不同的机器上(叫流水线并行),每台机器都要维护所有层的输出,机器之间还要传来传去——内存压力和通信压力都会暴增。


Block AttnRes:一个工程上的聪明妥协

Kimi的解法是:不用存每一层,改为存每一组。

把所有层分成若干个块(block),每个块内部还是用传统方式累加,但把整个块压缩成一个向量存起来。跨块之间,再用注意力机制选择。

这样存储量从正比于层数,变成正比于块数。

实验发现,分成大约8块就能恢复Full AttnRes绝大部分的效果,而内存和通信开销只是原来的一小部分。

训练额外开销边际,推理延迟额外增加不到2%。


实验结果:提升是实实在在的

Kimi用五个不同大小的模型做了Scaling Law实验,覆盖从小到大的算力范围。

结论是:Block AttnRes在每个规模下都比基线表现更好,相当于用同等性能,只需要基线0.8倍的算力(反过来说,同等算力能多训练1.25倍)。

图片

在48B大模型上用1.4T tokens完整预训练后,测了十几个benchmark,AttnRes版本全部高于基线,没有一个跌分。

提升最明显的是需要多步推理的任务:

  • • GPQA-Diamond(科学推理):+7.5分
  • • Math(数学):+3.6分
  • • HumanEval(代码生成):+3.1分

知识类任务也有稳定提升,只是幅度小一些。

Kimi的解释是:深度方向的信息流改善后,后面的层可以有选择地调用前面某层的中间结果,这对需要多步推理的任务帮助最大。


训练过程中发生了什么变化

对比两个模型的训练动态,能看到三个明显变化。

第一,验证损失。 AttnRes从一开始就比基线低,差距在训练后期越来越大。

第二,每层的输出大小。 基线模型里,随着层数加深,每层输出的数值越来越大,到后面已经很夸张——这正是前面说的稀释问题的体现。AttnRes里,这种增长被限制在块内,块边界处会重置,整体保持在一个稳定范围内。

第三,梯度分布。 基线模型里,最早的几层梯度异常地大,其他层相对很小,整个模型各层受到的训练信号很不均匀。AttnRes的各层梯度分布明显更均匀,每一层都在被有效地训练。

图片

模型学到了什么

Kimi还可视化了训练好的模型,看看每一层实际上在关注哪些前驱层。

结论挺有意思:

大多数层还是主要关注自己的直接前驱(局部性被保留),但会出现一些有规律的跳跃——比如某些层会专门关注最早的嵌入层,或者跳过中间很多层,回溯到某个特定的早期层。

注意力层和MLP层的关注模式也不一样:MLP层更依赖近期的表示,注意力层的感受野更宽。

这些都不是人工设定的,是模型自己学出来的。


这件事的意义

残差连接在过去十年成为所有深度学习模型的基础组件,用了这么久几乎没有根本性的改动。

AttnRes第一次在这个层面上动了真格,用注意力机制替换了固定的均匀累加,让深度方向的信息聚合变得可学习、可选择。

改动本身足够轻量,可以直接替换进现有架构,不需要改变其他任何东西。

代码已开源,感兴趣的可以直接去看:

https://github.com/MoonshotAI/Attention-Residuals