深度神经网络学习过程中的梯度消失问题

之前的章节,我们利用一个仅包含一层隐藏层的简单神经网络就在MNIST识别问题上获得了98%左右的准确率。我们于是本能会想到用更多的隐藏层,构建更复杂的神经网络将会为我们带来更好的结果。

就如同在进行图像模式识别的时候,第一层的神经层可以学到边缘特征,第二层的可以学到更复杂的图形特征,例如三角形,长方形等,第三层又会识别更加复杂的图案。这样看来,多层的结构就会带来更强大的模型,进行更复杂的识别。

那么在这一章,就试着训练这样的神经网络来看看对结果有没有什么提升。不过我们发现,训练的过程将会出现问题,我们的神经网络的效果并没有什么提升。

为什么会出现这样的情况呢,这一章就是主要围绕着这个问题展开的。我们将会发现,不同层的学习速率是不一样的。例如,在后面的网络层训练正在顺利学习的时候,前面网络层的学习却卡住几乎不动了。而且我们会发现这并不是偶然的,而是在理论上由梯度下降算法导致的。随着我们对问题的深入了解,我们会发现相反的情况也是可能发生的,就是前面网络层学习正常,而后面网络层学习停止。

这虽然看上去都是坏消息,不过深入探索这些问题也是帮助我们设计更好的更高效的深度神经网络的训练方法。

一. 梯度消失问题

先回到之前的程序上,当我们选择一个隐藏层的时候得到准确率为96.48%。接着增加一个隐藏层得到96.90%的结果。看上去结果不错,毕竟提升了。接着再加上一个隐藏层,却只得到了96.57%的结果。这个结果虽说下降了没多少,但是我们模型变复杂了,我们期望得到一个更好的结果,但是却事与愿违了。

这个结果看上去是奇怪的,而外的隐藏层理应使得模型可以处理更复杂的分类函数,不说结果提升多少,但是至少不能下降吧。为了搞清楚这期间到底是出了什么问题,我们回到两个隐藏层的情况,下面的图中,神经元上的柱形的长度表现的是其参数的更新速率,是当参数初始化完成后得到的结果:

大致看上去,第二层整体的更新速率要比第一层的快很多。但是由于权重的初始化也是随机的,我们很难判断这是不是一种巧合。

为了验证这是巧合还是事实,我们先定义δlj=Cblj,然后δl可以看作是一个向量,其中每个分量表示第l层中该神经元上参数更新的速率。于是就可以将||δl||看作是l层整体的学习速率,利用该速率的大小就可以比较不同层学习速率间的差别。

根据这些定义,我们发现||δ1=0.07||||δ2=0.31||,这的确印证了一开始观察到的结果,第二层整体比第一层快。

三层隐藏层的时候呢?结果为0.012, 0.060和0.283,也是一样的结果:后面的层比前面的层快。四层的时候为0.003,0.017,0.070和0.285,也是一样。

我们已经验证了参数刚初始完时的情形,也就是训练刚刚开始的情形,那么随着训练的进行,它们之间速率会发生什么变化呢?

先看两层的情形:

可以看到两者的速率差别,第一层的速率一直比第二层要慢得多。接着看一下三层和四层的情况:

 

 

也是一样的结果,速率都是前面的层要慢于后面的层。

我们于是可以得到一个重要的观察现象:在某些神经网络中,通过隐藏层从后向前看,梯度会变的越来越小。这也意味着,前面层的学习会显著慢于后面层的学习。这就是梯度消失问题。

那么是什么导致了梯度消失呢?是否可以避免这样的问题呢?事实上,的确存在替代方案,但是会导致另外一个问题:前面层的梯度会变的很大而不是消失。这就是梯度爆炸问题。也就是说深度神经网络上的梯度要么倾向于爆炸要么倾向于消失,这都是不稳定的。而这个不稳定性也是基于梯度的学习算法都要面临的一个基本问题。

不过我们也许会有疑问,为什么梯度消失就是问题,梯度是不是说明学习已经够了,这个神经元的参数已经被正确学习到了呢?

事实当然不是这样的,我们一开始初始化产生的参数肯定不可能那么巧合是最优的参数。然而从三层隐藏层的那个例子看到,随机初始化意味着第一层会错过很多的重要信息,即使后面的层训练的再好,也很难识别输入图像。并不是第一层已经训练好了,而是它们无法得到足够的训练。如果我们想要训练这样的神经网络,就必须解决梯度消失问题。

二. 是什么导致了梯度消失问题?

看一个简单的例子,一个每层只有一个神经元的神经网络:

 

 不过注意到这里的C其实表示的是损失函数,其输出分别为:a1,a2,a3,a4

根据求导的链式法则有:

为什么会发生梯度消失:

其实看到这样一个式子:

Cb1=σ(z1)w2σ(z2)w3σ(z3)w4σ(z4)Ca4(122)

如果还记得前面章节神经元saturated发生的原因的话也能知道这里究竟是什么导致了梯度消失。

注意到其间有一系列的

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值