梯度爆炸和梯度消失的根本原因是:深度学习使用反向传播算法来训练网络,算法的数值稳定性差。
具体来说,主要原因有以下两方面:
一、链式求导
反向传播算法使用链式求导计算网络中每个节点的梯度。
对于深层网络而言:
- 如果求导数值大于1 ,会导致梯度爆炸
- 如果求导数值小于1 ,会导致梯度消失
二、激活函数的性质
不同的激活函数对梯度数值的影响不同:
- Sigmoid、Tanh 梯度接近0 时,容易导致梯度消失
- ReLU 在负域梯度为0 ,有死区
- Leaky ReLU 和 ELU 可以缓解但不会彻底解决
总的来说:
- 反向传播使用链式求导计算梯度
- 求导到指数级变大导致梯度爆炸
- 求导接近0 导致梯度消失
- 不同激活函数对梯度有不同影响
所以要避免梯度问题,需要:
- 使用更稳定的优化器,如Adam
- 使用 Clip 或 Normalize 处理梯度
- 使用ReLU等新型激活函数
- 注重初始化权重
综合上述对策可以有效缓解梯度问题。