2、残差连接的数学原理:恒等映射、残差块公式推导、前向传播与反向传播中的优势
好,咱们进入正题。残差连接,说白了就是给网络开了一条「高速公路」。我刚开始接触Transformer时,第一反应是:这不就是个跳跃连接吗?后来深入源码才发现,里面的数学设计其实非常精巧。
2.1 恒等映射:为什么需要它?
先问一个问题:一个深层网络,层数越多,效果一定越好吗?
答案是否定的。你想想看,如果网络已经学到了最优解,再堆几层,理论上至少应该保持原有性能吧?但实际训练中,深层网络反而会出现退化问题——训练误差不降反升。这不是过拟合,而是优化困难。
恒等映射(Identity Mapping)就是解决这个问题的关键。它的数学形式很简单:
y = x
输入是什么,输出就是什么。但别小看这个「什么都不做」的操作。在残差块中,它让网络可以选择「跳过」某些层。
核心思想:如果某层学到的变换是冗余的,网络可以通过残差连接直接绕过它,保留有用的信息。
我在项目中遇到过这样的情况:训练一个12层的Transformer,不加残差连接时,第8层之后的梯度几乎全消失了。加上残差连接后,梯度能顺畅地流到第1层。嗯,这就是恒等映射的威力。
2.2 残差块公式推导
残差块的定义其实就一行公式。咱们从数学上拆解一下。
假设我们有一个子层(比如Self-Attention或FFN),它的功能可以表示为函数 F(x)。传统的做法是直接输出 F(x)。残差块的做法是:
output = F(x) + x
这里的 x 就是恒等映射。整个残差块可以写成:
y = F(x, {W_i}) + x
其中 {W_i} 是子层中的可学习参数。如果 F(x) 和 x 的维度不一致,我们还需要一个线性投影 W_s 来对齐维度:
y = F(x, {W_i}) + W_s * x
但在Transformer中,通常通过LayerNorm和适当的维度设计,让 F(x) 和 x 的维度保持一致,所以直接用加法就行。
我的习惯:在实现时,我会先检查输入输出的shape是否一致。如果不一致,加一个线性投影层。但大多数情况下,保持维度一致更省事。
2.3 前向传播中的优势
前向传播时,残差连接的好处非常直观。信息可以从底层直接传到高层,中间经过多少层都不影响。
举个例子,假设网络有L层,每一层都包含一个子层 F_l 和残差连接。那么第L层的输出可以写成:
x_L = x_1 + Σ(F_l(x_l)) (l从1到L-1)
看到了吗?底层的特征 x_1 直接出现在了顶层。这意味着网络可以轻松地「记住」底层的信息,而不需要经过层层变换。
为什么会这样?因为加法操作不会丢失信息。你想想看,如果不用残差连接,每一层都是非线性变换,信息会被不断压缩和扭曲。有了残差连接,原始信息始终有一条直达路径。
关键点:残差连接让网络可以「选择性学习」。如果某层学不到有用的东西,它可以直接输出恒等映射,不影响整体性能。
2.4 反向传播中的优势
反向传播才是残差连接真正大显身手的地方。咱们来推导一下梯度。
假设损失函数是 E,第L层的输出是 x_L。根据链式法则,损失对第l层输入的梯度为:
∂E/∂x_l = ∂E/∂x_L * (1 + ∂/∂x_l Σ(F_k(x_k))) (k从l到L-1)
这个公式里最关键的,就是那个 1。它来自恒等映射的梯度,保证了梯度可以直接从顶层流到底层,不会消失。
如果没有这个 1,梯度就是一堆连乘的雅可比矩阵。层数一深,这些矩阵的乘积要么趋近于0(梯度消失),要么爆炸(梯度爆炸)。
我曾经踩过的坑:有一次我尝试去掉残差连接,只保留LayerNorm,结果训练到第5个epoch梯度就全消失了。后来加上残差连接,同样的模型结构,训练稳定多了。所以,残差连接不是锦上添花,而是必需品。
2.5 残差连接在Transformer中的具体实现
在Transformer中,残差连接通常和LayerNorm配合使用。标准的实现是:
# 伪代码
def transformer_block(x):
# Self-Attention子层
attn_output = self_attention(LayerNorm(x))
x = x + attn_output # 残差连接
# FFN子层
ffn_output = FFN(LayerNorm(x))
x = x + ffn_output # 残差连接
return x
注意这里的顺序:先LayerNorm,再子层,最后残差连接。这叫「Pre-LN」结构。还有一种「Post-LN」结构,顺序是子层、残差连接、LayerNorm。我个人习惯用Pre-LN,训练更稳定。
| 结构 | 顺序 | 特点 |
|---|---|---|
| Pre-LN | LN → 子层 → 残差 | 训练稳定,梯度更平滑 |
| Post-LN | 子层 → 残差 → LN | 原始论文中的设计,需要warmup |
我的建议:新手直接用Pre-LN。Post-LN虽然理论上更优雅,但实际训练中需要精细调整学习率和warmup步数,容易翻车。
2.6 小结
残差连接的数学原理,说白了就是两句话:
- 前向传播:信息可以通过恒等映射直达高层,避免信息丢失。
- 反向传播:梯度可以通过恒等映射直达底层,避免梯度消失。
这个设计看似简单,但它是深度学习历史上最重要的创新之一。没有残差连接,就不会有今天的Transformer、ResNet这些深层网络架构。
下一节,咱们会深入LayerNorm的数学原理。你会发现,LayerNorm和残差连接是天生一对,配合起来效果出奇的好。