10.神经网络与深度学习(九)—梯度消失问题

1)引言

终于开始进入深度学习了,其实深度学习就是多层神经网络训练数据。

2)什么是梯度消失问题?

梯度消失问题实际上是指在隐藏层BP的时候梯度是逐渐变小的。也就是说前面隐藏层的学习速度比后面的隐藏层学习速度小。

3)什么导致了梯度消失

我们先看一个很简单的深度神经网络:每一层只有一个单一的神经元。下图就是三层隐藏层的神经网络:

我们这里先给出代价函数关于第一个隐藏神经元的梯度∂C/∂b1的公式,如下:

我们现在来看一下这个式子是怎么推出来的。

首先假设b1进行了微小的调整Δb1,这样根据激励公式(Δa1=σ(Δz1))我们的第一个隐藏神经元输出也就变化了Δa1。根据带权公式(Δz2=w*Δa1+b),这会导致第二个隐藏神经元的输入变化了Δz2。而第二个隐藏神经元的输出,根据激励公式(Δa2=σ(Δz2))也就随之变化了Δa2。以此类推,代价函数有C的变化:

现在分析上面的每一个过程,先看第一步Δa1=σ(Δz1):

这里我们用σ(z1)对b1求偏导数,得到公式(116)

接下来,我们看第二步Δz2=w*Δa1+b:

这里我们用∂z2∂a1求偏导数。下面,我们将公式(116)中的结果带入到公式(118)结果中,得到如下公式(119):

我们惊喜的发现,这不就是文章开始给的公式前两项吗?

同理,我们将这个5层的神经网络推导完毕,就得到:

我们再将公式右边的Δb1移到左边就得到总的公式。

公式(121)就是代价函数对偏置求偏导的结构表达式。可以看到这个公式中,除了最后一项,前面的都是权重和sigmoid导数求积。我们再回忆一下sigmoid导函数图像:

我们可以看到sigmoid导函数最大值是1/4。再回头看一下公式(121),这就是说该公式每加一层网络,其速率就下降到1/4。这也就解释了为什么会出现梯度下降问题。

4)梯度激增问题

看到上面的问题,你可能会要想办法解决了。我们现在对公式琢磨琢磨,如果我们让导函数一直是最大(1/4),然后让w设置为很大,那么我们不就可以让训练速率保持到一个比较大的水平了吗?

说干就干:

  • 我们将网络权重设置为w1=w2=w3=w4=100。

  • 让bj=-100*aj-1,这样zj=100*aj-1-100*aj-1=0,则sigmoid导函数一直保持为1/4

可是最后我们计算结果发现,所有的项都等于100*1/4=25,出现了梯度激增问题。

PS:

看到教程这里,编者自己有一个疑问,那么如果我们将w1=w2=w3=w4=4呢?那么最后的结果不就是1了吗?我自己的理解是:权重在训练过程中一直是变化的,而且实际上如果训练速度是1的话这个速度是有点感人的。

继续:

为什么会出现这种情况呢?因为中的变量z=w*a+b同样是与w关联的,如果我们加大w的话,那么不可避免的加大了z,那么根据导函数图像,我们的值会指数速度变小。这样就又会出现梯度下降问题。

5)其他的问题

在2010年Glorot和Bengio发表论文表明sigmoid发现证据表明sigmoid 函数的选择会导致训练⽹络的问题。特别地,他们发现sigmoid 函数会导致最终层上的激活函数在训练中会聚集在0,这也导致了学习的缓慢。这只是梯度的不稳定问题,还有其他问题需要我们解决。

希望有志同道合的小伙伴关注我的公众平台,欢迎您的批评指正,共同交流进步。


阅读更多
所属专栏: 神经网络与机器学习
上一篇9.神经网络与深度学习(八)—程序
下一篇27.python的错误(二)—调试、测试
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭