这一章主要从unstable gradients的角度来说明为什么deep neural networks难训练。具体来说,神经网络中不同层学习的速度会不一样,有时候后面的层训练得很快,但前面的层却训练得很慢(stuck)。也有可能是后面的层训练得很慢,前面的层训练得很快。
The vanishing gradient problem
在对第一节的手写识别神经网络的实验中发现了一个很奇怪的现象,在加深网络深度的时候,本应该使得网络能够更好的分类,可是在实验中准确度反而不变或者下降了。
问题出在我们并没有训练出正确的weights和biases。从第二章我们知道gradient ∂C/∂b 不仅控制了bias的改变速率,还控制了weights的改变速率。由实验中我们知道,越接近输出层,gradient越大,这说明接近输出层的weights和biases训练得比前面层快。
我们指定第
l
层的第
实验曲线:
当有两个隐藏层时训练速度曲线:
当有三个隐藏层时的训练速度曲线:
当有四个隐藏层时的训练速度曲线:
在这个数据中,第一个隐藏层的训练速度比最后一个隐藏层慢了近100倍。
因此我们知道了,至少在一些DNN中,gradient会在backward中变小。这意味着前面层训练得比后面层慢。这种现象叫做vanishing gradient problem,并且无法避免。还有另外一种情况与其相反,是前面层训练得比后面层快。这种现象叫做exploding gradient problem。总得来说,在DNN中的gradient是不稳定的(unstable)。
What’s causing the vanishing gradient problem? Unstable gradients in deep neural nets
考虑如下的神经网络:
稍微回顾一下,其中的
如第二章,由链式法则,可得:
推导过程:
假设我们在bias
b1
处做了一点小改变
Δb1
,这将会引起接下来网络中的一系列改变。首先改变的是
Δa1
,接下来是
Δz2
,以此类推。
对于输出的改变
ΔC
,我们有:
这个式子告诉我们,可以沿着
Δb1
改变网络的路径来找到一个具体的
∂C/∂b1
的表达式。
因此,首先来看
Δb1
是如何改变
a1
的,我们有
a1=σ(z1)=σ(w1a0+b1)
。所以:
又由于
Δa1
接下来影响了
z2=w2a1+b2
,可得:
结合
Δz2
和
Δa1
可以得到
b1
如何影响到
z2
的式子:
依此类推,可以得到
Δb1
对
ΔC
的影响的式子:
两边同除
Δb1
,可得:
Why the vanishing gradient problem occurs
为了解决这个问题,写出上面gradient的完整表达式:
除了最后一项,这个表达式的其他项都是
wjσ′(zj)
形式,下图为
σ′
的函数图象:
其最大值为
σ′(0)=1/4
,如果我们用标准形式初始化weights,也就是用均值为0,方差为1的高斯分布来初始化。将会得到
|wj|<1
。
因此
|wjσ′(zj)|<1/4
。所以当我们乘上很多项的时候,得数会指数级别的下降。
由下图:
可以知道,越靠近输出层的隐藏层,乘的小于1的数越少,因此其得数越大。
事实上,如果在训练中 wj 会增大,严格来说,大于1,那么vanishing gradient problem就不会出现了。相反,gradient会在backward的时候指数级别上升,这就变成了exploding gradient problem。
The exploding gradient problem
这里构造了一个这样的问题,但实际中也是会出现的。构造这个问题分两步:
第一步,将所有的weights设置为很大的值,比如
w1=w2=w3=w4=100
;第二步,选择biases使得
σ′(zj)
不太小。这比较容易。比如我们使
zj=0
,即
σ′(zj)=1/4
,那么
z1=w1a0+b1=0
,设
b1=−100∗a0
就可以了。此时,
wjσ′(zj)=100∗1/4=25
。
The unstable gradient problem
总而言之,这里我们遇到的问题是unstable gradient problem,如果我们用标准的gradient-based learning techniques,在网络中的不同层将会有不同的学习速度。
The prevalence of the vanishing gradient problem
在深度网络中,可能会出现vanish或者explode的问题。事实上,当使用sigmoid的时候常常遇到的是vanish的问题。
从上面我们知道,当
|wσ′(z)|≥1
时才能避免vanish的问题。如果
w
比较大的话就可以了,可是
唯一可以避免这个情况发生的方法是输入的 a 落在一个很窄的取值范围内。
考虑式子
而为了使得
|wσ′(wa+b)|≥1
成立,
a
必须不大于:
Unstable gradients in more complex networks
以上我们讨论的是简单的神经网络,在更复杂的网络中,unstable gradient的问题也是存在的。
比如如下复杂的网络:
在backpropagation中,可以得到第
其中,
∑′(zl)
为对角矩阵,其值为
l
层输入的weights的
与简单的例子一样,式子中有很多
Other obstacles to deep learning
这一章围绕着unstable gradients说明了在deep learning中存在的一个问题。
事实上这只是其中的一个问题。在训练中还存在着许许多多的问题。比如activation函数的选择,weights的初始化,网络结构的选择,参数的选择,甚至是gradient descent的实现都会影响到DL的训练。这些都使得DL很难训练。