梯度爆炸与梯度弥散
2019-04-13 本文已影响0人
9933fdf22087
实际现象:当我们使用sigmoid function作为激活函数时,随着神经网络的隐藏层数增加,训练误差反而增大,造成了深度网络的不稳定。
梯度弥散:靠近输出层的hidden layer 梯度大,参数更新更快,所以很快就会收敛。而靠近输入层的hidden layer梯度小,参数更新慢,几乎和初始状态一样,随机分布。
梯度爆炸:当前面hidden layer的梯度通过训练变大,而后面的梯度将会指数级增大。
现象原因:sigmoid函数会将[+∞,-∞]的输入压缩到[0,1],导致当输入更新时,输出的更新会很小。在这种情况下,就会随着隐藏层数的增加,反向传递时,数值更新将会越来越小。
解决方法:
1.Relu函数代换Sigmoid函数。
2.逐层贪婪预训练,如同训练自编码器的过程,每次只训练一层参数。由于得到的参数将会是局部最优,所以需要对整个网络再进行调优。
3.梯度减切。设置一个梯度减切的阈值,如果在更新梯度的时候,梯度超过这个阈值,则会将其限制在这个范围之内,防止梯度爆炸。
4.正则。对参数加入正则规范,限制参数范数过大。
5.加入batch normalization层。
6.加入残差结构。
7.LSTM层由于有记忆,可以缓解梯度消失的发生。