反向传播算法的影响
![](https://i-blog.csdnimg.cn/blog_migrate/07f51cdb9ff55502c3f7711b92ba63b1.png)
上图为一个四层的全连接网络,假设每一层网络的输出为,其中
代表第i层的激活函数,x代表第i层的输入,即第i-1层的输出,令
和
分别表示第i层的权重和偏置量,那么可以得出
,可以简化为
。
BP算法基于梯度下降策略,以目标函数的负梯度方向对参数进行调整,若给定学习率,则更新公式为:
△w
△w
如果要更新上图中第二层的权重,根据链式求导法则,更新梯度信息:
△
很容易看出
其中,若此部分大于1,则层数增多,经过累乘,最终的梯度更新将以指数形式增加,即发生梯度爆炸;如果此部分小于1,则随着层数增多,求出的梯度更新信息将会以指数形式衰减,即发生梯度消失。
在深层网络中,不同层学习的速度差异很大,通常输出层及靠近输出层的隐层的权重更新速度较快,学习较好。靠近输入层的隐层学习较慢,有时甚至训练了很久,前几层的权值和刚开始的随机初始值差不多。若发生梯度消失,则前面几层的权重在学习过程中几乎未发生变化,即学习效果很差。
由此可见,梯度消失和爆炸的根本原因之一在于反向传播训练法则,属于天生不足。
激活函数的影响
激活函数选择不合适,如使用sigmoid函数,梯度消失就会非常明显。中导数部分的值小于1,经过累乘会变得非常小。
常见的sigmoid函数为对率函数,其函数图像及导数图像如下所示:
![](https://i-blog.csdnimg.cn/blog_migrate/83edf962779b36636d62d1b24593b75e.png)
由图中可以看到sigmoid函数的导数最大不超过0.25。
同理,其他激活函数也一样。
![](https://i-blog.csdnimg.cn/blog_migrate/11153bac5d419a5dd2bf953922785b07.png)
解决方法
1.预训练加微调
基本思想是每次训练一个隐层,训练时将上一层隐结点的输出作为输入,而本层隐结点的输出作为下一层隐结点的输入,此过程就是逐层预训练。在训练完成后,再对整个网络进行微调,如利用BP算法对整个网络进行再训练。此思想可以理解为:先局部寻优,再整合起来全局寻优。
2.选择合适的激活函数
如选择Relu、Leaky Relu、ELU等激活函数。其思想非常简单,如果激活函数的导数为1,那么就不存在梯度消失和爆炸的问题了。
3.选择更好的结构
如选择LSTM和GRU。