1、为什么需要残差连接:深度网络中的退化问题、梯度消失与梯度爆炸、残差连接的核心思想
1.1 深度网络到底有多“深”?
先聊个实际感受。我刚开始做Transformer时,第一反应是:这玩意儿层数真多啊。一个标准的Transformer模型,Encoder和Decoder各6层,每层里又有Self-Attention和Feed-Forward两个子层。加起来就是12个模块。
你想想看,12个模块串在一起,数据要流经12次矩阵乘法、12次激活函数、12次归一化。这还没完,实际训练时我们经常堆到12层、24层甚至更多。
那问题来了:层数越多,效果一定越好吗?
嗯,答案可能让你意外——不一定。
1.2 退化问题:层数多了反而更差
我在做图像分类项目时遇到过一件怪事。一个20层的网络,训练集上的loss死活降不下去。换成10层的版本,反而收敛得更快、效果更好。
这就是典型的退化问题(Degradation Problem)。
不是过拟合,不是梯度消失,就是单纯的——网络变深了,性能反而下降了。
核心现象:随着网络深度增加,训练集上的准确率出现饱和甚至下降。这不是过拟合,因为测试集也跟着变差。
为什么会这样?
理论上,深层网络应该至少不比浅层网络差。你想想看,如果我把深层网络后面几层直接训练成恒等映射(输入是什么,输出就是什么),那它至少能跟浅层网络打平。
但现实是,神经网络很难学到恒等映射。SGD优化器在深层网络中,找到的往往不是最优解,而是一个次优的局部极小点。
| 网络深度 | 训练误差 | 测试误差 | 现象 |
|---|---|---|---|
| 10层 | 0.05 | 0.12 | 正常收敛 |
| 20层 | 0.15 | 0.22 | 退化! |
| 30层 | 0.25 | 0.33 | 更严重 |
说白了,网络越深,优化难度越大。这不是理论问题,是工程实践中的真实痛点。
1.3 梯度消失与梯度爆炸:另一个“杀手”
除了退化问题,深层网络还面临两个经典难题:梯度消失和梯度爆炸。
我记得有一次训练一个12层的Transformer,loss死活不降。打印出梯度一看,前面几层的梯度已经小到接近零了。这就是梯度消失。
梯度消失:链式法则求导时,梯度从后往前逐层衰减。如果每层的梯度都小于1,乘上几十次后,前面的层几乎收不到任何更新信号。
梯度爆炸:反过来,如果每层的梯度都大于1,乘上几十次后,梯度变得巨大,参数直接飞掉。
我曾经踩过的坑:训练一个深层LSTM时,没做梯度裁剪,结果loss直接变成NaN。后来检查发现,梯度爆炸把权重炸飞了。从那以后,我养成了每次训练前都检查梯度范数的习惯。
在Transformer中,Self-Attention的计算涉及多个矩阵乘法,梯度流动路径更长。如果没有残差连接,梯度消失几乎是必然的。
1.4 残差连接的核心思想:让梯度“抄近道”
好,问题摆在这了。怎么解决?
2015年,何恺明团队提出了ResNet,核心思想就是残差连接(Residual Connection)。
说白了,就是给网络加一条“高速公路”。
原来的网络:输出 = F(输入)
加了残差连接后:输出 = F(输入) + 输入
就这么简单的一步,效果却出奇的好。
核心公式:output = F(x) + x
其中F(x)是我们要学习的残差映射,x是恒等映射(Identity Mapping)。
为什么有效?我个人的理解是这样的:
- 梯度有了“捷径”:反向传播时,梯度可以直接通过恒等分支流到前面层,不再需要经过所有层的链式求导。这就避免了梯度消失。
- 网络更容易学习恒等映射:如果某一层不需要做什么改变,网络只需要把F(x)学到接近0就行。这比直接学恒等映射容易得多。
- 信息流动更顺畅:前向传播时,输入信息可以直接“跳过”某些层,保留原始特征。
你想想看,这就像修了一条高速公路。原来的路要经过每个小镇(每一层),现在有了高速,可以直接从起点到终点。
1.5 在Transformer中怎么用?
Transformer的每个子层(Self-Attention和Feed-Forward)都用了残差连接。具体形式是:
# 伪代码:Transformer中的残差连接
def sublayer(x, sublayer_fn):
# 先做子层计算,然后加上输入
return x + sublayer_fn(x)
# 实际使用
x = x + self_attention(x) # Self-Attention子层
x = x + feed_forward(x) # Feed-Forward子层
注意,这里每个子层后面还会接一个LayerNorm。这个我们下一章详细讲。
个人习惯:我在实现时,喜欢把残差连接和LayerNorm写在一起,封装成一个子层模块。这样代码更清晰,也方便调试。
1.6 小结:残差连接到底解决了什么?
总结一下,残差连接解决了三个核心问题:
- 退化问题:让深层网络至少不比浅层网络差,因为恒等映射更容易学。
- 梯度消失:梯度可以通过恒等分支直接回传,不再逐层衰减。
- 梯度爆炸:恒等分支的梯度为1,不会放大梯度,反而起到稳定作用。
嗯,说白了,残差连接就是给深度网络装了一个“安全气囊”。不管网络多深,信息都能顺畅流动,梯度都能稳定回传。
下一章,我们来聊聊LayerNorm。它和残差连接是Transformer中的“黄金搭档”,缺一不可。