虽然梯度消失问题导致学习信号在长序列中减弱,但梯度爆炸问题在循环神经网络 (neural network)(RNN)训练期间呈现出另一种数值不稳定现象。梯度非但没有趋近于零,反而可能变得异常巨大,有时会导致数值超出标准表示范围,产生 NaN(非数字)输出,从而使训练过程完全中断。
为什么会出现梯度爆炸?
梯度爆炸的机制与通过时间反向传播 (backpropagation)(BPTT)过程以及循环权重 (weight)矩阵的重复应用密切相关。回想一下,BPTT通过将误差信号逐步反向传播到展开的网络中来计算梯度。
考虑简单RNN中隐藏状态 ht 的更新规则:
ht=tanh(Wxhxt+Whhht−1+bh)
当计算损失 L 相对于时间上很早的隐藏状态 hk 的梯度时,BPTT会计算诸如 ∂ht−1∂ht、∂ht−2∂ht−1 等项,一直回溯到 ∂hk∂hk+1。每个偏导数都涉及与循环权重矩阵 Whh(以及激活函数 (activation function)的导数)相乘。
从较晚时间步 t 到较早时间步 k (k<t) 的梯度贡献涉及一系列雅可比矩阵的乘积:
∂hk∂ht=i=k+1∏t∂hi−1∂hi
每个项 ∂hi−1∂hi 都近似地与 Whh 成比例。如果循环权重矩阵 Whh 的主导特征值(或更一般地说,奇异值)的幅值始终大于1,那么这种跨越许多时间步 (t−k) 的重复乘法会导致最终的梯度值呈指数级增长。
将其想象为复利:如果你反复将一个值乘以一个略大于1的因子,它会增长得非常快。在BPTT中,与 Whh 相关的梯度分量会重复相乘。如果这些分量倾向于放大信号(幅值 > 1),则整体梯度可能会爆炸。
对训练的影响
梯度爆炸以几种破坏性的方式表现出来:
- 数值溢出: 梯度值变得非常大,以至于超出了浮点数的表示范围,通常导致损失或权重 (weight)中出现
NaN 值。
- 剧烈权重更新: 即使没有发生数值溢出,巨大的梯度也会导致在梯度下降 (gradient descent)过程中对网络权重进行过大的更新。想象一下,试图通过迈出巨大步子下山;你很可能会严重越过最小值,最终离目标更远。这使得优化过程不稳定,权重可能会剧烈振荡或发散。
- 训练失败: 模型无法有效学习。成本函数可能会不规则地波动或无限增长,从而阻碍收敛到一个有用的解。
梯度范数在初始训练迭代中保持相对稳定,但随后突然急剧增加,表明发生了梯度爆炸事件。请注意,y轴上使用了对数刻度,以适应这种大幅度的尖峰。
与梯度消失(它悄然阻碍长距离依赖的学习)不同,梯度爆炸通常会导致更明显和灾难性的训练失败。幸运的是,它们显著的影响使其更容易被发现(例如,通过监测梯度范数或观察突发的 NaN 损失)。我们将在下一节讨论梯度裁剪等方法,它们能有效处理这种不稳定情况。