注意力残差
引子
论文地址:https://arxiv.org/abs/2603.15031
Attention Residuals 就是参考 Attention 的思想来解决 Residual 的问题。
FFN 和 Attention
FFN
FFN(Feed-Forward Network)和 Attention 都是深度学习中的重要概念。
FFN 是一种常见的神经网络结构,它由多个全连接层组成,这些全连接层之间通过激活函数进行连接。FFN 的主要作用是进行特征提取,将输入数据映射到输出空间。
深入 FFN 内部会发现,这种模型就是矩阵乘法和激活函数的组合。前馈神经网络(FFN)非常适合处理没有状态的问题,如图片识别问题,模型不需要关注输入数据的历史信息,只需要关注当前输入数据。
提示
在工程中,图片识别大部分使用的都是更复杂的卷积神经网络。
但聊天机器人显然是有状态的,需要考虑输入数据历史信息。这个问题 FFN 无法解决,因此引入了 Attention。
Attention
Attention 是一种机制,它可以帮助模型在处理输入数据时,根据输入数据的不同部分,分配不同的权重,从而实现对输入数据的关注。
注意力机制会计算输入对每一个 embedding 的权重,然后根据权重对 embedding 进行加权求和,得到一个表示输入的向量,术语为 Contextualized embedding。
将 Contextualized embedding 输入到 FFN 中,得到一个表示输入的向量, 于是模型就有了处理上下文的能力。
Residual
模型训练时,参数调整时是由输出位置一层一层地向输入位置进行调整的,而没经过一次调整,幅度都会变小,所有叠加层数越多,越靠近输入位置的参数调整幅度越小,乃至无法调整。
而输入位置往往是更重要的,结果就是层数太少模型无法理解复杂逻辑,层数太多时重要的层又训练不动,参数基本不变,这就是梯度消失。
提示
梯度:可以理解为参数的变化幅度。
引入 Residual 层,可以解决梯度消失的问题。此时,模型输出的结果是前面层的结果加上当前层的结果,所有层都对输出结果有或直接或间接的贡献。训练时,就一定会有一部分梯度传递到前面的层,这样,梯度不会因为层数过少而消失。
像这样不断在输出前不断加上前面各层输出的操作,称为残差连接(Residial Connections)。这就是大语言模型的基本范式。例如 DeepSeek 将 FFN 替换成了 MoE,千问将 Attention 替换成了 GQA 等一系列变体。
残差的问题
- 数值膨胀
残差连接中,每一层的输入就是前面所有层的输出,如果该层需要对输入有所效果,就需要一个同样量级的输出,于是下一层的输入也会随之变得更大。对于整个链条最后的输出在训练时数值变化可能就特别的剧烈了,这就造成了训练的不稳定。
- 信息稀释
残差连接中,每一层的输入都包含了前面所有层的信息,而该层很难细微区分前面所有层的贡献,只能针对这个大杂烩做总体的调整。这其实和我们增加模型层数的目的是有点背道而驰的。我们增加层数,是希望每层都对资料做些有针对的加工。虽然我们无法精确控制每一层的用途,但我们至少希望每一层的功能是有所侧重的,而不是处理一片混沌。
Attention Residuals
借用 Attention 寻找字与字之间关联的方法,Kimi 用相同的思路寻找层与层之间的关联。
去掉相加的部分,给每个层分配一个伪查询向量 pseudo query,这个向量是模型参数的一部分,在训练时会被调整。于是当前层的输入就不是简单的将前面的输出都加起来,而是用当前层的伪查询向量和前面每一层的伪查询向量做一次点积,点积结果是一个标量,代表当前层对前面每一层输出的关注度,数值越大,越关注该层。然后使用 Softmax 函数将结果归一化(和为1)得到百分比关注度,将关注度乘以输出并累加就得到了当前层的输入了。
由于归一化后关注度和为1,对前面层输出的加权求和与输出在同一个数量级,这就解决了数值膨胀的问题。
又因为在输入到当前层之前乘以了 attention 权重,对之前的输出就有所侧重。
Attention Residuals 的问题和优化
Attention Residuals 的最大问题就是开销,因为Attention Residuals 需要对前面每一个层做点积、softmax 和加权求和。这要求我们保存和读取前面每一层的输出,这对显存大小和读取的带宽都带来非常大的挑战。
作者的方案是分块。每若干层作为一个块,块内使用普通的残差连接,块与块之间使用 Attention Residuals,通过这种局部大杂烩,全局精细提取的方式,在精度和开销之间找到平衡点。