1.梯度爆炸
1)原因
在深层网络或递归神经网络中,误差梯度在更新中累积得到一个非常大的梯度,这样的梯度会大幅度更新网络参数,进而导致网络不稳定。在极端情况下,权重的值变得特别大,以至于结果会溢出(NaN值,无穷与非数值)。当梯度爆炸发生时,网络层之间反复乘以大于1.0的梯度值使得梯度值成倍增长。
2)现象
- 模型无法在训练数据上收敛(比如,损失函数值非常差);
- 模型不稳定,在更新的时候损失有较大的变化;
- 模型的损失函数值在训练过程中变成NaN值;
3)解决方案
梯度爆炸更容易处理一些。因为梯度爆炸的时候,我们的程序会收到NaN错误。
- 可以设置一个梯度阈值,当梯度超过这个阈值的时候可以直接截取。
- 可以使用权重正则化
- 使用长短周期记忆网络
- 使用修正线性激活函数
- 重新设计网络模型
2梯度消失
梯度消失更难检测,有三种方法应对梯度消失问题:
- 合理的初始化权重值。初始化权重,使每个神经元尽可能不要取极大或极小值,以躲开梯度消失的区域。
- 使用relu代替sigmoid和tanh作为激活函数。
- 使用其他结构的RNNs,比如长短时记忆网络(LTSM)和Gated Recurrent Unit(GRU),这是最流行的做法。