写在前面
- 此文是我学习AI入门的笔记。学习教材《neural networks and deep learning》,作者Michael Nielsen。
- 这是一本免费的书籍,网址在这里。
- 此文是第五章内容的学习总结,前几章的内容总结可以见我的博客。
- 初学者入门,如有错误,请指正。
消失的梯度问题(The vanishing gradient probm)
当要处理一个比较复杂的问题时,我们往往倾向于将问题分解成一个个简单的问题,逐个解决。
将这一点运用在神经网络上,我们可以使用多层的神经网络来处理问题。
例如,如果我们在进⾏视觉模式识别:
在第⼀层的神经元可能学会识别边。
在第⼆层的神经元可以在边的基础上学会识别出更加复杂的形状,例如三⻆形或者矩形。
第三层将能够识别更加复杂的形状。
依此类推。这些多层的抽象看起来能够赋予深度⽹络⼀种学习解决复杂模式识别问题的能力。
前面我们所搭建的用来识别手写数字的网络,是一个三层(输入层-隐藏层-输出层)的浅层神经网络,第一层784个神经元,第二层30个神经元,第三层10个神经元。
1 | import network2 |
我们使用这个神经网络进行手写数字识别时,达到了96.48%的正确率。(详情见第一章)
让我们尝试再加一层具有30个神经元的隐藏层。
1 | 784, 30, 30, 10]) net = network2.Network([ |
最终结果是,准确率升到了96.90%。
再加一层隐藏层。
1 | 784, 30, 30, 30, 10]) net = network2.Network([ |
准确率降到了96.57%。
再加一层隐藏层。
1 | 784, 30, 30, 30, 30, 10]) net = network2.Network([ |
在具有五层隐藏层的神经网络中,准确度降到了96.53%.
虽然不是一个很明显的下降,但是却告诉我们,深度神经网络在解决问题的时候效率似乎并没有比浅层神经网络好到哪里去。
这显然与我们之前的假设相悖。
问题其实是出现在,我们的学习算法并没有发现正确的权值和偏置。
下面我们将这个问题可视化。
我们选取具有两层有隐藏层的神经网络[784,30,30,10],下图的条状图形给出的是隐藏层最顶部六个神经元学习改变速率 ∂C/∂b
即代价函数关于权重改变的速率。
因为神经网络的权重和偏置是被随机初始化的,所以此处的条状长短不一。
但是还是可以很明显的看出,第二隐藏层的改变速率普遍比第一层要大。
实际的数学计算也表明了这个事实:
如果我们令δ^l^~j~ = ∂C/∂b^l^~j~表示第 l 层的第 j 个神经元的梯度,我们可以将 δ^1^看做是⼀个向量其中元素表⽰第⼀层隐藏层的学习速度,δ^2^ 则是第⼆层隐藏层的学习速度。接着使⽤这些向量的⻓度作为全局衡量这些隐藏层的学习速度的度量。
因此,||δ^1^|| 就代表第⼀层隐藏层学习速度,⽽ ||δ^2^|| 就代表第⼆层隐藏层学习速度。
借助这些定义,在和上图同样的配置下,||δ^1^|| = 0.07 ⽽ ||δ^2^|| = 0.31.
如果我们有三个隐藏层,⽐如说在⼀个 [784, 30, 30, 10] 的⽹络中,那么对应的学习速度就是 0.012, 0.060, 0.283。这⾥前⾯的隐藏层学习速度还是要低于最
后的隐藏层。假设我们增加另⼀个包含 30 个隐藏神经元的隐藏层。那么,对应的学习速度就是:0.003, 0.017, 0.070, 0.285。
还是⼀样的模式:前⾯的层学习速度低于后⾯的层。
以上所述均为训练刚开始时的学习速率,那么,这个速率会随着学习的推移发生什么变化呢?
只有两个隐藏层时的情况:
三层隐藏层的情况:
四层隐藏层的情况:
由此可以得出的一个结论:
在某些深度神经网络中,我们在隐藏层反向传播的时候,梯度倾向于变小。
这意味着前面隐藏层的神经元的学习速率要低于后面隐藏层的神经元。
深度神经网络中梯度的不稳定性
1. 消失梯度的解释
为了弄清楚为何会出现消失的梯度,来看看⼀个极简单的深度神经⽹络:每⼀层都只有⼀个单⼀的神经元。下图就是有三层隐藏层的神经⽹络:
这⾥,w1, w2, . . . 是权重,⽽ b1, b2, . . . 是偏置,C 则是某个代价函数。
我们在这个神经网络的基础上,计算第一个隐藏神经元的梯度∂C/∂b~1~
这里直接给出结论,具体证明过程演示。
除了最后⼀项,该表达式是⼀系列形如 w~j~σ′(z~j~ ) 的乘积。为了理解每个项的⾏为,先看看下⾯的 sigmoid 函数导数的图像:
该导数在 σ′(0) = 1/4 时达到最⾼,所以σ′(0)<= 1/4。
我们使⽤标准⽅法来初始化⽹络中的权重,那么会使⽤⼀个均值为 0 标准差为 1 的⾼斯分布,因此此所有的权重通常会满⾜ |w~j~ | < 1.
因此,我们发现会有 w~j~σ′(z~j~ ) < 1/4。并且在我们进⾏了所有这些项的乘积时,最终结果肯定会指数级下降:项越多,乘积的下降的越快。
这是一个对于梯度消失问题的合理解释。
2. 梯度激增问题(The exploding gradient problem)
当我们的权重在学习的过程中不断增大时,通过前面的计算我们可以知道,前面隐藏层的学习速率会在反向传播的时候获得指数级的增长,这也称为指数激增问题。
3. 不稳定的梯度问题
根本的问题其实并⾮是消失的梯度问题或者激增的梯度问题,⽽是在前⾯的层上的梯度是来⾃后⾯的层上项的乘积。当存在过多的层次时,就出现了内在本质上的不稳定情况。
特别的,对于每一层包含更多神经元的复杂的神经网络,此问题依旧存在。实践中,⼀般会发现在sigmoid ⽹络中前⾯的层的梯度指数级地消失。所以在这些层上的学习速度就会变得很慢了。