模型训练中遇到的问题——梯度消失/爆炸(Loss为nan)
·
梯度爆炸可能出现的原因
- 数据没有做归一化
- Learning_rate过大,导致梯度较大,导致梯度爆炸
- 激活函数、损失函数选取不当,在这种情况很少出现
- 当网络的层数比较多,模型的数值稳定性容易变差,容易产生梯度消失和梯度爆炸,这会导致我们的loss在训练时变为nan,也称之为数据溢出。
- 采用stride大于kernel size的池化层
解决方法(个人经验)
- 首先不要先考虑激活函数,应该先考虑的是learning_rate,试着降低学习率,虽然优化器(Adam)推荐0.001,但并不适用全部网络,试着减少一个量级。如果发现减少一个量级或者甚至两个量级还会出现loss为nan 的情况,此时排除学习率的问题,应该考虑我们的loss是不是由多个层中的loss 组成,例如VAE,我们需要检查每个层的loss(关闭该层loss,用剩下的看是不是还是存在loss为nan的情况)
- 最后检查所有用到log运算的式子,因为当值偏向非常小的数时,log值为无穷大,我们可以在log里边加上1e-8,防止数据溢出。
- 如果为图像问题,则尝试使用残差网络
- 一个trick:如果网络中的某个值你不确定该值是不是稳定,可以考虑给该值加上一个sigmoid或者tanh单调函数,这样也可以有效防止loss 为nan的情况。
- 另一个trick:梯度剪裁,实现代码如下:
- 试着加入BN层。
- 尝试Layer的正则化

更多推荐
所有评论(0)