TensorFlow中的梯度下降vs Adagrad vs动量


72

即使我不是神经网络和深度学习的专家(仅仅是基础知识),我也在研究TensorFlow及其使用方法。

在后续教程中,我不了解这三种损失优化器之间的实际差异和实际差异。我看了一下API并了解了这些原理,但是我的问题是:

1.什么时候最好使用一个而不是另一个?

2.是否有重要的区别要知道?


2
关于哪种优化器应该在例如MNIST上更好地工作还没有理论,所以人们尝试了几种优化器并选择了最适合其问题的优化器。梯度下降通常是最糟糕的,根据数据集,动量/ AdaGrad可能比其他更好/更差
Yaroslav Bulatov

好的,我需要创建一个具有4-5个识别类别的图像识别模型。如果我使用Imagenet数据集,您对我有什么建议?
凯尔(Kyrol)'16

AdamOptimizer似乎在Imagenet上运行良好
Yaroslav

2
仅仅补充已经说过的内容,在选择优化器时也应牢记优化器所需的超参数数量。梯度下降很慢,但是您只需要设置学习速度即可。
shekkizh

Answers:


197

根据我的理解,这是一个简短的解释:

  • 动量 可帮助SGD沿相关方向导航并软化无关的振荡。它只是将上一步的方向的一部分添加到当前步骤中。这样可以在正确的方向上实现速度放大,并在错误的方向上减弱振动。该分数通常在(0,1)范围内。使用自适应动量也很有意义。在开始学习时,大的动量只会阻碍您的进步,因此使用0.01之类的值很有意义,一旦所有高梯度消失,您就可以使用更大的动量。动量存在一个问题:当我们非常接近目标时,在大多数情况下我们的动量很高,并且不知道它会放慢速度。这可能会导致它丢失或在最小值附近振荡
  • Nesterov加速梯度可以通过尽早降低速度来解决此问题。在动量中,我们首先计算坡度,然后在该方向上进行跳跃,并由我们之前拥有的任何动量放大。NAG的功能相同,但顺序相反:首先,我们根据存储的信息进行较大的跳跃,然后计算梯度并进行较小的校正。这种看似无关紧要的变化大大提高了实用速度。
  • AdaGrad或自适应梯度允许学习率根据参数进行自适应。它对不频繁的参数执行较大的更新,对频繁的参数执行较小的更新。因此,它非常适合稀疏数据(NLP或图像识别)。另一个优点是,它基本上消除了调整学习速度的需要。每个参数都有自己的学习率,由于算法的特殊性,学习率单调下降。这引起了最大的问题:在某些时候,学习率太小,系统停止学习。
  • AdaDelta 解决AdaGrad中单调降低学习率的问题。在AdaGrad中,学习率的近似计算方法是除以平方根之和。在每个阶段,您都要在总和上加上另一个平方根,这会使分母不断增加。在AdaDelta中,它使用滑动窗口而不是将所有过去的平方根求和,而是使总和减少。RMSprop与AdaDelta非常相似
  • 亚当或自适应动量是类似于AdaDelta的算法。但是,除了存储每个参数的学习率外,它还分别存储每个参数的动量变化。

    一个几可视化在此处输入图片说明 在此处输入图片说明

我要说的是,SGD,Momentum和Nesterov比最后3个逊色。


8
“ SGD,Momentum和Nesterov比最后三个劣等” –它们并不逊色,但速度较慢。人们使用SGD + Momentum进行论文培训是有原因的。SGD +动量有更高的机会达到最低水平。
矿物

5
@minerals如果我们要学步,那么我们也不能使用更慢的词。因为从理论上讲,始终可以找到任何算法都能发挥最佳性能的表面和起点。但是实际上这没有什么用。
萨尔瓦多·达利

2
在您提供的有关AdaDelta的链接中的评论中:“没有一个明确的结论来决定选择哪种算法以及何时选择。根据问题和参数化的不同,所有算法的执行情况都不同。可以得出的
结论

1
本文(arxiv.org/abs/1705.08292)讨论了与自适应方法相比,SGD如何经常能提供更好的解决方案。更好更好的验证损失/准确的意思(即模型概括更好),而不是快速的训练时间
Anjum赛义德

1
“亚当或自适应动量”是什么意思?正如这个答案所解释的,根据亚当的原始论文,亚当是“自适应矩估计”的缩写。
奥伦·米尔曼

21

萨尔瓦多·达利(Salvador Dali)的答案已经解释了一些流行方法(即优化器)之间的区别,但是我将尝试进一步阐述它们。
(请注意,我们的回答在某些方面存在分歧,尤其是关于ADAGRAD。)

经典动量(CM)vs内斯特罗夫的加速梯度(NAG)

(主要基于这篇论文的第2节,关于深度学习中的初始化和动量的重要性。)

CM和NAG中的每个步骤实际上都由两个子步骤组成:

  • 动量子步骤-这只是[0.9,1)最后一步的一小部分(通常在范围内)。
  • 依赖于梯度的子步骤-这就像SGD中的常规步骤-它是学习率和与梯度相反的向量的乘积,而梯度是在此子步骤开始的地方进行计算的。

CM首先采取梯度子步骤,而NAG首先采取动量子步骤。

这是有关CM和NAG直觉的答案的演示:

CM vs NAG示例

所以NAG似乎更好(至少在图像中),但是为什么呢?

要注意的重要一点是,动量子步骤何时出现并不重要-两种方法都相同。因此,如果动量子步骤已经采取,我们也可能会表现出来。

因此,问题实际上是:假设梯度子步骤是在动量子步骤之后进行的,我们是否应该将梯度子步骤计算为好像它是在采取动量子步骤之前或之后的位置开始的?

通常,“在它之后”似乎是正确的答案,在某些点上的渐变θ大致将您指向从θ到最小的方向(幅度相对正确),而在其他点上的渐变则不太可能将您指向从θ最小的方向(幅度相对正确)。

这是一个演示(来自下面的gif):

CM vs NAG在特定时刻的精彩gif

  • 最小值是星形所在的位置,曲线是等高线。(有关轮廓线以及为什么它们垂直于渐变的说明,请参见传奇的3Blue1Brown的视频12。
  • (长)紫色箭头是动量子步骤。
  • 如果透明红色箭头在动量子步骤之前开始,则为梯度子步骤。
  • 如果黑色箭头在动量子步骤之后开始,则为梯度子步骤。
  • CM将最终到达深红色箭头的目标。
  • NAG将最终到达黑色箭头的目标。

请注意,关于为什么NA​​G更好的论点与算法是否接近最小值无关。
通常,NAG和CM都经常积聚更多的动量而不是对他们有益的问题,因此,每当他们改变方向时,它们都有一个尴尬的“响应时间”。我们所解释的NAG相对于CM的优势并不能解决问题,而只是使NAG的“响应时间”减少了尴尬(但仍然令人尴尬)。

Alec Radford的gif (在萨尔瓦多·达利的回答中出现)很好地展示了这个“响应时间”问题:
两种动量方法令人尴尬的响应时间的示例

达格拉德

(主要基于ADADELTA:自适应学习率方法(原始ADADELTA论文)中的2.2.2节,因为我发现它比在线学习和随机优化的自适应次梯度方法(原始ADAGRAD论文)更容易获得。)

SGD中,步骤由给出- learning_rate * gradientlearning_rate而是超参数。
ADAGRAD还具有一个learning_rate超参数,但是每个梯度分量的实际学习率都是单独计算的。第-步
i-th分量由下式t给出:

              learning_rate 
- --------------------------------------- * gradient_i_t
  norm((gradient_i_1, ..., gradient_i_t))

而:

  • gradient_i_k是-th步骤中i渐变的-th分量k
  • (gradient_i_1, ..., gradient_i_t)是带有t分量的向量。构造这样的向量是有意义的(至少对我而言),这不是直觉的,但这就是算法所做的(概念上)。
  • norm(vector)是的欧几里得范数(又称l2范数)vector,这是我们对的长度的直观概念vector
  • 令人困惑的是,在ADAGRAD(以及其他方法)中,乘以gradient_i_t(在这种情况下为)的表达式learning_rate / norm(...)通常称为“学习率”(实际上,我在上一段中将其称为“实际学习率”) )。我猜这是因为在SGD中learning_rate超参数和此表达式是相同的。
  • 在实际的实现中,会将一些常数添加到分母,以防止被零除。

例如:

  • i第一步的梯度的-th分量是1.15
  • i第二步中梯度的-th分量是1.35
  • i第三步中梯度的-th分量是0.9

则范数(1.15, 1.35, 0.9)是黄线的长度,即:
sqrt(1.15^2 + 1.35^2 + 0.9^2) = 1.989
因此,i第三步的第-个组件是:- learning_rate / 1.989 * 0.9

l2规范示例

请注意有关i步骤-th组件的两件事:

  1. 它与成正比learning_rate
  2. 在计算中,规范在增加,因此学习率在下降。

这意味着ADAGRAD对超参数的选择很敏感learning_rate
另外,可能是步骤过短后,ADAGRAD实际上陷入了困境。

ADADELTA和RMSProp

摘自ADADELTA论文

本文提出的想法源自ADAGRAD,以改善该方法的两个主要缺点:1)在整个训练过程中学习率持续下降,以及2)需要手动选择的全局学习率。

然后,本文解释了旨在解决第一个缺点的改进:

我们不是将累积的梯度平方和一直累积在一起,而是将过去累积的梯度窗口限制为某个固定大小w。这样可以确保即使在完成多次更新之后,学习仍继续取得进展。
由于存储w以前的平方梯度效率低下,因此我们的方法将这种累积实现为平方梯度的指数衰减平均值。

通过“平方梯度的指数衰减平均值”,本文意味着对于每个梯度,我们都对计算出的所有梯度的所有i平方i的所有平方分量进行加权平均。
每个平方的i分量的权i重大于上一步中平方的分量的权重。

这是一个大小窗口的近似值,w因为先前步骤中的权重非常小。

(当我想到指数衰减的平均值时,我喜欢形象化彗星的踪迹,随着它离彗星越来越远,它踪迹变得越来越暗:

彗星的踪迹作为移动平均线的直觉

如果仅对ADAGRAD进行此更改,那么您将获得RMSProp,这是Geoff Hinton在Coursera类的第6e讲中提出的方法。

因此,在RMSProp中,it-步的-th分量由下式给出:

                   learning_rate
- ------------------------------------------------ * gradient_i_t
  sqrt(exp_decay_avg_of_squared_grads_i + epsilon)

而:

  • epsilon 是防止被零除的超参数。
  • exp_decay_avg_of_squared_grads_ii所有计算出的梯度(包括gradient_i_t)的平方次方的指数衰减平均值。

但是如上所述,ADADELTA还旨在摆脱learning_rate超参数,因此其中必须包含更多内容。

在ADADELTA中,it-步的-th分量由下式给出:

  sqrt(exp_decay_avg_of_squared_steps_i + epsilon)
- ------------------------------------------------ * gradient_i_t
  sqrt(exp_decay_avg_of_squared_grads_i + epsilon) 

whileexp_decay_avg_of_squared_steps_i是所i计算的所有步骤的t-1第平方平方分量的指数衰减平均值(直到第-步)。
sqrt(exp_decay_avg_of_squared_steps_i + epsilon)与动量有些相似,并且根据论文,它“充当加速项”。(该文件还提供了添加该文件的另一个原因,但是我的回答已经太长了,因此,如果您好奇,请参阅第3.2节。)

亚当

(主要基于亚当论文的原始资料:《亚当:随机优化方法》。)

Adam是“自适应矩估计”的缩写(有关该名称的说明,请参见此答案)。第-步
i-th分量由下式t给出:

                   learning_rate
- ------------------------------------------------ * exp_decay_avg_of_grads_i
  sqrt(exp_decay_avg_of_squared_grads_i) + epsilon

而:

  • exp_decay_avg_of_grads_i是所i计算的所有梯度(包括gradient_i_t)的-th分量的指数衰减平均值。
  • 其实,无论是exp_decay_avg_of_grads_iexp_decay_avg_of_squared_grads_i也被修正,以考虑向偏置0(更多有关,请参阅第3节的文件,并且还以stats.stackexchange答案)。

请注意,Adam使用i梯度的-th分量的指数衰减平均值,而大多数SGD方法使用i当前梯度的-th分量。正如由两个时标更新规则训练到的GAN收敛到局部Nash平衡中所述,这导致Adam表现得像“有摩擦的沉重球” 。
有关亚当的动量行为与通常的动量行为如何不同的更多信息,请参见此答案


3
优秀的答案!
失败的科学家

被低估的答案;应该得到更多的支持。也感谢您将人们指向3Blue1Brown。他是一位美丽而美丽的老师,动画师和数学思想家
内森(Nathan)

5

让我们将其归结为几个简单的问题:

哪个优化程序可以为我带来最佳结果/准确性?

没有银弹。一些针对您任务的优化器可能会比其他优化器更好地工作。没有办法事先告诉您,您必须尝试一些才能找到最好的。好消息是,不同优化器的结果可能彼此接近。不过,您必须为所选的任何单个优化程序找到最佳的超参数。

我现在应该使用哪个优化程序?

也许,使用AdamOptimizer并以learning_rate 0.001和0.0001运行它。如果您想要更好的结果,请尝试以其他学习速度运行。或尝试其他优化器并调整其超参数。

很长的故事

选择优化器时,需要考虑以下几个方面:

  • 易于使用(即找到适合您的参数的速度);
  • 收敛速度(基本为SGD或更快。
  • 内存占用量(通常在模型的0到x2大小之间);
  • 与培训过程其他部分的关系。

普通SGD是可以做到的最低要求:只需将梯度乘以学习率,然后将结果加到权重即可。SGD具有许多出色的品质:只有1个超参数;它不需要任何额外的内存;它对训练的其他部分影响很小。它也有两个缺点:它可能对学习速率的选择过于敏感,并且培训可能比其他方法花费更长的时间。

从普通SGD的这些缺点中,我们可以看到更复杂的更新规则(优化程序)的用途是:我们牺牲了一部分内存来实现更快的训练,并可能简化了超参数的选择。

内存开销通常不重要,可以忽略。除非模型非常大,或者您正在使用GTX760进行培训,或者正在争夺ImageNet的领导地位。动量或Nesterov加速梯度等较简单的方法需要模型大小(模型超参数的大小)为1.0或更小。二阶方法(亚当,可能需要两倍的内存和计算量。

收敛速度-几乎任何东西都比SGD更好,其他任何东西都很难比较。一个注意事项可能是AdamOptimizer擅长几乎立即开始训练,而无需热身。

在选择优化器时,我认为易用性是最重要的。不同的优化器具有不同数量的超参数,并且对它们的敏感性也不同。我认为亚当是所有现有的最简单的。通常,您需要检查2-4个之间的learning_rates0.0010.0001确定模型是否收敛良好。为了比较SGD(和动力),我通常尝试[0.1, 0.01, ... 10e-5]。亚当还有2个无需更改的超参数。

优化器与培训其他部分之间的关​​系。超参数调整通常涉及{learning_rate, weight_decay, batch_size, droupout_rate}同时选择。它们都是相互关联的,每个都可以看作是模型正则化的一种形式。例如,如果正好使用weight_decay或L2-norm并可能选择AdamWOptimizer而不是,则必须密切注意AdamOptimizer

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.