Exploding Gradient
梯度爆炸会在反向传播过程中呈指数级增长,导致权重更新幅度过大、损失激增和 NaN 值。涵盖原因、迹象和解决方法。
梯度爆炸是一种训练故障:在梯度通过深层或循环神经网络向后传播时,反向传播计算出的梯度会呈指数级增长。梯度下降随后会对模型权重执行巨大的更新,损失函数会突然飙升,或变成 NaN 或 inf,导致训练发散。这与梯度消失问题正好相反。Pascanu、Mikolov 和 Bengio分析了循环神经网络中的这两种问题,并提出通过梯度范数裁剪来处理梯度爆炸;如今,这仍是深度学习训练中的标准保护措施。
梯度为何会爆炸#
根据链式法则,到达早期层的梯度是所有后续层中每个因子的乘积;对于循环网络,则是每个时间步中因子的乘积。如果这些因子始终大于 1,乘积就会随着网络深度呈指数级增长:因子 1.5 重复 30 层,会使信号放大约 190,000 倍。常见诱因包括权重初始化不当、过高的学习率、未归一化的输入、循环模型中的长序列,以及混合精度训练中的溢出;在这种情况下,超过 65,504 的 FP16 值会变成 inf。典型迹象包括损失曲线突然飙升或变成 NaN、梯度范数日志中的数值在几个步骤间增长数个数量级,以及权重变成 NaN。
预防与缓解#
大多数现代训练流水线会结合使用其中几种防护措施。
- 梯度裁剪:当所有梯度的全局 L2 范数超过阈值时,会按相同的比例缩小每个梯度。更新方向保持不变,只有长度会受到限制。
- 批归一化:批归一化和层归一化会重新缩放每一层的激活值,使信号在各层之间保持稳定的尺度,并让损失曲面更加平滑。
- 谨慎初始化:Xavier (Glorot) 和 He 初始化会缩放初始权重,使激活值方差在各层之间大致保持不变。
- 残差连接:跳跃连接为梯度提供一条绕过各个模块的恒等路径,因此反向信号是多条路径的和,而不是单个长乘积。
- 学习率预热:先从较小的学习率开始,并在最初几个步骤中逐渐提高,可避免权重和优化器统计量尚未稳定时出现巨大的早期更新。
下面的代码片段构建了一个 30 层的堆栈,每层都会将输入放大 1.5 倍,然后使用 PyTorch 对得到的梯度进行裁剪:
import torch
from torch import nn
torch.manual_seed(0)
# 30 stacked linear layers, each initialized to amplify its input by 1.5x
layers = [nn.Linear(64, 64, bias=False) for _ in range(30)]
for layer in layers:
nn.init.orthogonal_(layer.weight, gain=1.5)
model = nn.Sequential(*layers)
loss = model(torch.randn(8, 64)).pow(2).mean()
loss.backward()
# clip_grad_norm_ rescales all gradients in place and returns their norm before clipping
norm_before = nn.utils.clip_grad_norm_(model.parameters(), max_norm=1.0)
norm_after = nn.utils.get_total_norm([p.grad for p in model.parameters()])
print(f"Gradient norm before clipping: {norm_before:.2e}, after: {norm_after:.2f}")原始梯度范数为 9.90e+10,裁剪后为 1.00,因此无论原始梯度有多大,下一次优化器更新都不会超出限制。
Ultralytics YOLO26训练会在每一步执行这项保护措施:训练器会对混合精度梯度进行反缩放,将其全局范数裁剪到 10.0,并让梯度缩放器跳过仍包含 inf 或 NaN 值的任何更新。自定义训练器可以修改这一限制,例如将 RT-DETR 的阈值收紧到 0.1。
梯度爆炸与梯度消失#
这两个问题都源于反向传播中各层因子的乘积。大于 1 的因子会导致梯度爆炸,产生不稳定的更新、数值溢出和训练发散,通常通过裁剪来解决。小于 1 的因子会使梯度趋近于零,导致早期层停止学习,通常的解决方法是使用 ReLU 等非饱和激活函数、残差连接,以及 LSTM 等门控循环单元。归一化和谨慎初始化有助于同时缓解这两种问题。
实际应用#
大型语言模型会在长文本序列上训练数十万步,期间损失突然飙升是一种已知风险,因此它们的训练方案会使用梯度裁剪:GPT-3使用 Adam 训练,并将全局梯度范数裁剪到 1.0。
在计算机视觉中,深度目标检测网络会在 COCO规模的数据集上以较高学习率和混合精度进行训练,因此梯度裁剪和损失缩放有助于避免罕见的极端批次破坏权重。基于 Transformer 的检测器更为敏感,因为梯度在经过解码器交叉注意力时可能会飙升,因此 RT-DETR 和 DINO 等 DETR 系列模型通常将最大范数裁剪到 0.1。










