【神经网络和深度学习】笔记 - 第五章 深度神经网络学习过程当中的梯度消失问题

文章导读:算法

1. 梯度消失问题网络

2. 是什么致使了梯度消失问题?app

3. 复杂神经网络中的梯度不稳定问题ide

 

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

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

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

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

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

一. 梯度消失问题

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

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

大体看上去,第二层总体的更新速率要比第一层的快不少。可是因为权重的初始化也是随机的,咱们很难判断这是否是一种巧合。

为了验证这是巧合仍是事实,咱们先定义$\delta ^l_j = \frac{\partial C}{\partial b^l_j}$,而后$\delta ^l$能够看做是一个向量,其中每一个份量表示第$l$层中该神经元上参数更新的速率。因而就能够将$||\delta^l||$看做是$l$层总体的学习速率,利用该速率的大小就能够比较不一样层学习速率间的差异。

根据这些定义,咱们发现$||\delta ^1 = 0.07||$和$||\delta ^2 = 0.31||$,这的确印证了一开始观察到的结果,第二层总体比第一层快。

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

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

先看两层的情形:

能够看到二者的速率差异,第一层的速率一直比第二层要慢得多。接着看一下三层和四层的状况:

 

 

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

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

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

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

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

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

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

 

 不过注意到这里的$C$其实表示的是损失函数,其输出分别为:$a_1,a_2,a_3,a_4$。

根据求导的链式法则有:

为何会发生梯度消失:

其实看到这样一个式子:

$$\frac{\partial C}{\partial b_1} = \sigma '(z_1)w_2 \sigma '(z_2)w_3 \sigma '(z_3)w_4 \sigma '(z_4)\frac{\partial C}{\partial a_4} \quad (122)$$

若是还记得前面章节神经元saturated发生的缘由的话也能知道这里到底是什么致使了梯度消失。

注意到其间有一系列的$w_j \sigma '(z_j)$项,先看一下sigmoid函数的导数图像:

最大值也才0.25,而后因为参数的初始化使用$G(0, 1)$的高斯分布,经常会致使$|w_j| < 1$,这样就会致使$w_j \sigma '(z_j)<\frac{1}{4}$。而后一系列这些小值的积也会变得更小。

固然这并非一个严格的数学证实,咱们很容易就会举出不少反例。好比在训练过程当中权重$w_j$是可能变大的,若是大到使得$|w_j\sigma '(z_j)<\frac{1}{4}|$再也不知足,或者说大于1,梯度就不会消失了,它将指数增加,从而致使另一个问题:梯度爆炸问题。

 

梯度爆炸问题:

再来看一个梯度爆炸发生的例子。咱们选择大的权重:$w_1=w_2=w_3=w_4=100$。而后选择误差使得$\sigma '(z_j)$不过小。这个并不难作到,例如咱们能够选择使得$z_j=0$时的bias,因而获得$w_j \sigma '(z_j) = 100*0.25 = 25$,这样就会致使梯度爆炸了。

 

梯度的不稳定性问题:

通过这些讨论咱们就会发现,梯度消失也好,梯度爆炸也好,归根结底是因为层数的增长,多个项相乘,势必就会致使不稳定的状况。除非这些积能恰到好处的相等,才可让不一样层之间的学习速率相近。不过实际上,这几乎是不可能发生的。总之,只要咱们使用基于梯度的学习算法,不一样层的学习速率势必是有很大差距的。

练习:

问题:

以前咱们基于$\sigma '(z) <\frac{1}{4}$的事实讨论了梯度消失的问题,那么是否可使用另一个激活函数,使得其导数足够大,来帮助咱们解决梯度不稳定的问题呢?

答案:

这个固然是不能够的,无论一开始的值是怎么样的,由于多个项相乘,这就会致使积是指数增加或者指数降低,可能浅层时不明显,可是随着层数的增长,都会致使这个问题出现。

 

梯度消失问题很难消除的缘由:

以前已经发现了在深层网络的前几层会出现梯度或者消失或者爆炸的问题。事实上,当使用sigmoid函数做为激活函数的时候,梯度消失几乎是总会出现的。考虑到避免梯度消失,要知足条件$|w\sigma '(z)| \geqslant 1$。咱们也许会以为这还不简单,只要$w$大不就能够了,可是注意到$w$大,也会致使$z=wx+b$也大,而后$\sigma '(z)$就会很小。惟一的方法就是还须要保证$x$只出如今一个很小的范围内,这在实际状况下显然是很难发生的。因此说就老是会致使梯度消失的问题。

 

拓展:

拓展一:

考虑$|w\sigma '(wa+b)|$,假设$|w\sigma '(wa+b)| \geqslant 1$

(1) 证实这只可能在$|w|\geqslant 4$时成立

以前已经知道$|\sigma '(z)|$在0处取最大值0.25,因此$|w\sigma '(wa+b)| \geqslant 1$成立的话势必须要$|w| \geqslant 1/0.25 = 5$ 。

(2)假设$|w|\geqslant 4$,考虑到$|w\sigma '(wa+b)| \geqslant 1$,证实此时的$a$的变化区间被限制在宽度$$\frac{2}{|w|}ln (\frac{|w| (1 + \sqrt{1-4/|w|})}{2} -1)$$内

这个就是纯数学问题解方程了,利用一元二次方程的求根公式能够求得$e^{-z}_{max}$和$e^{-z}_{min}$,而后求对数后相减,稍微变换一下形式就能够获得这个结果。

(3)证实上面的范围的最大值大约为0.45,在$|w| \approx 6.9$处获得。因而能够看到即便全部这些条件都知足,激活函数的符合要求的输入范围仍是很是窄,仍是很难避免梯度消失的问题。

求导算导数为0的点求得。

拓展二:identity神经元

考虑一个单输入$x$的神经元,中间层参数为$w_1$和$b$,而后输出层参数为$w_2$,证实经过选择适当的权重和误差,可使得$w_2 \sigma (w_1 x + b) \approx x$对任意$x\in [0, 1]$成立。这个神经元能够被认为是一种identity神经元,其输出和输入同样(只差一个权重因子的放缩)。提示:能够将$x$写为$x=\frac{1}{2} + \Delta$, 假设$w_1$很小,使用$w_1 \Delta$处的泰勒展开。

以前讨论sigmoid函数形状的时候知道,当$|w_1|$增大的时候,函数会变得愈来愈窄,逼近解约函数。当$|w_1|$很是小的时候,函数愈来愈宽,在某个区间内会逼近线性函数,可是既然是sigmoid函数,当$x \rightarrow \infty$时,函数都是会趋向于1或0的。

这里的证实我没有用泰勒展开,我想的是既然要证实该函数在某个区间的线性,只要证实它导数在该区间趋近于常数便可。

求$\sigma (w_1 x+b)$的导数为$\sigma '(w_1 x +b) = \frac{w_1 e^{-(w_1 x + b)}}{(1+e^{-(w_1 x + b)})^2} = \frac{w_1 e^{w_1 x + b}}{(1+e^{w_1 x + b})^2}$。

不妨令$x = \frac{1}{2} + \Delta$则上式变为:

$\frac{w_1 e^{w_1 \Delta}}{1+2e^{w_1 \Delta} + e^{2w_1 \Delta}}$,因为$\Delta = x - \frac{1}{2} \in [-\frac{1}{2}, \frac{1}{2}]$, 而$w_1$是很小的数,因而可将上式展开为$\frac{w_1 (1+ w_1 \Delta)}{1 + 2(1+w_1 \Delta) + 1 + 2w_1 \Delta} = \frac{w_1 (1+ w_1 \Delta)}{4(1+ w_1 \Delta)} = \frac{w_1}{4}$为常数,经过适当调整$w_2$就可使其输出刚好为$x$。

 

三. 复杂神经网络中的梯度不稳定问题

前面是在一个简单的例子下讨论的梯度不稳定问题,对于以下这个复杂的状况:

根据以前反向传播的知识,咱们能够获得:

$$\delta ^l = \sum '(z^l)(w^{l+1})^T \sum '(z^{l+1})(w^{l+2})^T...\sum '(z^L) \bigtriangledown_a C$$

其中$\sum '(z^l)$为一个对角矩阵,其中每一个成员为$\sigma '(z)$为第l层的各个加权输入。$w^l$是不一样层的权重矩阵,$\bigtriangledown_a C$为损失函数C对输出层的输出的偏导数。

这个式子看上去比以前复杂的多,可是其实仍是能看到其中不少个$(w^j)^T\sum '(z^j)$进行连乘,仍是会出现梯度不稳定的问题。

相关文章
相关标签/搜索