深度学习优化器总结

Batch gradient descent

每次更新我们需要计算整个数据集的梯度,因此使用批量梯度下降进行优化时,计算速度很慢,而且对于不适合内存计算的数据将会非常棘手。批量梯度下降算法不允许我们实时更新模型。

但是批量梯度下降算法能确保收敛到凸平面的全局最优和非凸平面的局部最优。

SGD(Stochastic gradient descent)

随机梯度下降算法参数更新针对每一个样本集x(i) 和y(i) 。批量梯度下降算法在大数据量时会产生大量的冗余计算,比如:每次针对相似样本都会重新计算。这种情况时,SGD算法每次则只更新一次。因此SGD算法通过更快,并且适合online。

但是SGD以高方差进行快速更新,这会导致目标函数出现严重抖动的情况。一方面,正是因为计算的抖动可以让梯度计算跳出局部最优,最终到达一个更好的最优点;另一方面,SGD算法也会因此产生过调。

Min-batch gradient descent

该算法有两个好处,1):减少了参数更新的变化,这可以带来更加稳定的收敛。2:可以充分利用矩阵优化,最终计算更加高效。但是Min-batch梯度下降不保证好的收敛性。

Batch gradient descent、SGD、min-batch gradient descent算法都需要预先设置学习率,并且整个模型计算过程中都采用相同的学习率进行计算。这将会带来一些问题,比如

1):选择一个合适的学习率是非常困难的事情。学习率较小,收敛速度将会非常慢;而学习率较大时,收敛过程将会变得非常抖动,而且有可能不能收敛到最优。

2):预先制定学习率变化规则。比如,计算30轮之后,学习率减半。但是这种方式需要预先定义学习率变化的规则,而规则的准确率在训练过程中并不能保证。

3):上述三种算法针对所有数据采用相同的学习速率,但是当我们的数据非常稀疏的时候,我们可能不希望所有数据都以相同的方式进行梯度更新,而是对这种极少的特征进行一次大的更新。

4):高度非凸函数普遍出现在神经网络中,在优化这类函数时,另一个关键的挑战是使函数避免陷入无数次优的局部最小值。

Momentum

动量可以加速SGD算法的收敛速度,并且降低SGD算法收敛时的震荡。

通过添加一个衰减因子到历史更新向量,并加上当前的更新向量。当梯度保持相同方向时,动量因子加速参数更新;而梯度方向改变时,动量因子能降低梯度的更新速度。

NAG(Nesterov accelerated gradient)

滚雪球游戏中,我们希望有一个智能的雪球,它能够预知运动的方向,以至于当它再次遇到斜坡的时候会减慢速度。我们可以通过计算来渐进估计下一个位置的参数(梯度并不是完全更新),即为

Adagrad

Adagrad优化算法是一种自适应优化算法,针对高频特征更新步长较小,而低频特征更新较大。因此该算法适合应用在特征稀疏的场景。

先前的算法对每一次参数更新都是采用同一个学习率,而adagrad算法每一步采用不同的学习率进行更新。我们计算梯度的公式如下:

SGD算法进行参数更新的公式为:

Adagrad算法在每一步的计算的时候,根据历史梯度对学习率进行修改

这里G是一个对角矩阵,对角线元素是截止当前时刻的历史梯度的平方和,eta是一个平方项。如果不执行均方根操作,算法的性能将会变得很差。

G包含了针对所有历史梯度的平方和,因此我们可以用矩阵元素乘的形式来表达上式:

Adagrad算法的主要优点是它避免了手动调整学习率的麻烦,大部分的实现都采用默认值0.01。

Adagrad算法主要的缺点在于,其分母梯度平方的累加和。因为每次加入的都是一个正数,随着训练的进行,学习率将会变得无限小,此时算法将不能进行参数的迭代更新。

Adadelta

Adadelta算法是adagrad算法的改进版,它主要解决了adagrad算法单调递减学习率的问题。通过约束历史梯度累加来替代累加所有历史梯度平方。这里通过在历史梯度上添加衰减因子,并通过迭代的方式来对当前的梯度进行计算,最终距离较远的梯度对当前的影响较小,而距离当前时刻较近的梯度对当前梯度的计算影响较大。

通常,我们设置lambda参数为0.9。为了清楚的表达,这里我们再次列出SGD算法的计算公式:

而adagrad算法的计算公式为:

这里我们简单的替换对角矩阵G为E(带衰减的历史梯度累加)

上式分母正好是均方误差根(RMS),这里我们用简写来表达:

作者提到参数更新应该有相同的假设,因此我们定义另一个指数衰减平均,这里采用的是参数更新的平方

因为t时刻,RMS[]项未知,因此我们采用先前的参数RMS对当前时刻进行渐进表示。最终我们有如下表达式:

采用Adadelta算法作为模型优化器算法时,我们已经不需要设置默认学习率。

RMSprop

RMSPprop算法和adadelta算法都是adagrad算法的优化版,用于解决adagrad算法学习率消失的问题,从最终的计算公式来看,RMSProp算法和Adadelta算法有相似的计算表达式

Adam

Adam算法是另一种自适应参数更新算法。和Adadelta、RMSProp算法一样,对历史平方梯度v(t)乘上一个衰减因子,adam算法还存储了一个历史梯度m(t)。

mt和vt分别是梯度一阶矩(均值)和二阶矩(方差)。当mt和vt初始化为0向量时,adam的作者发现他们都偏向于0,尤其是在初始化的时候和衰减率很小的时候(例如,beta1和beta2趋近于1时)。

通过计算偏差校正的一阶矩和二阶矩估计来抵消偏差:

利用上述的公式更新参数,得到adam的更新公式:

AdaMax

Adam算法对历史梯度的二范数进行计算

这里我们可以改为计算历史梯度的p范数

较大的p,将会使数值计算不稳定,这也是实际中大量使用1范数和2范数的原因。然而,无穷范数则是稳定的。鉴于此,作者提出Adamax算法,通过计算无穷范数,使矩估计收敛到稳定。为了和adam算法区分开,这里用u(t)表示:

替换adam算法参数更新公式分母,可得:

Nadam

Adam算法可以看作是RMSProp算法和Momentum的结合版。RMSProp算法通过对历史梯度平方乘上衰减因子来计算v(t),动量则计算历史梯度。我们知道NAG算法优于momentum算法。这里nadam结合了adam算法和NAG算法,为了使用NAG算法,我们需要修改动量表达式m(t)。

首先,回忆动量更新表达式

将第二项代入第三项中有

从上述分析可知,动量考虑了历史动量方向和当前梯度方向。NAG算法通过在梯度计算项中加入历史动量信息来达到一个更精确的计算,因此我们修改公式为:

Dozat提出对NAG进行如下修改:不再进行两次动量计算(一次更新梯度,一次更新参数),而是采用直接更新当前的参数:

注意这里我们没有采用前一时刻的动量m(t-1),而是采用当前的动量m(t)。为了加入NGA算法,我们同样可以替换先前的动量向量为当前的动量向量。首先,我们回忆adam更新规则

将上式1、2带入式3中可得

通过使用动量的偏差校正估计,可得

现在我们加入nesterov 动量,采用当前动量的偏差校正估计替换前一时刻动量的偏差校正估计,可得:

总结

当训练数据特征较为稀疏的时候,采用自适应的优化器通常能获得更好的性能,而且我们采用自适应优化器的默认值即可获得较优的性能。

RMSprop算法是adagrad算法的优化版,它解决了学习率趋近于零的问题。Adadelta算法和RMSprop算法类似,区别在于Adadelta用参数的RMS作为更新规则的分子。最后,Adam则是在RMSprop的基础上加入了偏差校正和动量。综上来看,Adam可能是最佳的选择。

最近很多paper都采用不带动量的SGD算法,辅助一些简单的学习率退火策略。如上所述,SGD算法能够找到极小值,但是比其他优化器花费的时间更多。和其他算法相比,SGD算法更加依赖于初始化参数的设置和退火策略,而且SGD算法更加容易陷入鞍点。所以,如果你想模型更快的收敛或者训练一个深层次、复杂度较高的网络,自适应的优化器应该是首选优化器。

参考文献

Optimization for Deep Learning Highlights in 2017

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269

推荐阅读更多精彩内容