2019-03-01 20:59:51 m0_37180911 阅读数 116

挑战:局部最优、鞍点、梯度悬崖和梯度消失

局部最优

详解机器学习中的梯度消失、爆炸原因及其解决方法
并不是找到全局最优点。局部最优点也可以,泛化性能也通常比最优解好。

鞍点

梯度悬崖

这是由于几个较大的权重相乘导致的

梯度消失

解决:ReLU

梯度爆炸

如果上层的权重过大,当经过传递后,本层的梯度就会变得异常巨大,造成梯度非常不稳定。

梯度不精确

导致训练的稳定性较差,但梯度不精确又是也可以看作是防止过拟合以及逃离局部最优或鞍点的方法。

优化算法

批量梯度下降

Batch Gradient Descent,BGD
整个训练数据集的数据计算梯度。更新权重。
优点:准确,下降快。
缺点:计算慢,不能投入新数据,若存在相似样本出现冗余。
对于凸函数可以收敛到全局极小值,对于非凸函数可以收敛到局部极小值。

随机梯度下降

Stochastic Gradient Descnet,SGD
选择一条数据,就训练一条数据,然后修改一次权重。
缺点:可能选择错误标记的数据/与正常数据差异很大的数据。导致此数据求得的梯度有很大的偏差。有很强的随机性。cost function有严重的震荡。
优点:没有冗余,比较快,可以新增样本,
学习率(学习率衰减)、选择多条数据

最小批量梯度下降

Mini-Batch Gradient Descent,MBGD
每一次利用一小批样本
可以降低参数更新时的方差,收敛更稳定。可以充分利用深度学习库中高度优化的矩阵操作来进行更有效地梯度计算。

learning rate选择太小收敛速度慢,如果太大,loss function就会在极小值处不停地震荡甚至偏离。在鞍点,BGD会停止不动,如果是MBGD或SGD,会发生震荡。如果是mini-batch或者SGD,每次找到的梯度都是不同的,就会发生震荡,来回跳动。

指数加权平均
减少噪音,刻画了原数据地趋势。
加权系数是随着时间以指数形式递减的,时间越靠近,权重越大,越靠前,权重越小。

动量学习法

加速SGD,抑制震荡
加速学习过程,可以在鞍点处继续前行,也可以逃离一些较小的局部最优区域
0.9

AdaGrad

adaptive gradient algorithm
将每一维各自的历史梯度的平方叠加起来,然后在更新的时候除以该历史梯度值即可。
缺点:容易收到‘过去’的影响,梯度很容易就累积到很大的值,此时学习率就会被降低的非常厉害。

Adadelta

没有学习率超参数
Adadelta
2
Adadelta 是 Adagrad 的一个具有更强鲁棒性的的扩展版本,它不是累积所有过去的梯度,而是根据渐变更新的移动窗口调整学习速率

RMSProp

Root Mean Square Prop
在AdaGrad的版本上引入衰减因子
在‘过去’和‘现在’做一个权衡。

Adam

Momentum+RMSProp的微调版本

参数初始化策略

初始点不好:学习算法可能根本无法收敛,也可能造成学习算法不稳定。
不同的参数也决定着学习的收敛速度以及能否降低到足够低的损失值区域。
尽量避免神经元参数出现对称情况。
随机初始化方式:均匀分布/高斯分布
较大的初始值权重范围:
有点:有效的避免参数对称线性、减少神经元冗余现象,帮助减轻训练网络时的梯度消失问题。
缺点:梯度爆炸问题,Sigmoid出现过饱和现象。

批量归一化

归一化:将数据的输入值减去其均值然后处以数据的标准差。
批量归一化:在网络的每一层都进行数据归一化处理。批量归一化中的‘批量‘其实就是采样一小批数据,然后对该批数据在网络各层的输出进行归一化处理。
目的:把神经网络每一层的输入数据都调整到均值为零,方差为1的标准正态分布。
BN就是把输入值尽可能地归一化在激活函数这一狭窄区域。:减低网络地性能。
另一个步骤:再将归一化地数据放大,平移回非线性区域。

2018-04-15 19:53:25 shwan_ma 阅读数 715

在开玩笑的时候,我们自称研究深度学习的人为炼丹师。所谓炼丹,就是拿到同一种丹药的配方,可能炼出来的丹药的效果也是不一样的。深度学习也是如此,同一种模型,采取不同的优化策略,所得到的结果往往不同。在探究深度学习算法的优化策略过程中,人们大概经历过以下几个阶段:
SGD-> Momentum -> Nesterov -> Adagrad -> RMSProp -> Adam ->Nadam

由于最近在准备实习面试中,特开一篇博客对上述几种优化算法进行回顾,也方便自己总结。

一、随机梯度下降(SGD)

SGD算法是一种非常经典的优化算法,其衍生于批梯度下降(BGD)算法。由于 BGD算法需要对整个训练集进行计算梯度,然后再进行更新梯度,其带来的开销是非常大的。因此 用一个mini-batch去更新梯度可以有效减少计算开销,加速收敛,还不容易陷入鞍点。
这里写图片描述

值得注意的是在真实采用SGD进行训练的时候,有必要随着时间进行逐渐降低学习率,这是因为SGD中在梯度估计引入的噪声源(由于只用了m个样本)并不会在极小点消失。

二、动量(Momentum)
从SGD上受到的启发,由于SGD只用了m个样本,容易在梯度估计的时候引入噪声,因此带来一个结果便是梯度更新的时候会在高曲率的方向震荡,这在一定程度上降低了收敛速度。因此momentum算法采用移动平均减缓梯度在高区率方向上的更新,从而加速整体的收敛。


这里写图片描述

其中红色的梯度更新线是采用momentum算法后的优化路径。
这里写图片描述

这里稍微简单介绍一下动量的概念:当梯度更新进行震荡时,我们方向其方向是不停的变化的,动量便会像摩擦力一样试图保持原来的方向,从而降低震荡方向梯度的更新。
当梯度的更新都指向同一方向时,动量便会使得梯度更新的速度越来越快。

三、Nesterov动量
Nesterov动量 认为,竟然梯度方向是当年mini-batch样本更新的方向说了不算,那为什么不按照原来动量的方向去更新看看,然后在计算更新后的梯度,从而进行校正呢?

这里写图片描述
值得注意的是:在凸批量梯度的情况下,Nesterov 动量将额外误差收敛率从O(1/k)改进到O(1/k^2),然而在随机梯度的情况下,Nesterov并没有改进收敛率。

四、AdaGrad
我们发现SGD需要我们设置对学习率进行衰减,从而降低随机样本带来的梯度噪声。而AdaGrad算法的提出独立适应所有模型参数的学习率,缩放每个参数反比于其所有历史平方值总和的平方根。这样带来的好处是,更新快的给他慢下来,更新慢的给他快上去。原因很简单,更新快的往往是震荡部分,更新慢的往往是趋优部分。也就从AdaGrad开始,优化算法开始趋向选择自适应学习速率。
这里写图片描述
Adagrad的缺点也很明显:对于训练深度神经网络模型而言:从训练开始时积累梯度平方会导致有效学习率过早和过量的减少。

五、RMSProp
由于AdaGrad根据平方梯度的整个历史收缩学习率,可能 RMSprop观测到Adagrad优化算法中的缺点,并也对此进行了改进。选择移动平均来对梯度的平方进行累积,可能使得学习率在达到这样的凸结构就变得太小了。RMSProp使用指数衰减平均以丢弃遥远过去的历史,使其能够在凸碗状结构后快速收敛。
这里写图片描述

六、Adam
Adam在RMSProp的基础又增加了梯度的动量,融合了一阶,二阶的动量得到的优化算法。
这里写图片描述

七、Nadam
这个算法就不多介绍了,就是前面算法的集大成者。在Adam的基础上了增加了Nesterov。

================================================================================

关于指数平均:

V <= beta * V + (1-beta) * theta
V可以近似看作为 1/(1-beta) 个数据的平均值, 如beta=0.1,则近似为10个数据的平均值

关于Adam里的偏差修正:
这是由于在初始的更新时,并没有 1/(1-beta) 的数据,举个例子来看:


这里写图片描述

原先应该是绿色的曲线,变成了紫色曲线。由图中可以看到,紫色曲线的起点较低,但随之数据增大,其实影响也不大。为了更好的修正,往往对指数平均进行如下偏差修正:

这里写图片描述

参考自:
http://mooc.study.163.com/learn/2001281003?tid=2001391036#/learn/content?type=detail&id=2001702122
https://zhuanlan.zhihu.com/p/32230623

其他的一些经验:

1。实际上我们看到自从RMSProp和Adam引入二阶动量后,对整个梯度更新速度加快了。然而很可能导致不收敛的状态。原因其实也很简单,因为AdaGrad 是累积二阶矩,随着训练的加深,二阶矩的累加会导致学习速率很降低。而Adam和RMSProp则容易出现不收敛的状态。
2。 由于Adam的收敛速度确实很快,所以一般初学者还是推荐使用Adam。对于一些进阶者,依旧推荐SGD的调参方式。要相信:精调的参数一定比自适应的要好。

2018-03-15 17:24:29 u013498583 阅读数 286

深度学习最全优化方法总结比较(SGD,Adagrad,Adadelta,Adam,Adamax,Nadam)

转载自:https://zhuanlan.zhihu.com/p/22252270

SGD
此处的SGD指mini-batch gradient descent,关于batch gradient descent, stochastic gradient descent, 以及 mini-batch gradient descent的具体区别就不细说了。现在的SGD一般都指mini-batch gradient descent。

SGD就是每一次迭代计算mini-batch的梯度,然后对参数进行更新,是最常见的优化方法了。即:

gt=θt1f(θt1)

Δθt=ηgt

其中,η是学习率,gt是梯度

SGD完全依赖于当前batch的梯度,所以\eta可理解为允许当前batch的梯度多大程度影响参数更新

缺点:(正因为有这些缺点才让这么多大神发展出了后续的各种算法)

选择合适的learning rate比较困难
- 对所有的参数更新使用同样的learning rate。对于稀疏数据或者特征,有时我们可能想更新快一些对于不经常出现的特征,对于常出现的特征更新慢一些,这时候SGD就不太能满足要求了

SGD容易收敛到局部最优,并且在某些情况下可能被困在鞍点【原来写的是“容易困于鞍点”,经查阅论文发现,其实在合适的初始化和step size的情况下,鞍点的影响并没这么大。感谢@冰橙的指正】

Momentum
momentum是模拟物理里动量的概念,积累之前的动量来替代真正的梯度。公式如下:

mt=μmt1+gt

Δθt=ηmt

其中,μ是动量因子

特点:

下降初期时,使用上一次参数更新,下降方向一致,乘上较大的μ能够进行很好的加速
下降中后期时,在局部最小值来回震荡的时候,gradient0μ使得更新幅度增大,跳出陷阱
在梯度改变方向的时候,μ能够减少更新

总而言之,momentum项能够在相关方向加速SGD,抑制振荡,从而加快收敛

Nesterov
nesterov项在梯度更新时做一个校正,避免前进太快,同时提高灵敏度。
将上一节中的公式展开可得:

Δθt=ημmt1ηgt

可以看出,mt1
并没有直接改变当前梯度gt,所以Nesterov的改进就是让之前的动量直接影响当前的动量。即:

gt=θt1f(θt1ημmt1)

mt=μmt1+gt

Δθt=ηmt

所以,加上nesterov项后,梯度在大的跳跃后,进行计算对当前梯度进行校正。如下图:

这里写图片描述

momentum首先计算一个梯度(短的蓝色向量),然后在加速更新梯度的方向进行一个大的跳跃(长的蓝色向量),nesterov项首先在之前加速的梯度方向进行一个大的跳跃(棕色向量),计算梯度然后进行校正(绿色梯向量)

其实,momentum项和nesterov项都是为了使梯度更新更加灵活,对不同情况有针对性。但是,人工设置一些学习率总还是有些生硬,接下来介绍几种自适应学习率的方法

Adagrad
Adagrad其实是对学习率进行了一个约束。即:

nt=nt1+gt2

Δθt=ηnt+ϵgt

此处,对gt从1到t进行一个递推形成一个约束项regularizer1r=1t(gr)2+ϵϵ用来保证分母非0

特点:

前期gt较小的时候, regularizer较大,能够放大梯度
后期gt较大的时候,regularizer较小,能够约束梯度
适合处理稀疏梯度

缺点:
由公式可以看出,仍依赖于人工设置一个全局学习率
η设置过大的话,会使regularizer过于敏感,对梯度的调节太大
中后期,分母上梯度平方的累加将会越来越大,使gradient\to0,使得训练提前结束

Adadelta
Adadelta是对Adagrad的扩展,最初方案依然是对学习率进行自适应约束,但是进行了计算上的简化。
Adagrad会累加之前所有的梯度平方,而Adadelta只累加固定大小的项,并且也不直接存储这些项,仅仅是近似计算对应的平均值。即:

nt=νnt1+(1ν)gt2

Δθt=ηnt+ϵgt

在此处Adadelta其实还是依赖于全局学习率的,但是作者做了一定处理,经过近似牛顿迭代法之后:

E|g2|t=ρE|g2|t1+(1ρ)gt2

Δxt=r=1t1ΔxrE|g2|t+ϵ

其中,E代表求期望。

此时,可以看出Adadelta已经不用依赖于全局学习率了。

特点:

训练初中期,加速效果不错,很快
训练后期,反复在局部最小值附近抖动

RMSprop
RMSprop可以算作Adadelta的一个特例:

ρ=0.5时,E|g2|t=ρE|g2|t1+(1ρ)gt2就变为了求梯度平方和的平均数。

如果再求根的话,就变成了RMS(均方根):

RMS|g|t=E|g2|t+ϵ
此时,这个RMS就可以作为学习率\eta的一个约束:

Δxt=ηRMS|g|tgt
特点:

其实RMSprop依然依赖于全局学习率
RMSprop算是Adagrad的一种发展,和Adadelta的变体,效果趋于二者之间
适合处理非平稳目标
- 对于RNN效果很好

Adam
Adam(Adaptive Moment Estimation)本质上是带有动量项的RMSprop,它利用梯度的一阶矩估计和二阶矩估计动态调整每个参数的学习率。Adam的优点主要在于经过偏置校正后,每一次迭代学习率都有个确定范围,使得参数比较平稳。公式如下:

mt=μmt1+(1μ)gt

nt=νnt1+(1ν)gt2

mt^=mt1μt

nt^=nt1νt

Δθt=mt^nt^+ϵη

其中,mtnt分别是对梯度的一阶矩估计和二阶矩估计,可以看作对期望E|gt|E|gt2|的估计;mt^nt^是对mtnt的校正,这样可以近似为对期望的无偏估计。
可以看出,直接对梯度的矩估计对内存没有额外的要求,而且可以根据梯度进行动态调整,而mt^nt^+ϵ对学习率形成一个动态约束,而且有明确的范围。

特点:

结合了Adagrad善于处理稀疏梯度和RMSprop善于处理非平稳目标的优点
对内存需求较小
为不同的参数计算不同的自适应学习率
也适用于大多非凸优化
- 适用于大数据集和高维空间

Adamax
Adamax是Adam的一种变体,此方法对学习率的上限提供了一个更简单的范围。公式上的变化如下:

nt=max(νnt1,|gt|)

Δx=mt^nt+ϵη

可以看出,Adamax学习率的边界范围更简单

Nadam
Nadam类似于带有Nesterov动量项的Adam。公式如下:

gt^=gt1Πi=1tμi

mt=μtmt1+(1μt)gt

mt^=mt1Πi=1t+1μi

nt=νnt1+(1ν)gt2

nt^=nt1νtmt¯=(1μt)gt^+μt+1mt^

Δθt=ηmt¯nt^+ϵ

可以看出,Nadam对学习率有了更强的约束,同时对梯度的更新也有更直接的影响。一般而言,在想使用带动量的RMSprop,或者Adam的地方,大多可以使用Nadam取得更好的效果。

经验之谈
对于稀疏数据,尽量使用学习率可自适应的优化方法,不用手动调节,而且最好采用默认值
SGD通常训练时间更长,但是在好的初始化和学习率调度方案的情况下,结果更可靠
如果在意更快的收敛,并且需要训练较深较复杂的网络时,推荐使用学习率自适应的优化方法。
Adadelta,RMSprop,Adam是比较相近的算法,在相似的情况下表现差不多。
在想使用带动量的RMSprop,或者Adam的地方,大多可以使用Nadam取得更好的效果

2017-10-27 00:03:02 xiaocui235 阅读数 1817

本文按以下目录编排
一、Mini-batch梯度下降
二、优化算法
2.1 平均加权(Exponentially Weight Average)
2.2 动量(Momentum)梯度下降法
2.3 RMSprop算法
2.4 Adam优化算法
2.5 学习率衰减
三、局部最优
参考文献

一、Mini-batch梯度下降

优化算法可以帮助加快训练模型,其中一个难点在于深度学习没有在大数据领域发挥最大的效果。在巨大的数据集的基础上来训练模型速度很慢,使用快速的优化算法比好的优化算法能大大提高效率。Mini-batch梯度下降是一个有效的应用。
这里写图片描述
如果数据样本有m个,当m很大时,处理速度很慢。只有处理完m个样本时才能进行梯度下降法。如果我们在处理完整个数据之前,先让梯度下降法处理一部分数据,能大大提升速度。我们可以分割为一些子集(Mini-batch),比如先取1000个样本为第一个子样本,对于5000,000的数据就有5000个子样本,对预测值做同样的处理。 X[t]Y[t] 代表不同的Mini-batch的训练数据和标签。具体的Mini-batch梯度下降法如下图所示。
这里写图片描述
对第t个子集执行前向传播,计算第t个子集的成本函数 J[t]。执行反向传播来计算 J[t]的梯度,只使用 X[t]Y[t] 更新权重。
以上进行5000次为对数据进行了一代的训练。
batch梯度下降时,J成本函数随迭代次数下降,而mini-batch的成本函数整体趋势是下降的,但是有噪声产生。
这里写图片描述
batch gradient descent等价于mini-batch=m:成本函数J相对噪声小,幅度大。缺点是当训练样本很大时,单次迭代耗时长。
stochastic gradient descent(随机梯度下降法)等价于mini-batch=1:每一个样本都是独立的mini-batch。成本函数J有时候会靠近下降方向,有时候远离下降方向。平均来看最终会靠近最小值,但是永远不会收敛。缺点是失去向量化带来的加速。
因此通过选择不大不小的mini-batch尺寸,学习率可以达到最大,有以下两点优点:一,可以利用向量化加速。二,不需要等待所有样本处理完就可以计算梯度下降。比随机梯度下降更持续地向最小值靠近,但是也不会总朝最小值靠近,可以采取减小学习率的方法。
这里写图片描述
选择的技巧
如果训练集小(m<2000),可以用batch gradient descent
一般mini-batch的大小可以选为2的次方,如64,128,256,512。为了找到最有效减小成本函数的那个,可以多试试,选择合适的size使得让梯度下降法最高效。

二、优化算法

2.1 平均加权(Exponentially Weight Average)

指数平均加权,在统计学中被称为指数加权移动平均值,具有以下表达式:
S_t=

{Y1,βYt+(1β)St1,t=1t>1

以英国伦敦每日的温度变化为例,下图是真实的数据点:
这里写图片描述
根据指数平均加权,当β=0.9时,得到上图红线。上图红线是相当于平均了 11β天的温度。
β=0.9时,相当于考虑了10天的温度。如图中红线所示。
β=0.98时,相当于考虑了50天的温度。如图中绿线所示,比红线更平滑,但是会有延迟。
β =0.95时,相当于考虑了2天的温度。数据较少,波动较大,会有异常值。但是这个曲线能更快适应温度变化。
这里写图片描述
指数平均加权计算初始值时,会出现初始值计算不准的情况,会低于真实值,如图中紫线所示。这时候需要用到偏差修正 Vt1βt,随着t的增大,越来越接近零,紫线和绿线重合。偏差修正可以使初始值更接近真实值,减少误差。
这里写图片描述

2.2 动量(Momentum)梯度下降法

基本思想是计算梯度的指数加权平均数,并用该梯度更新权重。当优化成本函数时,红点代表最低点,梯度下降法慢慢摆动到最低点,上下波动降低了速度。因此,我们希望在横轴上加快学习,纵轴上减小波动。使用Momentum 梯度下降法可以达到这种效果。使用后的变化如下图肿红线所示。但是如果要最小化碗状函数,微分项相当于加速度。
这里写图片描述
On iteration t:
Compute dW,db on the current mini-batch

VdW=βVdW+(1β)dW

Vdb=βVdb+(1β)db

W=WαVdW,b=bαVdb

在第t次迭代时,计算如上式所示,有两个超参数α,β。一般取β=0.9时可以取得较好的效果。在梯度下降法和Momentum 梯度下降法中,一般不使用偏差修正。也有资料显示,1β项被删除了。 VdW=βVdW+(1β)dWVdb=βVdb+(1β)db,后者相对于前者相当于乘了11β,会影响学习率α的最佳值。如果修改β值,也许还要修改α,因此更倾向于使用前者。

2.3 RMSprop算法

RMSprop全称是root mean square prop算法,是另一种加速梯度下降的方法。为了便于理解,我们假设纵轴代表参数b,横轴为W。与Momentum类似,我们想减慢纵轴的变化,同时加快横轴的学习,至少不是减缓横轴方向的学习。
On iteration t:
Compute dW,db on the current mini-batch

SdW=βSdW+(1β)dW2

Sdb=βSdb+(1β)db2

W=WαdWSdW,b=bαdbSdb

因此我们希望 SdW小,Sdb大一些,这样横轴方向更新的快,纵轴更新的慢。由于函数的倾斜性,db大,因此Sdb 也相对较大,dw小,因此 SdW也相对较小。同时为了增加稳定性,通常分母增加一个 ϵ,通常108是一个比较好的选择。
W=WαdWSdW+ϵ,b=bαdbSdb+ϵ

这里写图片描述
因此应用RMSprop之后,梯度下降过程如图中绿线所示,纵轴摆动变小。另一个好处是可以用一个更大的学习率 学习,而不必担心纵轴方向的较大摆动。实际上,横轴纬度和纵轴纬度都可能是高维的参数,这里b和w只是为了方便地说明。

2.4 Adam优化算法

RMSprop和Adam优化算法是少有的经受的考验的两种算法。已被证明适用于不同的深度学习结构,并且能够很好地解决许多问题。Adam算法基本是Momentum和RMSprop的结合,相当于Momentum更新了β1 ,RMSprop更新了β2。首先初始化:

VdW=0,Vdb=0,SdW=0,Sdb=0

On iteration t:
Compute dW,db on the current mini-batch
VdW=β1VdW+(1β1)dW

Vdb=β1Vdb+(1β1)db

SdW=β2SdW+(1β2)dW2

Sdb=β2Sdb+(1β2)db2

W=WαdWSdW,b=bαdbSdb

一般使用Adam的时候需要计算修正偏差
VcorrecteddW=VdW1βt1,Vcorrecteddb=Vdb1βt1

ScorrecteddW=SdW1βt2,Scorrecteddb=Sdb1βt2

W=WαVcorrecteddWSdW+ϵ,b=bαVcorrecteddbSdb+ϵ

以上就是具体的Adam算法,被证明能有效适用于不同的神经网络,适用于广泛的结构。算法中的超参数α 需要调整,β1 默认为0.9,β2 默认为0.999,ϵ 默认为108

2.5 学习率衰减

学习率衰减是另外一种加快学习算法的方法。当我们使用mini-batch时,学习率 α 为固定值,在迭代过程中会产生噪音,下降朝向最小值,但不会精确地收敛,最后在最小值附近摆动,如图中蓝线所示。当使用学习率衰减时,学习初期, α 还较大,学习较快,随着α 的减小,学习步伐变慢变小,最后曲线会在最小值附近的小块区域摆动,如图中绿线所示。
这里写图片描述
这里写图片描述
使用mini-batch时,一代要遍历一次数据。因此我们可以将学习率设为以下形式。

α=11+decayrateepochnumα0

decay_rate是衰减率,epoch_num是代数, α0是初始学习率。其中,在实际应用中,我们可以多尝试不同的衰减率和初始学习率,调整到合适的值。此外还有其它的学习率衰减公式:
α=0.95epochnumα0

α=kepochnumα0k

α=ktα0tminibatcht

此外还有离散下降的学习率
这里写图片描述
也会手动调整学习率 α,值得注意的是,学习率 α 并不是我们优先调参的重点,当固定一个学习率,然后好好调整,会有很大的影响。后期会系统地讲解如何高效地搜索超参数。

三、局部最优

随着深度学习研究的深入,我们对局部最优的理解发生了变化。以往我们想到局部最优的时候,脑海里会浮现出下图的形式,优化的参数假设为,W1,W2,高度是损失函数,可以看到,存在很多局部最优点。
这里写图片描述
这些低维的图曾经影响了我们的理解,但是这些理解并不正确,事实上,当创建一个神经网络时,通常梯度为零的点并不是图中的局部最优点,而是成本函数的零梯度点,通常是鞍点。可以想象就是坐在马鞍上的点,也就是说,导数为零的点,就是图中绿点。
这里写图片描述
对于具有高维空间的函数来说,如果梯度为零,那么在每个方向上,它可能是凸函数,也可能是凹函数,需要都达到梯度为零,这种几率是很小的。因此在高维空间中,更有可能遇到鞍点,而不是局部最优。
如果局部最优不是问题,问题就是会长时间遇到平稳段,也就是导数为零的点,需要花上很长时间才能走出平稳段,首先不太可能是困在极差的局部最优,条件是训练较大的神经网络,存在大量参数,成本函数是高维空间函数。在平稳短时是一个问题,学习速率很慢,这也是上述几个优化算法能加速算法的地方,能够较快地走出平稳段。事实上,面对如此高纬度的空间,很难有人有那么好的直觉知道这些空间长什么样,但是随着我们对它们理解正在不断加深。
这里写图片描述

参考资料

改善深层神经网络:超参数调试、正则化以及优化 - 网易云课堂
课件-Github

注:本文涉及的图片及资料均整理翻译自Andrew Ng的Improving Deep Neural Networks课程,版权归其所有。翻译整理水平有限,如有不妥的地方欢迎指出。

2018-03-13 09:23:47 qq_28031525 阅读数 3034

  本文基于目前深度学习中使用较多的优化学习算法进行总结。

1 深度学习中的优化算法

  优化算法之前讨论两个问题:
  (1) 局部最小值问题
  在深度学习中,最优化问题其实并不容易困在局部最小值点。在高维度空间时(如20000维),局部最小值点需要在所有维度上都取得最小值,概率为220000,相反更容易困在鞍点处。
  同时平稳端(plateaus)也会使得学习变慢,因此可以通过自适应学习率算法如Adam或者RMSProp加速学习。
  (2) 指数加权(移动)平均(Exponentially Weighted (moving) average)
  在数据抖动较大的情况下,利用之前的整体变化趋势预测当前值。例如预测今天的气温,可以对之前一段时间的气温做平滑处理,即指数加权移动平均,一般形式为:

vt=βvt1+(1β)θt

  其中数据vt利用了前11β天的整体趋势平均。
  这里写图片描述
  为什么是前11β时刻的的指数平均可以从上图看出。当我们迭代带入数值计算时,一般认为当(tn)时刻的权重小于t时刻的e分之一((1ε)1ε1e,取β=(1ε),参数变换即β11β1e)时,就不再认为(tn)时刻前的数据参与平均。那么可以看到当β为0.9的时候,指数系数为10,也即β11β=0.910,共10个时刻的数据参与平均,当β为0.98时,指数系数为50,也即β11β=0.9850,认为共50个时刻的数据参与平均。

1.1 随机梯度下降(SGD)

  深度学习中的SGD指mini-batch gradient descent。在训练过程中,采用固定的学习率。
这里写图片描述
  其中,η是学习率,gt是梯度。SGD完全依赖于当前batch的梯度,所以η可理解为允许当前batch的梯度多大程度影响参数更新。
  通常来说,就总训练时间和最终代价而言,最优初始化学习率的效果会好于大约迭代100次后的效果。
  缺点:
  (1) 选择合适的learning rate比较困难,且对所有的参数更新使用同样的learning rate
  (2) SGD容易收敛到局部最优,并且在某些情况下可能被困在鞍点(其实在合适的初始化和step size的情况下,鞍点的影响并没有很大)

1.2 动量(momentum)

  动量方法旨在加速学习,特别是在面对小而连续的梯度但是含有很多噪声的时候。动量模拟了物体运动时的惯性,即在更新的时候在一定程度上会考虑之前更新的方向,同时利用当前batch的梯度微调最终的结果。这样则可以在一定程度上增加稳定性,从而更快的学习。
  这里写图片描述
  这里写图片描述
  特点:
  (1) 下降初期时,使用上一次参数更新,当下降方向一致时能够加速学习
  (2) 下降中后期,在局部最小值附近来回振荡时,gradient–>0,使得更新幅度增大,跳出陷阱;
  (3) 在梯度改变方向时,能减少更新。总体而言,momentum能够在相关方向上加速学习,抑制振荡,从而加速收敛

1.3 Nesterov动量

  Nesterov项在梯度更新时做出校正,避免前进太快,同时提高灵敏度。在动量中,我们将其展开为:
  这里写图片描述
  可以看到,此前积累的动量mt1并没有直接改变当前梯度gt,所以Nesterov的改进就是让之前的动量直接影响当前的动量,即:
  这里写图片描述
  所以,加上Nesterov项后,梯度在大的跳跃后,进行计算对当前梯度进行校正。
  Nesterov动量和标准动量的区别在于梯度的计算上。Nesterov动量的梯度计算是在施加当前速度之后。因此,Nesterov动量可以解释为往标准动量方法中添加了一个校正因子。

1.4 自适应学习率算法

  在训练开始的时候,我们远离最终的最优值点,需要使用较大的学习率。经过几轮训练之后,我们需要减小训练学习率。
  在采用mini-batch梯度下降时,迭代的过程中会伴随有噪音,虽然cost function会持续下降,但是算法收敛的结果是在最小值附近处摆动,而减小学习率,则会使得最后的值在最小值附近,更加接近收敛点。
  这里写图片描述

1.4.1 AdaGrad

  Divide the learning rate of each parameter by the root mean square of its previous derivatives(将每个参数除以之前所有梯度的均方和)。
  这里写图片描述
  此处,对nt从t=1开始进行递推形成一个约束项regularizer,ε保证分母非0。
  特点:
  (1) 前期gt较小的时候,regularizer较大,能够放大梯度
  (2) 后期gt较大的时候,regularizer较小,能够约束梯度
  (3) 适合处理稀疏梯度。
  缺点:
  (1) 需要手动设置一个全局的学习率
  (2) η设置过大时,会使regularizer过于敏感,对梯度的调节太大
  (3) 中后期,分母上梯度平方的累积将会越来越大,使gradient–>0,使得训练提前结束

1.4.2 Adadelta

  Adadelta是Adagrad的拓展,最初方案依旧是对学习率进行自适应约束,但是进行了计算上的简化。Adagrad会累加之前所有的梯度平方,而Adadelta只累加固定大小的项,并且也不直接存储这些项,仅仅是近似计算对应的平均值。即:
  这里写图片描述 
  在此时Adadelta还是依赖于全局学习率,但是作者在处理后
  这里写图片描述
  此时Adadelta已经不再依赖于全局学习率了。
  特点:
  (1) 训练初中期,加速效果不错
  (2) 训练后期,反复在局部最小值附近抖动

1.4.3 RMSProp

  RMSProp可以看做为Adadalta的一个特例,也即上述式子中ρ=0.5,然后再求根的话,就变成RMS(均方根):
  这里写图片描述
  随着ηt在不同范围内(11v)的平均,对于变化较大的值方向能够抑制变化,较小的值方向加速变化,消除摆动加速收敛
  这里写图片描述
  RMSProp的特点如下,
  优点:
  (1) 由于采用了梯度平方的指数加权平均,改进了AdaGrad在深度学习中过早结束的问题,效果趋于二者之间
  (2) 适用于处理非平稳过程(也即过程依赖于时间,采用指数加权平均时对于非平稳过程处理较好)-对于RNN效果较好
  缺点:
  (1) 仍然依赖于全局学习率

1.4.4 Adam

  Adam(Adaptive Moment Estimation)本质上是带有动量项的RMSProp,它利用了梯度的一阶矩估计和二阶矩估计动态调整每个参数的学习率。Adam的优点主要在于经过偏置校正(Bias correction,为了修正在训练初期的误差,当t变大后,偏置校正效果减弱)后,每一次迭代学习率都有个确定范围,使得参数比较平稳。
  偏置修正(Bias Correction)的效果:
  当初始化v0=0时,v1=0.98v0+0.02θ1(其中θ1为当前时刻的值),可以看到v1远小于当前的值θ1,接下来v2=0.98v1+0.02θ=0.980.02θ1+0.02θ2,得到的结果θ2远小于当前时刻的值θ2,因此在训练初期时与真实值会有较大误差(也即初期时绿色线和紫色线的差别)。
  因此采用vt=vt1βt时,当t较小时,vt能得到修正偏差,也即下图右边所示,而当t逐渐变大时,由于β小于1,则偏置效果减弱。
  这里写图片描述
   Adam优化算法如下:
   这里写图片描述
   通常,μ的值可以设置为0.9,v的值可以设置为0.999。其中,mt,nt分别是梯度一阶矩估计和二阶矩估计,可以看做对期望E|gt|,E|gt2|的估计,近似为对期望的无偏估计。
   特点:
   (1) 结合了Adagrad善于处理稀疏梯度和RMSprop善于处理非平稳目标的优点
   (2) 对内存需求较小(指数加权平均不需要存储大量的值就能平均)
   (3) 为不同的参数计算不同的自适应学习率
   (4) 适用于大多非凸优化 - 适用于大数据集和高维空间

深度学习优化算法

阅读数 103

没有更多推荐了,返回首页