什么是梯度爆炸
在神经网络(RNN)中,误差梯度的作用是用来以合适的方向和合适大小更新网络结构权重值。
在神经网络训练过程中,误差梯度值是不断累积的,从一个小值可能会变化到一个异常大的值,这种误差梯度巨大浮动反过来会导致权重向量的剧烈变化,最终训练的网络结构不够稳定。在极端条件下,由于权重向量更新很大,导致程序内存溢出,输出结果是NAN。
另外,当隐藏层层数多于1时,梯度多次的累积相乘也会导致梯度成指数级爆炸。
梯度爆炸带来的问题
1、网络结构不稳定,值为NAN 的权重不再更新,也即参数学习不了。
2、不能学习long input sequence
如何确定梯度是否发生
1、模型不稳定,损失函数随更新变化幅度大。
2、在训练过程中,损失函数趋向NAN。
也可以从以下方面确认是否梯度爆炸:
1、权重向量值中存在NAN
2、在训练过程中,权重前后变化剧烈
3、在模型训练时,任意网络层、任意节点的误差梯度值总是大于1
梯度爆炸解决方法
1、重新设计网络结构
- 减少网络结构层数
- 减小batch size
2、选用不同的激活函数
- RELU
- swish
3、替换成LSTM模型
4、梯度裁剪clip
- 误差梯度高于某一阈值,则对其裁剪或者将其设置成阈值。
- 规范化后的误差梯度大于某一阈值,则裁剪。
5、权重正则化
对权重向量加以正则化处理,比如添加L1或者L2惩罚项。