Vanishing Gradient
反向传播期间,梯度逐层变小,导致梯度消失问题,早期层因此停止学习。介绍其成因和解决方法。
梯度消失问题是指反向传播将损失的梯度传向深层神经网络的前几层时,梯度会随深度呈几何级数缩小,导致最早的层收到的更新过小,无法学习任何内容。某一层的梯度是其上方每一层局部导数的乘积,因此,如果网络的每一层都将梯度缩小到原来的 1 倍以下,输出层与输入层之间的梯度就会相差许多个数量级。Sepp Hochreiter 在 1991 年的毕业论文中分析了这一现象;在更好的激活函数、初始化方法和架构出现之前,它一直让深度前馈网络和循环神经网络(RNN)难以训练。
梯度为何会消失#
反向传播应用链式法则,因此传到某一层的梯度,是上游梯度依次乘以后续各层的权重矩阵和激活函数导数的结果。Sigmoid导数的最大值为 0.25,在输入为 0 时达到该值;当单元在较大的正或负输入下饱和时,导数会趋近于 0。tanh导数的最大值为 1,饱和时也会趋近于 0。因此,在计算权重的影响之前,经过 20 个 sigmoid 层后,梯度最多会乘以 0.25²⁰,即小于 10⁻¹²。Glorot 和 Bengio发现,初始化是造成训练困难的重要原因,并提出根据每层的输入和输出数量来缩放权重方差,使各层的激活值和梯度方差大致保持稳定。
通过比较一个 20 层 sigmoid 网络顶部和底部的权重梯度大小,可以轻松测量这种影响;下面分别给出有无残差捷径的情况:
import torch
torch.manual_seed(0)
x = torch.randn(64, 32)
# The same 20-layer sigmoid network, without and with residual shortcuts
for residual in (False, True):
layers = [torch.nn.Linear(32, 32) for _ in range(20)]
h = x
for layer in layers:
out = torch.sigmoid(layer(h))
h = h + out if residual else out
h.sum().backward()
# Compare the weight-gradient size at the last layer and the first layer
last, first = layers[-1].weight.grad.norm(), layers[0].weight.grad.norm()
print(f"residual={residual}: layer 20 gradient {last:.1e}, layer 1 gradient {first:.1e}")没有捷径连接时,最后一层的梯度范数为 2.5e+02,而第一层为 4.2e-15,小约 17 个数量级,因此第一层的权重实际上从不发生变化。加入残差捷径后,第一层的梯度为 5.6e+01,约为最后一层 2.1e+03 的 1/38。
梯度消失与梯度爆炸#
这两个问题都源于同一种反复相乘的机制。梯度消失会悄无声息地阻碍学习:损失仍会下降,但这是由最后几层推动的,而早期层则停留在接近随机初始化的状态。梯度爆炸则会使梯度按几何级数增长,表现为损失激增和 NaN 值。梯度裁剪会在每次更新前限制梯度爆炸时的范数,但无法影响已经消失的梯度。ReLU 单元输入持续为负、导致梯度恰好为 0 且单元停止学习的情况,则是一个相关问题,称为 ReLU 单元死亡。
如何防止梯度消失#
最常用的修复方法是残差连接,也就是残差网络 (ResNet)的核心恒等捷径。残差块的输出为 x + F(x),因此它对 x 的梯度等于 1 加上 F 的导数,而捷径路径会将上游梯度原样传递。
残差捷径让 ResNet 能够训练超过 100 层的网络,并且几乎出现在所有现代深度架构中,从 Transformer 到 YOLO26 都有应用;YOLO26 的 C3k2 模块包裹着残差瓶颈结构,其标准卷积模块则将批归一化与 SiLU 激活配对使用。
其他方法也可以与残差连接配合使用:
- 非饱和激活函数:ReLU对正输入的导数恰好为 1;Leaky ReLU和 SiLU则能在负输入时也保留非零梯度。
- 缩放初始化: Xavier(Glorot)初始化适用于 tanh 和 sigmoid 层;He 初始化会将权重方差加倍,以补偿 ReLU 将一半输入置零的影响。
- 归一化层:批归一化和层归一化会将激活前的值保持在均值接近 0、方差接近 1 的范围内,避免其落入饱和激活函数的平坦区域。
- 门控循环架构:长短期记忆网络(LSTM)和门控循环单元(GRU)通过门控加法更新来传递状态,而不是反复相乘;原始 LSTM 因此能够跨越超过 1,000 步的时间间隔。










