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

深度学习-训练深度神经网络的难点:vanishing gradient problem与exploding gradient problem

2018-01-27 17:05 781 查看
学习彭亮《深度学习进阶:算法与应用》课程

概述

到目前为止, 我们例子中使用的神经网络一共只有3层 (一个隐藏层):



我们用以上神经网络达到了98%的accuracy

更深层的神经网络:



可以学习到不同抽象程度的概念.

如何训练深度神经网络?

难点: 神经网络的不同层学习的速率显著不同;接近输出层学习速率比较合适时, 前面的层学习太慢, 有时被困住

消失的gradient问题 (vanishing gradient problem):

(1)三层 (一个隐藏层):

net = network2.Network([784, 30, 10])


accuracy: 96.48%

(2)四层 (两个隐藏层):

net = network2.Network([784, 30, 30, 10])


accuracy: 96.9%

(3)五层 (三个隐藏层):

net = network2.Network([784, 30, 30, 30, 10])


accuracy: 96.57%

为什么加入一层反而降低了准确率?



条形区域长度代表∂C/∂b, Cost对于bias的变化率:

随机初始化, 看到第一层学习的速率远远低于第二层学习的速率

进一步通过计算来验证:



代表学习速率

以上图中:

∥δ1∥=0.07, ∥δ2∥=0.31

(1)在5层的神经网络中: [784,30,30,30,10]

学习速率分别为: 0.012, 0.060, and 0.283(越往后学习率越高)

以上只是初始的时候的学习率, 当神经网络在训练过程中, 随epoch增加时学习率变化:



1000张训练图片, 看出两层的学习率明显差异

(2)另外一个例子: [784,30,30,30,10]



(3)再增加一层: [784,30,30,30,30,10]



可以看出, 第一个隐藏层比第四个几乎要慢100倍

这种现象普遍存在于神经网络之中, 叫做: vanishing gradient problem

另外一种情况是内层的梯度被外层大很多, 叫做exploding gradient problem

所以说神经网络算法用gradient之类的算法学习存在不稳定性

训练深度神经网络, 需要解决vanishing gradient problem

vanishing gradient problem

造成vanishing gradient problem的原因:

假设每层只有一个神经元



得到的∂C/∂b1的表达式:



对b1的一个小变化引起C的变化



如何引起b1的变化:



a1的变化又引起 z2 的变化: z2= w2*a1 + b2



把以上a1的变化代入z2的变化:



以上公式的规律, 推z3, z4的变化, 一直到输出层, 得到:



等式两边同除以b1的变化,得到:



σ′的图像:



函数最高点σ′(0) = 1/4

按照平时随机从正态分部(0,1)中随机产生权重的方法

大部分|w| < 1,



对于以上公式的多项乘积来讲, 层数越多, 连续乘积越小:



为了修正vanishing gradient problem问题:

初始化比较大的权重: 比如 w1=w2=w3=w4=100

初始化b使

不要太小。

(比如为了让σ′最大(也就是=1/4), 我们可以通过调节b让z=0:b1 = -100*a0;z1 = 100 * a0 + -100*a0 = 0)

这种情况下:



= 100 * 1/4 = 25

每层是前一层的25倍, 又出现了exploding的问题

从根本来讲, 不是vanishing或者exploding的问题, 而是后面层的的梯度是前面层的累积的乘积, 所以神经网络非常不稳定. 唯一可能的情况是以上的连续乘积刚好平衡大约等于1, 但是这种几率非常小.

所以, 这是一个不稳定的梯度问题, 通常有多层后, 每层网络都以非常不同的速率学习

总体, vanishing problem具有普遍性:

如果想要客克服vanishing problem, 需要



的绝对值>1, 我们可以尝试赋值w很大, 但是问题是 σ′(z) 也取决于w: σ′(z)=σ′(wa+b)

所以我们要让w大的时候, 还得注意不能让σ′(wa+b)变小, 这种情况非常少见, 除非输入值在一个非常小的区间内

刚才的例子只是一每层一个神经元:



在每层多个神经元的情况下:



在l层的gradient (L层神经网络):



矩阵和向量的表示, 与之前类似

所以只要是sigmoid函数的神经网络都会造成gradient更新的时候及其不稳定, vanishing or exploding问题

训练深度神经网络的其他难点:

2010 Glorot and Bengio*: sigmoid函数造成输出层的activation大部分饱和0, 并且建议了其他的activation函数

2013 Sutskever, Martens, Dahl and Hinton*: 随机初始权重和偏向时, 提出momentum-based stochastic gradient descent

综上所属, 训练深度神经网络中有很多难点.

本节课: 神经网络的不稳定性

activation方程的选择

初始化权重和偏向的方法

具体更新的过程

hyper-parameter的选择

解决vanishing gradient方法:



softplus函数可以被max函数模拟 max(0, x+N(0,1))

max函数叫做Rectified Linear Function (ReL)



Sigmoid和ReL方程主要区别:

Sigmoid函数值在[0, 1], ReL函数值在[0, ∞], 所以sigmoid函数方面来描述概率, 而ReL适合用来描述实数

Sigmoid函数的gradient随着x增大或减小和消失

ReL 函数不会:

gradient = 0 (if x < 0), gradient = 1 (x > 0)

Rectified Linear Unit在神经网络中的优势:

不会产生vanishing gradient的问题
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐