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. 退化问题:让深层网络至少不比浅层网络差,因为恒等映射更容易学。
  2. 梯度消失:梯度可以通过恒等分支直接回传,不再逐层衰减。
  3. 梯度爆炸:恒等分支的梯度为1,不会放大梯度,反而起到稳定作用。

嗯,说白了,残差连接就是给深度网络装了一个“安全气囊”。不管网络多深,信息都能顺畅流动,梯度都能稳定回传。

下一章,我们来聊聊LayerNorm。它和残差连接是Transformer中的“黄金搭档”,缺一不可。