梯度消失和梯度爆炸,简单来说,就是因为激活函数sigmoid导致的,输入值过大或过小导致sigmoid函数趋于0和1,对应的求导趋近于0,而且sigmoid的导数在(0,1/4)之间,这就导致如果初始化W为0-1之间的比较小的值,通过过多的层数之后,梯度下降的时候,慢慢就会出现梯度消失。如果W初始化为较大的值,通过多层之后,梯度下降会导致梯度越来越大,产生爆炸。
RNN梯度消失和梯度爆炸和这个也比较类似,不同的是RNN是时序模型,输入文本过长会有这个原因。详见这里: RNN梯度消失和爆炸的原因
当然这个问题不只是用sigmoid的时候会有,tanh激活函数也有这个问题,具体可以参考激活函数篇:常见激活函数总结
下面说下解决办法:
- 预训练加微调
- 梯度剪切、权重正则(针对梯度爆炸)
- 使用不同的激活函数(非饱和的激活函数,如ReLU、Leaky-ReLU、P-ReLU、R-ReLU、Maxout等)
- 使用batchnorm
- 使用残差结构
- 使用LSTM网络
- 梯度截断(Gradient Clipping)
- 更快的优化器
- 好的参数初始化方式,如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/