您的位置:首页 > 理论基础 > 计算机网络

Neural Networks and Deep Learning学习笔记ch5 - 为什么深度神经网络很难训练?

2016-01-23 21:41 489 查看

深度神经网络

前面的章节介绍了反向传播算法和一些常见的改进神经网络的训练效果的方法。前面还只是停留在只有一个隐藏层的神经网络。



如上图所示,这样的一个神经网络就只有输入、输出层和一个隐藏层。在手写字体识别例子中,这样一个简单的神经网络能够达到98%的正确率!可以预料到,如果增加隐藏层的层数,那么神经网络的学习能力将更加强,可以学习到更加抽象的概念。



如上所示为一包含三个隐藏层的神经网络,假如第一层能够学习到边的特征,那么第二层就能学习到更复杂一点的形状,比如三角形,矩形。第三层就能学习到更复杂的形状了,依次类推。

那么该如何训练这样的深度神经网络呢?

先看看用之前的反向传播算法的随机梯度下降法来训练神经网络会怎样。按照前面讨论的,神经网络层数越多,学习能力越强。但是,实际上在上面的例子中,增加隐藏层的层数,手写字体的识别正确率反而变小了。为什么会这样呢?

梯度消亡问题-The vanishing gradient problem

假如上面的神经网络中添加的隐藏层从理论上是可以增强学习能力的,但是神经网络没有学习到正确的权重。那么就要弄清楚神经网络的学习算法到底出什么问题了,怎样采样学习到正确的权重。

为了弄清楚问题出在哪里,先来把神经网络的学习过程可视化一下。假设有一个[784,30,30,10][784, 30, 30, 10]的神经网络,也就是有两个隐藏层,每一个隐藏层有30个神经元。对每一个神经元,有梯度∂C/∂b\partial C/ \partial b,也就是代价函数对神经元的偏置的梯度,如前面第二章中所述,这个梯度的大小不仅代表了在学习过程中偏置变化的速度,也代表了权重系数的变化速度。让梯度表示为δlj=∂C/∂blj\delta^l_j= \partial C /\partial b^l_j,也就是第ll层的第jj个神经元的梯度。可以把δ1\delta^1看作是一个向量,向量的每一个元素的大小决定了第一个隐藏层学习的快慢,同样δ2\delta^2的每一个元素的大小决定了第二个隐藏层学习的快慢。然后用这些向量的大小来粗略地表示对应隐藏层的学习速度。然后发现∥δ1∥=0.07\| \delta^1 \| =0.07和∥δ2∥=0.31\| \delta^2 \| =0.31,可以发现第二层的神经元比第一层的神经元的学习速度要快得多!

如果添加更多的隐藏层会发生什么?如果有一个有三个隐藏层的神经网络,[784,30,30,30,10][784,30,30,30,10],那么每层的神经元的学习速率会是0.012,0.060,0.2830.012, 0.060, 0.283,同样,在前面的隐藏层的神经元学习速率要比后一层隐藏层的学习速率慢得多。如果再增加一层隐藏层,对应层的学习速率会是0.003,0.017,0.070,0.285 0.003, 0.017, 0.070, 0.285。可以看出规律,前面的层学习得比后面的层要慢!

前面讨论的是在训练刚开始的时候的学习速率问题。那么在训练神经网络的过程中学习速度是怎样变化的呢?







从图中可以看到,在深度神经网络中,梯度在隐藏层中从后往前传播的时候会变得越来越小,这意味着在靠前的神经元的学习速度要比靠后层的神经元的学习速度要慢得多。这个现象就是梯度消亡问题

为什么会发生梯度消亡问题?怎么避免呢?事实上,梯度消亡并不是不可避免的,不过又可能会造成梯度爆炸问题(exploding gradient problem),这个问题和梯度消亡一样麻烦。更一般地说,这表明神经网络是不稳定的,趋向于发生梯度消亡或者梯度爆炸。这个不稳定性是神经网络的训练中基于梯度的学习方法的普遍问题。要弄清楚这个问题,就要一步一步来分析。

是什么造成了梯度消亡问题?

由前面的反向传播算法的公式δl=((wl+1)Tδl+1)⊙σ′(zl)−−(BP2)\delta^l=((w^{l+1})^T\delta^{l+1})⊙\sigma'(z^l) --(BP2)可以看到,δ\delta在反向往前传播的时候,都是先要跟权重系数ww做一个内积,然后再跟σ′(z)\sigma'(z)做点乘,假如神经网络按照第三章中的均值为00、方差为1/nin1/{n_{\rm in}}的正态分布初始化,那么ww会是一个比较小的数,同时sigmoid函数的梯度的最大值是0.25,这样的话δ\delta在往后传播的过程中会越来越小。



如图,sigmoid函数的导数的最大是0.25,也就是说每往前传播一层,δ\delta至少要变小为1/41/4倍。这就是梯度消亡问题的根源!

梯度爆炸问题

前面是假设ww初始化为很小的数,就会发生梯度消亡的问题。如果ww的值为很大,比如w1=w2=w3=w4=100w_1 = w_2 =w_3 = w_4 = 100,然后要选择偏置值使σ′(z)\sigma'(z)得值不会太小。其实可以很容易做到这,只需要让神经元的输入为00,例如想让z1=w1a0+b1=0z_1 = w_1 a_0 + b_1 = 0,可以让b1=−100∗a0b_1 = -100 * a_0,这样就可以让wjσ′(zj)w_j\sigma'(z_j)项等于100*0.25=25。这样就可以导致梯度爆炸问题了。

总而言之,神经网络的不稳定性是因为使用了基于梯度的学习方法,导致神经网络中的不同层的学习速度差别很大。

深度学习中的其他障碍

首先,在一篇 Glorot and Bengio2010年的论文发现了sigmoid函数会给训练深度网络造成一些问题。他们发现使用sigmoid函数,会使最后一个隐藏层的激活变量在训练初期就饱和到0了,这使得学习急剧地变慢了。同样也可以看看 Efficient BackProp, by Yann LeCun, Léon Bottou, Genevieve Orr and Klaus-Robert Müller (1998).

另外,在另一篇2013年的论文On the importance of initialization and momentum in deep learning中作者研究了随机权重初始化和惯性量的使用,仔细地选择好的方式会给训练神经网络带来很大的区别。

这些例子表明是现在并不完全清楚是什么因素导致了深度网络很难训练。这是个很复杂的问题。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: