深度学习-训练深度神经网络的难点:vanishing gradient problem与exploding gradient problem
2018-01-27 17:05
781 查看
学习彭亮《深度学习进阶:算法与应用》课程
我们用以上神经网络达到了98%的accuracy
更深层的神经网络:
可以学习到不同抽象程度的概念.
如何训练深度神经网络?
难点: 神经网络的不同层学习的速率显著不同;接近输出层学习速率比较合适时, 前面的层学习太慢, 有时被困住
accuracy: 96.48%
(2)四层 (两个隐藏层):
accuracy: 96.9%
(3)五层 (三个隐藏层):
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
假设每层只有一个神经元
得到的∂C/∂b1的表达式:
对b1的一个小变化引起C的变化
如何引起b1的变化:
a1的变化又引起 z2 的变化: z2= w2*a1 + b2
把以上a1的变化代入z2的变化:
以上公式的规律, 推z3, z4的变化, 一直到输出层, 得到:
等式两边同除以b1的变化,得到:
σ′的图像:
函数最高点σ′(0) = 1/4
按照平时随机从正态分部(0,1)中随机产生权重的方法
大部分|w| < 1,
对于以上公式的多项乘积来讲, 层数越多, 连续乘积越小:
初始化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问题
2013 Sutskever, Martens, Dahl and Hinton*: 随机初始权重和偏向时, 提出momentum-based stochastic gradient descent
综上所属, 训练深度神经网络中有很多难点.
本节课: 神经网络的不稳定性
activation方程的选择
初始化权重和偏向的方法
具体更新的过程
hyper-parameter的选择
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的问题
概述
到目前为止, 我们例子中使用的神经网络一共只有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的问题
相关文章推荐
- 利用遗传算法优化神经网络:Uber提出深度学习训练新方式
- 深度学习之五:使用GPU加速神经网络的训练
- 深度学习源码剖析:使用双线性插值方式初始化神经网络的可训练参数
- 王小草【深度学习】笔记第三弹--神经网络细节与训练注意点
- 【神经网络与深度学习】用训练好的caffemodel来进行分类
- 【神经网络与深度学习】基于Windows+Caffe的Minst和CIFAR—10训练过程说明
- 【神经网络与深度学习】在Windows8.1上用VS2013编译Caffe并训练和分类自己的图片
- 【神经网络与深度学习】Caffe使用step by step:使用自己数据对已经训练好的模型进行finetuning
- TensorFlow入门深度学习--02.构建神经网络训练算法的步骤
- 【神经网络与深度学习】如何将别人训练好的model用到自己的数据上
- 【计算机视觉】【神经网络与深度学习】YOLO v2 detection训练自己的数据2
- Deep Learning(深度学习)之(五)神经网络训练中的高效BP(反向传播算法)
- Coursera deeplearning.ai 深度学习笔记2-1-Practical aspects of deep learning-神经网络实际问题分析(初始化&正则化&训练效率)与代码实现
- 基于PyTorch的深度学习入门教程(五)——训练神经网络分类器
- [计算机视觉][神经网络与深度学习]Faster R-CNN配置及其训练教程
- 【神经网络与深度学习】Caffe Model Zoo许多训练好的caffemodel
- 神经网络与深度学习笔记——第5章 深度神经网络为何很难训练
- [计算机视觉][神经网络与深度学习]SSD安装及其训练教程
- 【神经网络与深度学习】Caffe训练执行时爆出的Check failed: registry.count(t ype) == 1 (0 vs. 1) Unknown layer type
- 分布式深度学习:神经网络的分布式训练