机器学习:神经网络中的梯度消失和梯度爆炸

一、什么是梯度消失和梯度爆炸

1. 梯度消失(gradient vanishing problem)

     我们知道神经网络在进行反向传播(BP)的时候会对参数W进行更新,梯度消失就是靠后面网络层(如layer3)能够正常的得到一个合理的偏导数,但是靠近输入层的网络层,计算的到的偏导数近乎零,W几乎无法得到更新。

2. 梯度爆炸(gradient exploding problem)

    梯度爆炸的意思是,靠近输入层的网络层,计算的到的偏导数极其大,更新后W变成一个很大的数(爆炸)。

二、梯度消失和梯度爆炸产生的原因

    产生梯度消失和梯度爆炸都是因为在神经网络中使用了sigmoid激活函数并且网络很深。为什么呢?

    以下图的反向传播为例(假设每一层只有一个神经元且对于每一层y_i = \sigma (z_i) = \sigma(w_ix_i +b_i),其中\sigma为sigmoid函数)

    

    可以推导出

 

    而sigmoid的导数如下图所示:

     

    可见sigmoid的导数的最大值是0.25。然后我们观察上面的推导式,是三个w_i \sigma'(z_{i-1})的连乘。

    当初始时w \sigma'(z) < 1 , 这种概率是很大的,因为一般初始化w都是小于1, 这时候,经过很多个小于1的数的连乘,最终得到的偏导数远远小于1,甚至接近于零,就产生了梯度消失的现象。这个时候,前面的hidden layer 1的权值更新会变得很慢,导致前面的层权值几乎不变,仍接近于初始化的权值,这就导致hidden layer 1相当于只是一个映射层,对所有的输入做了一个同一映射,这是此深层网络的学习就等价于只有后几层的浅层网络的学习了。

    当初始时w \sigma'(z) > 1, 就是w的初始化值远远大于4,这时候,经过很多个大于1的数的连乘,最终的到的偏导数远远大于1, 这就产生了梯度爆炸的现象。

    无论是梯度消失还是梯度下降,都是使得神经网络的训练过程变得更为曲折,应该尽可能避免它们。

三、解决方法

    1. 对于梯度消失问题,可以考虑用ReLU激活函数取代sigmoid激活函数。

    2. 另外,LSTM的结构设计也可以改善RNN中的梯度消失问题。

    3. 预训练加微调 -> 梯度消失和爆炸。 此过程就是逐层“预训练”(pre-training);在预训练完成后,再对整个网络进行“微调”(fine-tunning)

    4. 梯度剪切->梯度爆炸。

    5. 正则化->梯度爆炸。

    6. batch normalization-> 梯度消失和爆炸。

    7. 残差结构->梯度消失。残差可以很轻松的构建几百层,一千多层的网络而不用担心梯度消失过快的问题。

四、参考资料

   【1】 神经网络训练中的梯度消失与梯度爆炸 - 知乎

   【2】深度神经网络的梯度不稳定问题--梯度消失与梯度爆炸 | ziyubiti

  • 33
    点赞
  • 182
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值