梯度爆炸和梯度消失是深度神经网络训练中的两大核心障碍,尤其在循环神经网络(RNN)和很深的前馈网络中尤为突出。
要缓解这两个问题,需要从模型结构设计、权重初始化、归一化策略、激活函数选择以及优化器与梯度裁剪等多个维度协同入手。
以下是系统性的解决方案:
如果初始权重过大,前向传播信号会迅速增大,反向传播梯度会爆炸;如果初始权重过小,信号和梯度则会消失。
$$W \sim U\left(-\frac{\sqrt{6}}{\sqrt{n_{in}+n_{out}}}, \frac{\sqrt{6}}{\sqrt{n_{in}+n_{out}}}\right)$$
$$W \sim N\left(0, \sqrt{\frac{2}{n_{in}}}\right)$$
这是处理梯度爆炸最直接、最有效的技术。当梯度的范数超过设定的阈值时,强制将其缩放到阈值大小,防止参数更新步长过大。
在 PyTorch 中,通常实现为 clip_grad_norm_:
import torch
# 在 loss.backward() 之后,optimizer.step() 之前调用
torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm=1.0)
传统网络是逐层传递的,梯度在传递过程中会不断连乘。如果给梯度开辟一条"高速公路",就能有效缓解消失。
由 ResNet 提出,是解决深层网络梯度消失的里程碑技术。
$$H(x) = F(x) + x$$
即使 $F(x)$ 的梯度很小,输入 $x$ 的梯度也能通过捷径(Shortcut)无损地传回前层。这使得训练几百层甚至上千层的网络成为可能。
如 DenseNet,将前面所有层的输出直接连接到后面层,最大程度地促进梯度流动和特征复用。
LSTM(长短期记忆网络) 和 GRU(门控循环单元) 通过输入门、遗忘门和输出门控制信息的流动。门控机制使得网络可以学习何时"记住"或"忘记"信息,有效避免了 RNN 在长序列上训练时的梯度消失问题。现代 Transformer 架构也普遍使用门控(如 GLU 变体)。
归一化层能让每一层输入数据的分布保持稳定,避免落入激活函数的饱和区(导致梯度消失)或数值过大(导致爆炸)。
传统的 Sigmoid 和 Tanh 在输入值很大或很小时,导数趋近于 0,容易引起梯度消失。
在 Transformer 和大模型中广泛使用,比 ReLU 更平滑,允许较小的负梯度流通。
Adam/AdamW、RMSProp 会针对每个参数自动调整学习率。即使某些参数的梯度很大(爆炸风险)或很小(消失风险),优化器也会通过除以历史梯度的二阶矩(方差)来平衡更新步长。
| 问题场景 | 推荐策略 | 优先级 |
|---|---|---|
| 训练 RNN/LSTM | 梯度裁剪 + LSTM门控机制 | 极高 |
| 训练深层 CNN(>50层) | 残差连接 + He 初始化 + 批归一化 | 极高 |
| 训练 Transformer | 层归一化 + 残差连接 + AdamW + Warmup | 极高 |
| 出现 Loss 变为 NaN | 梯度裁剪 + 降低学习率 + 检查权重初始化 | 极高 |
| 浅层网络几乎不更新 | 残差连接 + 换用 ReLU/Leaky ReLU | 高 |
| GAN 训练不稳定 | 梯度裁剪 + 谱归一化 | 中 |
通用且优先检查的三件事:
评论专区
评论加载中...登录后即可发表评论