机器学习:神经网络中的梯度消失和梯度爆炸
一、什么是梯度消失和梯度爆炸1. 梯度消失(gradient vanishing problem)我们知道神经网络在进行反向传播(BP)的时候会对参数W进行更新,梯度消失就是靠后面网络层(如layer3)能够正常的得到一个合理的偏导数,但是靠近输入层的网络层,计算的到的偏导数近乎零,W几乎无法得到更新。2. 梯度爆炸(gradient exploding problem)梯度爆炸的意思是,靠近输入
一、什么是梯度消失和梯度爆炸
1. 梯度消失(gradient vanishing problem)
我们知道神经网络在进行反向传播(BP)的时候会对参数W进行更新,梯度消失就是靠后面网络层(如layer3)能够正常的得到一个合理的偏导数,但是靠近输入层的网络层,计算的到的偏导数近乎零,W几乎无法得到更新。
2. 梯度爆炸(gradient exploding problem)
梯度爆炸的意思是,靠近输入层的网络层,计算的到的偏导数极其大,更新后W变成一个很大的数(爆炸)。
二、梯度消失和梯度爆炸产生的原因
产生梯度消失和梯度爆炸都是因为在神经网络中使用了sigmoid激活函数并且网络很深。为什么呢?
以下图的反向传播为例(假设每一层只有一个神经元且对于每一层,其中
为sigmoid函数)
可以推导出
而sigmoid的导数如下图所示:
可见sigmoid的导数的最大值是0.25。然后我们观察上面的推导式,是三个的连乘。
当初始时 < 1 , 这种概率是很大的,因为一般初始化w都是小于1, 这时候,经过很多个小于1的数的连乘,最终得到的偏导数远远小于1,甚至接近于零,就产生了梯度消失的现象。这个时候,前面的hidden layer 1的权值更新会变得很慢,导致前面的层权值几乎不变,仍接近于初始化的权值,这就导致hidden layer 1相当于只是一个映射层,对所有的输入做了一个同一映射,这是此深层网络的学习就等价于只有后几层的浅层网络的学习了。
当初始时 > 1, 就是w的初始化值远远大于4,这时候,经过很多个大于1的数的连乘,最终的到的偏导数远远大于1, 这就产生了梯度爆炸的现象。
无论是梯度消失还是梯度下降,都是使得神经网络的训练过程变得更为曲折,应该尽可能避免它们。
三、解决方法
1. 对于梯度消失问题,可以考虑用ReLU激活函数取代sigmoid激活函数。
2. 另外,LSTM的结构设计也可以改善RNN中的梯度消失问题。
3. 预训练加微调 -> 梯度消失和爆炸。 此过程就是逐层“预训练”(pre-training);在预训练完成后,再对整个网络进行“微调”(fine-tunning)
4. 梯度剪切->梯度爆炸。
5. 正则化->梯度爆炸。
6. batch normalization-> 梯度消失和爆炸。
7. 残差结构->梯度消失。残差可以很轻松的构建几百层,一千多层的网络而不用担心梯度消失过快的问题。
四、参考资料
更多推荐
所有评论(0)