Monthly Archives: April 2019

Neural Networks and Deep Learning(五)为什么深度神经网络难以训练

本章我们将分析一下为什么深度神经网络难以训练的问题。

首先来看问题:如果神经网络的层次不断加深,则在BP误差反向传播的过程中,网络前几层的梯度更新会非常慢,导致前几层的权重无法学习到比较好的值,这就是梯度消失问题(The vanishing gradient problem)。

以我们在第三章学习的network2.py为例(交叉熵损失函数+Sigmoid激活函数),我们可以计算每个神经元中误差对偏移量$b$的偏导$\partial C/ \partial b$,根据第二章BP网络的知识,$\partial C/ \partial b$也是$\partial C/ \partial w$的一部分(BP3和BP4的关系),所以如果$\partial C/ \partial b$的绝对值大,则说明梯度大,在误差反向传播的时候,$b$和$w$更新就快。

Continue reading

Neural Networks and Deep Learning(四)图解神经网络为什么能拟合任意函数

我们应该都听说过神经网络强大到能拟合任意一个函数,但细究起来很少有人能论证这个观点,这一章就用通俗易懂的图解方式来证明神经网络为什么能拟合任意一个函数。

开始介绍之前,有两点需要注意:

  1. 并不是说神经网络可以精确计算任意一个函数f(x),而是说当隐藏层神经元增加时,可以无限逼近f(x),比如对于任何一个输入x,网络的输出g(x)和正确值f(x)的差小于某个阈值,|g(x) - f(x)| < \epsilon
  2. 神经网络拟合的是连续函数,而不是那种不连续、离散、急剧变化的函数。

假设给定一个下图的连续函数,函数形式未知,本章将用图解的方式来证明,一个单隐层的神经网络就可以很好的拟合这个未知函数。

Continue reading

Neural Networks and Deep Learning(三·三)权重初始化及其他

权重初始化

在之前的章节中,我们都是用一个标准正态分布N(0,1^2)初始化所有的参数wb,但是当神经元数量比较多时,会出现意想不到的问题。

假设一个神经网络的输入层有1000个神经元,且某个样本的1000维输入中,恰好有500维是0,另500维是1。我们目前考察隐藏层的第一个神经元,则该神经元为激活的输出为z = \sum_j w_j x_j+b,因为输入中的500维是0,所以z相当于有501个来自N(0,1^2)的随机变量相加。因为w_jb的初始化都是独立同分布的,所以z也是一个正态分布,均值为0,但方差变成了\sqrt{501} \approx 22.4,即z\sim N(0,\sqrt{501}^2)。我们知道对于正态分布,如果方差越小,则分布的形状是高廋型的;如果方差越大,则分布的形状是矮胖型的。所以z有很大的概率取值会远大于1或远小于-1。又因为激活函数是sigmoid,当z远大于1或远小于-1时,\sigma (z)趋近于1或者0,且导数趋于0,变化缓慢,导致梯度消失。

Continue reading