Neural Networks and Deep Learning CH5

这一章主要从unstable gradients的角度来说明为什么deep neural networks难训练。具体来说,神经网络中不同层学习的速度会不一样,有时候后面的层训练得很快,但前面的层却训练得很慢(stuck)。也有可能是后面的层训练得很慢,前面的层训练得很快。

The vanishing gradient problem

在对第一节的手写识别神经网络的实验中发现了一个很奇怪的现象,在加深网络深度的时候,本应该使得网络能够更好的分类,可是在实验中准确度反而不变或者下降了。

问题出在我们并没有训练出正确的weights和biases。从第二章我们知道gradient C/b 不仅控制了bias的改变速率,还控制了weights的改变速率。由实验中我们知道,越接近输出层,gradient越大,这说明接近输出层的weights和biases训练得比前面层快。

我们指定第 l 层的第j个神经元的gradient为 δlj=C/blj ,并且粗略的使用 ||δj|| 来表示第 j 层的学习速度。

实验曲线:
当有两个隐藏层时训练速度曲线:
这里写图片描述
当有三个隐藏层时的训练速度曲线:
这里写图片描述
当有四个隐藏层时的训练速度曲线:
这里写图片描述
在这个数据中,第一个隐藏层的训练速度比最后一个隐藏层慢了近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

考虑如下的神经网络:
这里写图片描述
稍微回顾一下,其中的w1,w2,...是weights, b1,b2,... 是biases, C 是cost function。第j个神经元的输出 aj σ(zj) σ 是sigmoid函数, zj=wjaj1+bj
如第二章,由链式法则,可得:
这里写图片描述
推导过程:
假设我们在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=100a0 就可以了。此时, wjσ(zj)=1001/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 比较大的话就可以了,可是σ(z)这一项也取决于 w σ(z)=σ(wa+b)。如果 w 很大,那么wa+b也很大,导致其取值落在 σ(z) 的右方,由上面导数的取值图可以知道,此时其很小。

唯一可以避免这个情况发生的方法是输入的 a 落在一个很窄的取值范围内。

考虑式子|wσ(wa+b)|,为了 |wσ(wa+b)|1 ,由 σ 导数的值域,可得必有 |w|4
而为了使得 |wσ(wa+b)|1 成立, a 必须不大于:
这里写图片描述

Unstable gradients in more complex networks

以上我们讨论的是简单的神经网络,在更复杂的网络中,unstable gradient的问题也是存在的。
比如如下复杂的网络:
这里写图片描述
在backpropagation中,可以得到第l层的gradient:
这里写图片描述
其中, (zl) 为对角矩阵,其值为 l 层输入的weights的σ(z) wl 是不同层的weight矩阵。 aC C 的偏导向量。

与简单的例子一样,式子中有很多(wj)T(zj)项,对角矩阵的值不大于 1/4 。因此引起了vanishing gradient的问题。

Other obstacles to deep learning

这一章围绕着unstable gradients说明了在deep learning中存在的一个问题。
事实上这只是其中的一个问题。在训练中还存在着许许多多的问题。比如activation函数的选择,weights的初始化,网络结构的选择,参数的选择,甚至是gradient descent的实现都会影响到DL的训练。这些都使得DL很难训练。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值