梯度消失和梯度爆炸为什么发生,怎样处理?
二者都与反向传播的链式连乘有关:连续缩小会消失,连续放大会爆炸。
DETAILED ANSWER
直接结论
梯度消失和梯度爆炸都与反向传播中的链式连乘有关。多个小于1的局部梯度连续相乘会让梯度接近0;多个大于1的局部梯度连续放大会让梯度异常增大。
梯度消失
多个小于1的局部梯度连续相乘
→ 梯度越来越接近0
例如:
0.9^100 ≈ 0.0000266
可能表现为:
- 靠近输入端的早期层几乎得不到更新。
- RNN早期时间步的信息难以影响很久以后的结果。
- 损失下降缓慢,长期依赖难以学习。
常见缓解方式包括LSTM或GRU、残差连接、合理初始化、ReLU类激活函数、归一化,以及用注意力机制缩短远距离信息路径。
梯度爆炸
多个大于1的局部梯度连续相乘
→ 梯度越来越大
可能表现为:
- 参数更新幅度异常大。
- 损失剧烈波动或训练发散。
- 出现
inf或NaN。
常见处理方式包括梯度裁剪、减小学习率、合理初始化、归一化,以及缩短或改造过长的梯度传播路径。
梯度震荡不等于梯度爆炸
- 梯度震荡:参数在最优点两侧反复移动。
- 梯度爆炸:梯度数值本身持续异常放大。
如果震荡幅度逐渐减小并最终稳定,训练仍可能正常收敛;如果振幅不减、不断增大或出现NaN,则需要处理。
补充:Leaky ReLU为什么保留负半轴梯度
普通ReLU在负数区域输出0,梯度也为0,部分神经元可能长期无法更新。Leaky ReLU在负数区域保留一个较小斜率:
x > 0:输出x
x <= 0:输出α × x
因此负数区域仍可以传播少量梯度,但它不是解决所有梯度消失问题的万能方案。
面试口述
梯度消失和爆炸主要来自反向传播中的链式连乘。当局部梯度连续相乘后趋近于0时会发生梯度消失,连续放大时会发生梯度爆炸。梯度消失可以通过LSTM、残差连接、合理初始化和合适激活函数缓解;梯度爆炸常使用梯度裁剪、降低学习率和归一化处理。
