Transformer 的每一层由两个模块组成:注意力模块和前馈网络模块。每个模块都有一个看似多余的操作:把模块的输入直接加到模块的输出上。
注意力模块的输出 = 注意力(输入) + 输入
前馈网络模块的输出 = 前馈网络(注意力输出) + 注意力输出
这个「加回去」的操作叫残差连接(residual connection),也叫跳跃连接(skip connection)。它解决了一个深度网络训练中的根本问题。
深度越深越难训练
第 02 章节说过,深度带来更强的表达能力。但深度同时带来了一个严重的训练问题。
训练靠反向传播(第 25 章节会详细讲):loss 的梯度从最后一层往前传,逐层传到第一层,每一层根据收到的梯度调整自己的参数。
问题在于,梯度每经过一层,都要乘以那一层的权重矩阵。如果权重矩阵的值普遍小于 1,梯度每过一层就缩小一些,经过 28 层之后几乎衰减为零——前面的层收不到有意义的梯度,参数就不更新了。这叫梯度消失。
反过来,如果权重矩阵的值普遍大于 1,梯度每过一层就放大一些,28 层之后变成一个天文数字——参数被巨幅调整,训练直接崩溃。这叫梯度爆炸。
残差连接怎么解决问题
残差连接提供了一条「高速公路」——信息(无论是前向的数据还是反向的梯度)可以沿着这条路直接跨越整个模块,不经过任何权重矩阵。
数学上看:
输出 = F(输入) + 输入
其中 F 是模块的计算(注意力或前馈网络)。
反向传播时,这个加法的梯度是:
∂输出/∂输入 = ∂F(输入)/∂输入 + 1
注意那个 + 1。无论 F 的梯度多小(接近 0),总梯度至少是 1——因为有一条直达路线。梯度消失被彻底避免了。
这就像一栋 28 层的大楼。如果只有楼梯(没有残差连接),从顶楼到底楼需要走 28 段楼梯,每一段都可能让你迷路或精疲力竭。但如果每层都有一个直通电梯(残差连接),你可以随时跳过中间的楼层直达目的地。
残差连接的另一个好处
除了解决梯度问题,残差连接还有一个好处:每一层只需要学习「增量」。
没有残差连接时,每一层要学习一个完整的变换——从输入到输出的全部映射。有了残差连接之后,每一层只需要学习「在输入的基础上应该加什么」。
输出 = 输入 + ΔF(输入)
ΔF 是增量修正。如果某一层发现当前的表示已经足够好、不需要修改,它可以让 ΔF 接近零——输出约等于输入,信息原样传递。这比让整个层学会「原样传递」容易得多。
这种设计让每一层都可以安全地对表示做微调,而不用担心破坏之前层建立的有用信息。28 层逐层叠加,每层做一点微调,最终的表示就是初始嵌入加上 28 层修正的总和。
在 Sophia 中的位置
Sophia 的每一层结构是:
x → RMSNorm → 注意力 → + x → RMSNorm → 前馈网络 → + (注意力输出)
两个残差连接:一个跨越注意力模块,一个跨越前馈网络模块。RMSNorm 是下一章节的主题。
下一章节来看 RMSNorm——为什么每个模块之前都要做一次归一化。