深度学习知识查漏补缺

梯度消失和梯度爆炸

梯度消失(Gradient Vanishing)和梯度爆炸(Gradient Exploding)是深度学习(尤其是深度神经网络和循环神经网络 RNN)训练中常见的两个核心问题。它们都会导致模型无法有效训练,但表现形式相反。

简单来说,这两个问题都源于反向传播(Backpropagation)*中的*连乘效应


1. 核心机制:为什么会出现这个问题?

在神经网络中,我们通过反向传播算法来更新参数。为了计算靠近输入层(浅层)参数的梯度,需要利用链式法则(Chain Rule),将后面所有层的梯度乘起来。

$$\frac{\partial Loss}{\partial w_1} = \frac{\partial Loss}{\partial y} \cdot \frac{\partial y}{\partial h_n} \cdot ... \cdot \frac{\partial h_2}{\partial h_1} \cdot \frac{\partial h_1}{\partial w_1}$$

想象你有一长串数字相乘:

  • 梯度消失:如果这些数字大部分都小于 1(例如 0.9),乘得越多,结果越接近 0
  • 梯度爆炸:如果这些数字大部分都大于 1(例如 1.1),乘得越多,结果就会趋向 无穷大

2. 梯度消失 (Gradient Vanishing)

现象

  • 在深层网络中,靠近输入层(浅层)的参数几乎不更新,而靠近输出层的参数更新正常。
  • 模型看起来在训练,但实际上前几层只是在做随机特征提取,导致整体模型无法收敛或性能很差。

主要原因

  1. 激活函数选择不当:使用了 SigmoidTanh 函数。
    • Sigmoid 的导数最大值只有 0.25。当网络很深时,多个小于 0.25 的数相乘,梯度会以指数级衰减。
  2. 网络太深:层数越多,连乘链条越长,衰减越严重。

解决方法

  • 更换激活函数:使用 ReLU (Rectified Linear Unit) 及其变体(Leaky ReLU)。ReLU 在正区间的导数恒为 1,解决了连乘导致的衰减问题。
  • Batch Normalization (BN):通过规范化每一层的输入,强行将数据拉回到激活函数的敏感区间,防止梯度变小。
  • 残差结构 (ResNet):引入 “Shortcut Connection”(捷径),让梯度可以通过“高速公路”直接传到浅层,不再完全依赖层层相乘。

3. 梯度爆炸 (Gradient Exploding)

现象

  • Loss 震荡:损失函数(Loss)忽大忽小,甚至变成 NaN(非数字)。
  • 权重剧变:模型参数更新幅度过大,直接飞出合理范围。
  • 多见于 RNN (循环神经网络) 处理长序列数据时。

主要原因

  1. 权重初始化过大:初始参数值太大,导致每一层的输出和梯度都成倍放大。
  2. 网络结构问题:在 RNN 中,同一个权重矩阵在时间步上被反复相乘,极易导致数值溢出。

解决方法

  • 梯度裁剪 (Gradient Clipping):简单粗暴但有效。如果梯度的范数(Norm)超过某个阈值(比如 5),就强行把它截断(缩放)到这个阈值以内。
  • 改善权重初始化:使用 XavierHe Initialization,根据每层的神经元数量科学地设置初始权重的范围。
  • 使用 LSTM/GRU:在处理序列数据时,LSTM 通过“门控机制”专门设计了梯度的传输通道,缓解了长序列中的梯度问题。

总结对比

特性 梯度消失 (Vanishing) 梯度爆炸 (Exploding)
本质 连乘项 < 1,梯度趋近于 0 连乘项 > 1,梯度趋近于无穷
后果 浅层参数不更新,模型学不到东西 权重数值溢出 (NaN),无法收敛
高发场景 深层网络 (Deep CNN/MLP),使用 Sigmoid 循环神经网络 (RNN),深层网络
核心解法 ReLU, BatchNorm, ResNet Gradient Clipping, 权重正则化