很久没有更新blog了,最近抽时间看了Nielsen的《Neural Networks and Deep Learning》感受小有收获,分享给你们。算法
了解深度学习的同窗可能知道,目前深度学习面临的一个问题就是在网络训练的过程当中存在梯度消失问题(vanishing gradient problem),或者更广义地来说就是不稳定梯度问题。那么到底什么是梯度消失呢?这个问题又是如何致使的呢?这就是本文要分享的内容。网络
首先,咱们将一个网络在初始化以后在训练初期的结果可视化以下:函数
在上图中,神经元上的条能够理解为神经元的学习速率。这个网络是通过随机初始化的,可是从上图不难发现,第二层神经元上的条都要大于第一层对应神经元上的条,即第二层神经元的学习速率大于第一层神经元学习速率。那这可不多是个巧合呢?其实不是的,在书中,Nielsen经过实验说明这种现象是广泛存在的。学习
咱们再来看下对于一个具备四个隐层的神经网络,各隐藏层的学习速率曲线以下:spa
能够看出,第一层的学习速度和最后一层要差两个数量级,也就是比第四层慢了100倍。 实际上,这个问题是能够避免的,尽管替代方法并非那么有效,一样会产生问题——在前面的层中的梯度会变得很是大!这也叫作激增的梯度问题(exploding gradient problem),这也没有比消失的梯度问题更好处理。更加通常地说,在深度神经网络中的梯度是不稳定的,在前面的层中或会消失,或会激增,这种不稳定性才是深度神经网络中基于梯度学习的根本缘由。3d
为了弄清楚为什么会出现消失的梯度,来看看一个极简单的深度神经网络:每一层都只有一个单一的神经元。下面就是有三层隐藏层的神经网络:code
咱们把梯度的整个表达式写出来:blog
$\dfrac{\partial{C}}{\partial{b_{1}}}=\sigma^{\prime}(z_{1})\omega_{2}\sigma^{\prime}(z_{2})\omega_{3}\sigma^{\prime}(z_{3})\omega_{4}\sigma^{\prime}(z_{4})\dfrac{\partial{C}}{\partial{a_{4}}}$token
为了理解每一个项的行为,先看下sigmoid函数导数的曲线:深度学习
该导数在$\sigma^{\prime}(0)=\dfrac{1}{4}$时达到最高。如今,若是咱们使用标准方法来初始化网络中的权重,那么会使用一个均值为0标准差为1的高斯分布。所以全部的权重一般会知足$|\omega_{j}|<1$。有了这些信息,咱们发现会有$\omega_{j}\sigma^{\prime(z_{j})}<\dfrac{1}{4}$,而且在进行全部这些项的乘积时,最终结果确定会指数级降低:项越多,乘积的降低也就越快。
下面咱们从公式上比较一下第三层和第一层神经元的学习速率:
比较一下$\dfrac{\partial{C}}{\partial{b_{1}}}$和$\dfrac{\partial{C}}{\partial{b_{3}}}$可知,$\dfrac{\partial{C}}{\partial{b_{1}}}$要远远小于$\dfrac{\partial{C}}{\partial{b_{3}}}$。 所以,梯度消失的本质缘由是:$\omega_{j}\sigma^{\prime}(z_{j})<\dfrac{1}{4}$的约束。
举个例子说明下:
不稳定的梯度问题:根本的问题其实并不是是消失的梯度问题或者激增的梯度问题,而是在前面的层上的梯度是来自后面的层上项的乘积。当存在过多的层次时,就出现了内在本质上的不稳定场景。惟一让全部层都接近相同的学习速度的方式是全部这些项的乘积都能获得一种平衡。若是没有某种机制或者更加本质的保证来达成平衡,那网络就很容易不稳定了。简而言之,真实的问题就是神经网络受限于不稳定梯度的问题。因此,若是咱们使用标准的基于梯度的学习算法,在网络中的不一样层会出现按照不一样学习速度学习的状况。
1. Michael Nielsen,《Neural Networks and Deep Learning》