18

残差连接——为什么要把输入加回去

阅读约 4 分钟第 18/60 课

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——为什么每个模块之前都要做一次归一化。