《神经网络和深度学习》系列文章四十:什么导致了消失的梯度问题?深度神经网络中的梯度不稳定性

出处: Michael Nielsen的《Neural Network and Deep Learning》,本节译者:朱小虎 、张广宇。

目录

1、使用神经网络识别手写数字

2、反向传播算法是如何工作的

3、改进神经网络的学习方法

4、神经网络可以计算任何函数的可视化证明

5、为什么深度神经网络的训练是困难的

  • 梯度消失问题
  • 什么导致了梯度消失问题?神经网络中的梯度不稳定性
  • 在更加复杂网络中的不稳定性梯度
  • 其他深度学习的障碍

6、深度学习

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

这里, 是权重,而  是偏置, 则是某个代价函数。回顾一下,从第  个神经元的输出 ,其中  是通常的S 型激活函数,而  是神经元的带权输入。我已经在最后表示出了代价函数  来强调代价是网络输出  的函数:如果实际输出越接近目标输出,那么代价会变低;相反则会变高。

现在我们要来研究一下关联于第一个隐藏神经元梯度 。我们将会计算出  的表达式,通过研究表达式来理解消失的梯度发生的原因。

开始就简单地给出  的表达式。初看起来有点复杂,但是其结构是相当简单的,我一会儿会解释。下图给出了具体的表达式:

表达式结构如下:对每个神经元有一个  项;对每个权重有一个  项;还有一个  项,表示最后的代价函数。注意,我已经将表达式中的每个项置于了对应的位置。所以网络本身就是表达式的解读。

你可以直接认可这个表达式,直接跳到该表达式如何关联于小时的梯度问题的。这对理解没有影响,因为实际上上面的表达式只是前面对于反向传播的讨论的特例。但是也包含了一个表达式正确的解释,所以去看看那个解释也是很有趣的(也可能更有启发性吧)。

假设我们对偏置  进行了微小的调整 。这会导致网络中剩下的元素一系列的变化。首先会对第一个隐藏元输出产生一个  的变化。这样就会导致第二个神经元的带权输入产生  的变化。从第二个神经元输出随之发生  的变化。以此类推,最终会对代价函数产生  的变化。这里我们有:

(114) 

这表示我们可以通过仔细追踪每一步的影响来搞清楚  的表达式。

现在我们看看  如何影响第一个神经元的输出  的。我们有 ,所以有

(115) 

 这项看起很熟悉:其实是我们上面关于 的表达式的第一项。直觉上看,这项将偏置的改变  转化成了输出的变化  随之又影响了带权输入 :

(117) 

将  和  的表达式组合起来,我们可以看到偏置 中的改变如何通过网络传输影响到 的:

(119) 

现在,又能看到类似的结果了:我们得到了在表达式  的前面两项。

以此类推下去,跟踪传播改变的路径就可以完成。在每个神经元,我们都会选择一个  的项,然后在每个权重我们选择出一个  项。最终的结果就是代价函数中变化  的相关于偏置  的表达式:

(120) 

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

(121) 

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

(122) 

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

该导数在  时达到最高。现在,如果我们使用标准方法来初始化网络中的权重,那么会使用一个均值为  标准差为  的高斯分布。因此所有的权重通常会满足。有了这些信息,我们发现会有 。并且在我们进行了所有这些项的乘积时,最终结果肯定会指数级下降:项越多,乘积的下降的越快。这里我们敏锐地嗅到了梯度消失问题的合理解释。

更明白一点,我们比较一下  和一个更后面一些的偏置的梯度,不妨设为 。当然,我们还没有显式地给出这个表达式,但是计算的方式是一样的。

两个表示式有很多相同的项。但是  还多包含了两个项。由于这些项都是  的。所以  会是  的 1/16 或者更小。这其实就是消失的梯度出现的本质原因了。

当然,这里并非严格的关于消失的梯度微调的证明而是一个不太正式的论断。还有一些可能的产生原因了。特别地,我们想要知道权重  在训练中是否会增长。如果会,项  会不会不在满足之前  的约束。事实上,如果项变得很大——超过 1,那么我们将不再遇到梯度消失问题。实际上,这时候梯度会在我们BP 的时候发生指数级地增长。也就是说,我们遇到了梯度激增的问题。

梯度激增问题: 现在看看梯度激增如何出现的把。这里的例子可能不是那么自然:固定网络中的参数,来确保产生激增的梯度。但是即使是不自然,也是包含了确定会产生爆炸梯度(而非假设的可能)的特质的。

共两个步骤:首先,我们将网络的权重设置得很大,比如 。然后,我们选择偏置使得  项不会太小。这是很容易实现的:方法就是选择偏置来保证每个神经元的带权输入是 (这样 )。比如说,我们希望 。我们只要把  即可。我们使用同样的方法来获得其他的偏置。这样我们可以发现所有的项  都等于。最终,我们就获得了激增的梯度。

不稳定的梯度问题: 根本的问题其实并非是梯度消失问题或者激增的梯度问题,而是在前面的层上的梯度是来自后面的层上项的乘积。当存在过多的层次时,就出现了内在本质上的不稳定场景。唯一让所有层都接近相同的学习速度的方式是所有这些项的乘积都能得到一种平衡。如果没有某种机制或者更加本质的保证来达成平衡,那网络就很容易不稳定了。简而言之,真实的问题就是神经网络受限于不稳定梯度的问题。所以,如果我们使用标准的基于梯度的学习算法,在网络中的不同层会出现按照不同学习速度学习的情况。

练习

  • 在我们对于梯度消失问题讨论中,使用了  这个结论。假设 我们使用一个不同的激活函数,其导数值是非常大的。这会帮助我们避免不稳定梯度的问 题么?

梯度消失问题普遍存在: 我们已经看到了在神经网络的前面的层中梯度可能会 消失也可能会爆炸。实际上,在使用 sigmoid 神经元时,梯度通常会消失。为什么?再看看 表达式 。为了避免梯度消失问题,我们需要 。你可能会认为如果  很大的时候很容易达成。但是这比看起来还是困难很多。原因在于, 项同样依赖于 ,其中  是输入的激活函数。所以我们在让  变大时,需要同时不让  变小。这将是很大的限制了。原因在于我们让  变大,也会使得  变得非常大。看看  的图,这会让我们走到  的两翼,这里会去到很小的值。唯一避免发生这个情况的方式是,如果输入激活函数掉入相当狭窄的范围内(这个量化的解释在下面第一个问题中进行)。有时候,有可能会出现。但是一般不大会发生。所以一般情况下,会遇到消失的梯度。

问题

  • 考虑乘积 。假设有 。(1)这种情况只有在 的时候才会出现。(2)假设 ,考虑那些满足  的输入激活 集合。证明:满足上述条件的该集合能够充满一个不超过 宽度的区间。(3)数值上说明上述表达式在  时候去的最高值约。所以即使每个条件都满足,我们仍然有一个狭窄的输入激活区间,这样来避免梯度消失问题。
  • 幺神经元:考虑一个单一输入的神经元,,对应的权重 ,偏差 ,输出上的权重 。证明,通过合理选择权重和偏差,我们可以确保 其中。这样的神经元可用来作为幺元用,输出和输入相同(成比例)。提示:可以重写 ,可以假设  很小,和在  使用泰勒级数展开。

本文来源于哈工大SCIR

原文链接点击即可跳转

工程理论书籍神经网络深度学习梯度哈工大
返回顶部