《Neural Networks and Deep Learning》(五)笔记
神经网络可以计算任何函数的可视化证明
神经网络的一个最显著的事实就是它可以计算任何的函数,也就是说对定某种复杂而奇特的函数,不管这个函数是什么样的,总会确保有一个神经网络能够对任何可能的输入,其值是网络的输出。
神经网络具有一种普遍性,不论我们想要计算什么样的函数,我们都确信存在一个神经网络可以计算它。这个普遍性定理甚至在我们限制了神经网络只在输入层和输出层之间存在一个中间层的情况下成立,所以即使是很简单的网络架构都极其强大。 其技术性解释参见论文:Approximation by superpositions of a sigmoidal function
地址:(http://www.dartmouth.edu/~gvc/Cybenko_MCSS.pdf)
另外一篇重要的早期论文是:Multilayer feedforward networks are universal approximators
地址:(http://www.sciencedirect.com/science/article/pii/0893608089900208)
深度神经网络为何很难训练?
在某些深度神经网络中, 在我们隐藏层BP的时候梯度倾向于变小. 这意味着在前面的隐藏层中的神经元学习速度要慢于后面的隐藏层. 这儿我们只在一个网络中发现了这个现象, 其实在多数的神经网络中存在着更加根本的导致这个现象出现的原因. 这个现象也被称作是消失的梯度问题(vanishing gradient problem ). 同样会产生问题——在前面的层中的梯度会变得非常大!这也叫做激增的梯度问题(exploding gradient problem),这也没比消失的梯度问题更好处理. 更加一般地说, 在深度神经网络中的梯度是不稳定的, 在前面的层中或会消失, 或会激增. 这种不稳定性才是深度神经网络中基于梯度学习的根本问题 .
三层隐藏层的神经网络
这里,是权重,是偏偏置,则是某个代价函数
梯度整个表达式:
该导数在时达到最高。现在, 如果我们使用标准方法来初始化网络中的权重,那么会使用一个均值为标准差为的高斯分布。因此所有的权重通常会满足。有了这些信息,我们发现会有。并且在我们进行了所有这些项的乘积时,最终结果肯定会指数级下降:项越多,乘积的下降的越快。这里我们敏锐地嗅到了消失的梯度问题的合理解释。
两个表示式有很多相同的项。但是还多包含了两个项。由于这些项都是的。 所以会是的或者更小。这其实就是消失的梯度出现的本质原因。
梯度激增问题
现在看看梯度激增如何出现的。这里的例子可能不是那么自然:固定网络中的参数,来确保产生激增的梯度。但是即使是不自然,也是包含了确定会产生爆炸梯度(而非假设的可能)的特质的。
共两个步骤:首先,我们将网络的权重设置得很大,比如。然后,我们选择偏置使得项不会太小。这是很容易实现的:方法就是选择偏置来保证每个神经元的带权输入是(这样)。
比如,我们希望。我们只要把即可。我们使用同样的方法来获得其他的偏置。这样我们可以发现所有的项都等于。最终,我们就获得了激增的梯度。
不稳定的梯度问题: 根本的问题其实并非是消失的梯度问题或者激增的梯度问题,而是在前面的层上的梯度是来自后面的层上项的乘积。当存在过多的层次时,就出现了内在本质上的不稳定场景。唯一让所有层都接近相同的学习速度的方式是所有这些项的乘积都能得到一种平衡。如果没有某种机制或者更加本质的保证来达成平衡,那网络就很容易不稳定了。简而言之,真实的问题就是神经网络受限于不稳定梯度的问题。所以,如果我们使用标准的基于梯度的学习算法,在网络中的不同层会出现按照不同学习速度学习的情况。
消失的梯度问题普遍存在:
我们已经看到了在神经网络的前面的层中梯度可能会消失也可能会爆炸。实际上,在使用神经元时,梯度通常会消失。为什么?再看看表达式 。为了避免消失的梯度问题,我们需要 。你可能会认为如果很大的时候很容易达成。但是这比看起来还是困难很多。原因在于,项同样依赖于: ,其中是输入的激活函数。所以我们在让变大时,需要同时不让变小。这将是很大的限制了。原因在于我们让变大,也会使得变得非常大。看看的图,这会让我们走到的两翼,这里会去到很小的值。唯一避免发生这个情况的方式是,如果输入激活函数掉入相当狭窄的范围内(这个量化的解释在下面第一个问题中进行)。有时候,有可能会出现。但是一般不大会发生。所以一般情况下,会遇到消失的梯度。
《Neural Networks and Deep Learning》 by Michael Nielsen