梯度消失和梯度爆炸

梯度消失和梯度爆炸,简单来说,就是因为激活函数sigmoid导致的,输入值过大或过小导致sigmoid函数趋于0和1,对应的求导趋近于0,而且sigmoid的导数在(0,1/4)之间,这就导致如果初始化W为0-1之间的比较小的值,通过过多的层数之后,梯度下降的时候,慢慢就会出现梯度消失。如果W初始化为较大的值,通过多层之后,梯度下降会导致梯度越来越大,产生爆炸。

RNN梯度消失和梯度爆炸和这个也比较类似,不同的是RNN是时序模型,输入文本过长会有这个原因。详见这里: RNN梯度消失和爆炸的原因

当然这个问题不只是用sigmoid的时候会有,tanh激活函数也有这个问题,具体可以参考激活函数篇:常见激活函数总结

下面说下解决办法:

  1. 预训练加微调
  2. 梯度剪切、权重正则(针对梯度爆炸)
  3. 使用不同的激活函数(非饱和的激活函数,如ReLU、Leaky-ReLU、P-ReLU、R-ReLU、Maxout等)
  4.  使用batchnorm
  5. 使用残差结构
  6.  使用LSTM网络
  7. 梯度截断(Gradient Clipping)
  8. 更快的优化器
  9. 好的参数初始化方式,如He初始化

 

参考链接:


https://blog.csdn.net/junjun150013652/article/details/81274958
https://www.cnblogs.com/XDU-Lakers/p/10553239.html
https://blog.csdn.net/qq_25737169/article/details/78847691
https://zhuanlan.zhihu.com/p/33006526
https://zhuanlan.zhihu.com/p/28687529
https://www.pianshen.com/article/244666978/
 

上一篇:常用激活函数:Sigmoid、Tanh、Relu、Leaky Relu、ELU优缺点总结


下一篇:深度学习之激活函数详解