当神经网络训练期间计算出的梯度变得过大,导致模型权重的不稳定更新时,就会发生梯度爆炸问题。 这个问题在深度网络和循环神经网络 (RNN) 中很常见,在这些网络中,反向传播期间梯度的重复乘法会将小的数值放大到无法控制的大值。 例如,在具有许多层的网络中,如果权重初始化为大于 1 的值,则反向传播中使用的链式法则会将这些值跨层相乘,从而导致梯度呈指数“爆炸”。 这使得模型的参数剧烈振荡或变得数值不稳定,从而阻止了有效的学习。
梯度爆炸的直接影响是模型权重接收到的更新太大,以至于超出了合理的范围,通常会导致数值溢出(例如,训练日志中的 NaN 值)。 例如,在处理长序列的 RNN 中,早期时间步长的梯度可能会被相同的权重矩阵重复相乘,从而导致它们呈指数增长。 这会破坏训练的稳定性,因为优化器无法收敛到有意义的解决方案。 在实践中,您可能会观察到损失突然飙升或变得未定义,即使网络架构和数据看起来是正确的。 这个问题与其对应的问题——梯度消失问题不同,梯度消失问题是梯度变得太小——梯度爆炸是指幅度超过了实际限制。
为了缓解梯度爆炸,开发人员使用诸如梯度裁剪之类的技术,该技术限制了反向传播期间的梯度幅度。 例如,在 PyTorch 中,您可以应用 torch.nn.utils.clip_grad_norm_
来限制梯度的最大范数。 另一种方法是仔细的权重初始化——使用诸如 Xavier 或 He 初始化之类的方法将初始权重设置在一个避免极端值的范围内。 架构选择也很重要:从诸如 tanh
(可以产生较大的导数)之类的激活函数切换到 ReLU
(对于正输入,导数为 1)会降低风险。 对于 RNN,诸如 LSTM 或 GRU 之类的架构包括调节梯度流的门控机制。 此外,批量归一化层可以稳定中间激活,间接控制梯度尺度。 这些策略与训练期间的梯度范数监控相结合,有助于保持深度网络中稳定的学习动态。