消失的梯度问题(vanishing gradient problem)
784节点输入层+单30节点隐藏层+10节点输出层在《神经网络的优化方式》中已经表现的很好了,达到了96.35%的准确率,如果增加神经网络的隐藏层深度效果会如何呢?
双30节点隐藏层,准确率96.84%;
三30节点隐藏层,准确率96.39%;
四30节点隐藏层,准确率96.38%。
整个测试效果分析下来,隐藏层深度的提高对准确率没有什么影响。但是这真的颠覆了我们对深度学习的理解,难道不是深度越高,网络应该表现的更好么?
抛开上面的这个疑问,我们来看下四层隐藏层时每一层上学习的速度:
从图片得到的结论是:越靠近input层,训练的速度越慢,4层网络的首和尾竟然相差了100倍,也就是说靠近input层的提高对整个网络的影响微乎其微,这就是消失的梯度问题。这也可以解释为什么增加了网络深度但是学习效果没有明显的变化。
在介绍消息的梯度的原因之前,需要先排除一个理解上的误区。我们认为梯度下降算法算到最后导数趋于0就没有什么可以优化的空间了,所以梯度学习速度会越来越慢。这个知识点是正确的,但是并不能因此认为我们的网络是不存在问题的。原因有2个:第一,每一层的权重和偏置都是随机初始化的,没理由每次都是前面的隐藏层比后面的隐藏层初始化的更靠近梯度学习的谷底部分。第二,大量测试下来结果都一致表现出学习速度是按照网络中隐藏层的层数按序排序的。所以我们可以断定网络中一定存在着可证明的数学上的原理才造成了如此的结果!
反向传播的数学推导这一篇介绍了神经网络学习的理论,以3层隐藏网络为例,应该很容易推算出下图中cost function对b1的偏导
除开最后一项,整个公式可以看成是多个Wj*σ’(Zj)的乘积。
Sigmoid函数的导数如下图:
我们代码中是调用了python的扩展包初始化生成了均值为0标准差为1的高斯分布,从上图导数中可以看到最大值是0.25,所以Wj*σ’(Zj)的绝对值肯定小于等于0.25,这就是梯度消失的原因。
同理如果|Wj*σ’(Zj)|每个都大于1,也会出现类似的问题,越靠近input层学习速度会越快,也就是说越靠近队尾学习速度会消失,我们称之为激增的梯度问题(explodinggradient problem)。无论是激增还是消失,我们统称为不稳定的梯度问题。
我们可能很天真的认为我们只要初始化一些大一点的W的值,让Wj*σ’(Zj)绝对值大于1就可以解决消失的梯度问题了呗~,但是这个在sigmoid函数中是很难做到的,因为σ’(Zj)也依赖于这个w:σ′(z) = σ′(w∗a+b),当w变大时回头看一下sigmoid的导数曲线,会将σ’(Z)推向x坐标的两翼,会变得非常小。
我们将努力在后面的博文中去给出不稳定的梯度的解决方案,至少我们目前明白了**函数的选择、权重的初始化方式会影响到多层神经网络的学习速度。知道了原因,我们就可以对症下药,找到解决问题的思路和方法。