深度学习知识查漏补缺
梯度消失和梯度爆炸
梯度消失(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)
现象
- 在深层网络中,靠近输入层(浅层)的参数几乎不更新,而靠近输出层的参数更新正常。
- 模型看起来在训练,但实际上前几层只是在做随机特征提取,导致整体模型无法收敛或性能很差。
主要原因
- 激活函数选择不当:使用了 Sigmoid
或 Tanh 函数。
- Sigmoid 的导数最大值只有 0.25。当网络很深时,多个小于 0.25 的数相乘,梯度会以指数级衰减。
- 网络太深:层数越多,连乘链条越长,衰减越严重。
解决方法
- 更换激活函数:使用 ReLU (Rectified Linear Unit) 及其变体(Leaky ReLU)。ReLU 在正区间的导数恒为 1,解决了连乘导致的衰减问题。
- Batch Normalization (BN):通过规范化每一层的输入,强行将数据拉回到激活函数的敏感区间,防止梯度变小。
- 残差结构 (ResNet):引入 “Shortcut Connection”(捷径),让梯度可以通过“高速公路”直接传到浅层,不再完全依赖层层相乘。
3. 梯度爆炸 (Gradient Exploding)
现象
- Loss 震荡:损失函数(Loss)忽大忽小,甚至变成
NaN(非数字)。 - 权重剧变:模型参数更新幅度过大,直接飞出合理范围。
- 多见于 RNN (循环神经网络) 处理长序列数据时。
主要原因
- 权重初始化过大:初始参数值太大,导致每一层的输出和梯度都成倍放大。
- 网络结构问题:在 RNN 中,同一个权重矩阵在时间步上被反复相乘,极易导致数值溢出。
解决方法
- 梯度裁剪 (Gradient Clipping):简单粗暴但有效。如果梯度的范数(Norm)超过某个阈值(比如 5),就强行把它截断(缩放)到这个阈值以内。
- 改善权重初始化:使用 Xavier 或 He Initialization,根据每层的神经元数量科学地设置初始权重的范围。
- 使用 LSTM/GRU:在处理序列数据时,LSTM 通过“门控机制”专门设计了梯度的传输通道,缓解了长序列中的梯度问题。
总结对比
| 特性 | 梯度消失 (Vanishing) | 梯度爆炸 (Exploding) |
|---|---|---|
| 本质 | 连乘项 < 1,梯度趋近于 0 | 连乘项 > 1,梯度趋近于无穷 |
| 后果 | 浅层参数不更新,模型学不到东西 | 权重数值溢出 (NaN),无法收敛 |
| 高发场景 | 深层网络 (Deep CNN/MLP),使用 Sigmoid | 循环神经网络 (RNN),深层网络 |
| 核心解法 | ReLU, BatchNorm, ResNet | Gradient Clipping, 权重正则化 |