梯度消失和梯度爆炸原因推导

什么导致了消失的梯度问题?也就是在深度神经网络中的所谓的梯度不稳定性

为了弄清楚为何会出现消失的梯度,来看看一个极简单的深度神经网络:每一层都只有一个单一的神经元。下图就是有三层隐藏层的神经网络:

 

简单的深度神经网络


这里,w_1, w_2, ... 是权重,而 b_1, b_2, ... 是偏差,C 则是某个代价函数。回顾一下,从第 j 个神经元的输出a_j = \sigma(z_j),其中 \sigma 是通常的 sigmoid 函数,而 z_j = w_j * a_{j-1} + b_j是神经元的带权输入。我已经在最后表示出了代价函数 C 来强调代价是网络输出 a_4 的函数:如果实际输出越接近目标输出,那么代价会变低;相反则会变高。
现在我们要来研究一下关联于第一个隐藏神经元梯度 dC/db_1。我们将会计算出d C /db_1 的表达式,通过研究表达式来理解消失的梯度发生的原因。
开始就简单地给出dC/db_1的表达式。初看起来有点复杂,但是其结构是相当简单的,我一会儿会解释。下图给出了具体的表达式:


表达式结构如下:对每个神经元有一个 \sigma'(z_j) 项;对每个权重有一个w_j项;还有一个 dC/da_4项,表示最后的代价函数。注意,我已经将表达式中的每个项置于了对应的位置。所以网络本身就是表达式的解读。
你可以直接认可这个表达式,直接跳到该表达式如何关联于小时的梯度问题的。这对理解没有影响,因为实际上上面的表达式只是前面对于BP 的讨论的特例。但是也包含了一个表达式正确的解释,所以去看看那个解释也是很有趣的(也可能更有启发性吧)。
假设我们对偏差 b_1进行了微小的调整 \Delta b_1。这会导致网络中剩下的元素一系列的变化。首先会对第一个隐藏元输出产生一个 \Delta a_1 的变化。这样就会导致第二个神经元的带权输入产生 \Delta z_2的变化。从第二个神经元输出随之发生 \Delta a_2的变化。以此类推,最终会对代价函数产生 \Delta C的变化。这里我们有:

 

 

Paste_Image.png


这表示我们可以通过仔细追踪每一步的影响来搞清楚 dC/db_1的表达式。
现在我们看看\Delta b_1 如何影响第一个神经元的输出a_1的。我们有a_1 = \sigma(z_1) = \sigma(w_1 * a_0 + b1),所以有

 

\sigma'(z_1) 这项看起很熟悉:其实是我们上面关于dC/db_1 的表达式的第一项。直觉上看,这项将偏差的改变 \Delta b_1转化成了输出的变化 \Delta a_1\Delta a_1 随之又影响了带权输入z_2 = w_2 * a_1 + b_2:

\Delta z_2\Delta a_1 的表达式组合起来,我们可以看到偏差 b_1 中的改变如何通过网络传输影响到 z_2的:

现在,又能看到类似的结果了:我们得到了在表达式 dC/db_1 的前面两项。以此类推下去,跟踪传播改变的路径就可以完成。在每个神经元,我们都会选择一个\sigma'(z_j)的项,然后在每个权重我们选择出一个 w_j项。最终的结果就是代价函数中变化 \Delta C的相关于偏差 \Delta b_1 的表达式:

除以 \Delta b_1,我们的确得到了梯度的表达式:

为何出现梯度消失:现在把梯度的整个表达式写下来:

除了最后一项,该表达式是一系列形如w_j \sigma'(z_j) 的乘积。为了理解每个项的行为,先看看下面的sigmoid 函数导数的图像:

 

该导数在 \sigma'(0)=1/4 时达到最高。现在,如果我们使用标准方法来初始化网络中的权重,那么会使用一个均值为 0 标准差为 1 的高斯分布。因此所有的权重通常会满足|w_j| < 1。有了这些信息,我们发现会有 w_j \sigma'(z_j) < 1/4。并且在我们进行了所有这些项的乘积时,最终结果肯定会指数级下降:项越多,乘积的下降的越快。**这里我们敏锐地嗅到了消失的梯度问题的合理解释。
更明白一点,我们比较一下 dC/db_1 和一个更后面一些的偏差的梯度,不妨设为 dC/db_3。当然,我们还没有显式地给出这个表达式,但是计算的方式是一样的。

比较梯度的表达式
两个表示式有很多相同的项。但是 dC/db_1 还多包含了两个项。由于这些项都是 < 1/4 的。所以 d C/db_1会是 dC/db_3 的 1/16 或者更小。这其实就是消失的梯度出现的本质原因了。
当然,这里并非严格的关于消失的梯度微调的证明而是一个不太正式的论断。还有一些可能的产生原因了。特别地,我们想要知道权重w_j在训练中是否会增长。如果会,项 w_j \sigma'(z_j) 会不会不在满足之前 w_j \sigma'(z_j) < 1/4 的约束。事实上,如果项变得很大——超过 1,那么我们将不再遇到消失的梯度问题。实际上,这时候梯度会在我们 BP 的时候发生指数级地增长。也就是说,我们遇到了梯度爆炸的问题。
梯度爆炸问题:现在看看梯度爆炸如何出现的把。这里的例子可能不是那么自然:固定网络中的参数,来确保产生爆炸的梯度。但是即使是不自然,也是包含了确定会产生爆炸梯度(而非假设的可能)的特质的。
共两个步骤:首先,我们将网络的权重设置得很大,比如w_1 = w_2 = w_3 = w_4 = 100。然后,我们选择偏差使得 sigma'(z_j)项不会太小。这是很容易实现的:方法就是选择偏差来保证每个神经元的带权输入是 z_j = 0(这样 sigma'(z_j) = 1/4)。比如说,我们希望z_1 = w_1 * a_0 + b_1。我们只要把b_1 = -100 * a_0即可。我们使用同样的方法来获得其他的偏差。这样我们可以发现所有的项 w_j * \sigma'(z_j)都等于 100*1/4 = 25。最终,我们就获得了爆炸的梯度。
不稳定的梯度问题:根本的问题其实并非是消失的梯度问题或者爆炸的梯度问题,而是在前面的层上的梯度是来自后面的层上项的乘积。当存在过多的层次时,就出现了内在本质上的不稳定场景。唯一让所有层都接近相同的学习速度的方式是所有这些项的乘积都能得到一种平衡。如果没有某种机制或者更加本质的保证来达成平衡,那网络就很容易不稳定了。简而言之,真实的问题就是神经网络受限于不稳定梯度的问题。所以,如果我们使用标准的基于梯度的学习算法,在网络中的不同层会出现按照不同学习速度学习的情况。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值