梯度下降法与阿达格拉德与张量/流动的动量

我正在学习 张量流以及如何使用它,即使我不是神经网络和深度学习(只是基础知识)方面的专家。

在下面的教程中,我不理解这三个优化器之间真正的和实际的损失差异。我了解 空气污染指数的原理,但我的问题是:

1. 什么时候使用一种方法比使用其他方法更可取?

2. 是否有重要的区别需要了解?

35817 次浏览

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

  • 动量 有帮助 SGD 沿相关方向导航,软化无关方向的振荡。它只是向当前步骤添加前一步骤方向的一小部分。这实现了在正确方向上的速度放大,并软化了在错误方向上的振荡。这个分数通常在(0,1)范围内。使用自适应动量也是有意义的。在开始学习的时候,一个大的动量只会阻碍你的进步,所以使用0.01这样的东西是有意义的,一旦所有的高梯度消失,你可以使用一个更大的动量。势头有一个问题: 当我们非常接近目标时,我们的势头在大多数情况下都非常强劲,而且它不知道应该放慢速度。这可能导致它错过或围绕最小值振荡
  • 内斯特罗夫加速梯度很早就开始减速,从而克服了这个问题。在动量中,我们首先计算梯度,然后沿着那个方向跳跃,这个方向被之前的动量所放大。NAG 做同样的事情,但是顺序不同: 首先,我们根据存储的信息进行大跳跃,然后计算梯度并进行小的修正。这种看似无关紧要的改变给出了显著的实际加速。
  • AdaGrad 或自适应梯度允许学习率根据参数进行调整。它对不频繁的参数执行较大的更新,对频繁的参数执行较小的更新。因此,它非常适合稀疏数据(NLP 或图像识别)。另一个优点是,它基本上消除了调整学习速率的需要。每个参数都有自己的学习率,由于算法的特殊性,学习率是单调递减的。这导致了最大的问题: 在某个时间点,学习速率非常小,以至于系统停止学习。
  • AdaDelta 决心: AdaGrad 中学习率单调下降的问题。在 AdaGrad 中,学习率的计算大致为除以平方根之和。在每个阶段,你给和加上另一个平方根,这会导致分母不断增加。在 AdaDelta 中,它使用滑动窗口来使和减少,而不是将所有过去的平方根求和。RMS 螺旋桨与 AdaDelta 非常相似
  • Adam 或自适应动量是一种类似于 AdaDelta 的算法。但是除了存储每个参数的学习速率之外,它还分别存储每个参数的动量变化。

    返回文章页面 一些可视化的东西: enter image description here enter image description here

我认为 SGD、 Momentum 和 Nesterov 都不如前三个。

Salvador Dali 的答案 已经解释了一些流行方法(即优化器)之间的区别,但我还想再详细解释一下。
(请注意,我们的答案在某些方面存在分歧,特别是关于 ADAGRAD。)

经典动量(CM)与 Nesterov 加速梯度(NAG)的比较

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

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

  • 动量子步骤-这只是最后一步的一小部分(通常在 [0.9,1)范围内)。
  • 一个与梯度相关的子步骤-这就像 新加坡警务处中的通常步骤-它是学习速率和与梯度相反的向量的乘积,而梯度是在这个子步骤开始的地方计算出来的。

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

下面是来自 一个关于 CM 和 NAG 的直觉的答案的演示:

CM vs NAG example

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

需要注意的重要一点是,动量子步骤何时到来并不重要——无论哪种情况都是一样的。因此,我们不妨表现的是,如果动量子步骤已经采取。

因此,问题实际上是: 假设梯度子步骤是在动量子步骤之后,我们是否应该计算梯度子步骤,就像它在动量子步骤之前或之后开始的位置一样?

“在它之后”似乎是正确的答案,因为一般来说,在 θ的某个点的梯度大致指向你从 θ到最小值的方向(相对正确的幅度) ,而在其他点的梯度不太可能指向你从 θ到最小值的方向(相对正确的幅度)。

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

CM vs NAG in a specific moment in the awesome gif

  • 最小值是星星所在的位置,曲线是 等高线。(有关等高线以及它们为什么垂直于梯度的解释,请参阅传奇人物 蓝色1布朗的视频 12。)
  • (长)紫色箭头是动量子步骤。
  • 透明的红色箭头是梯度子步骤,如果它在动量子步骤之前开始。
  • 黑色箭头是梯度子步骤,如果它在动量子步骤之后开始。
  • CM 最终会成为暗红色箭头的目标。
  • NAG 最终会成为黑箭的目标。

注意,为什么 NAG 更好的这个参数与算法是否接近最小值无关。
一般来说,NAG 和 CM 都存在积累的动量多于对他们有利的问题,所以无论何时他们应该改变方向,他们都有一个令人尴尬的“反应时间”。我们所解释的 NAG 相对于 CM 的优势并不能阻止问题的发生,只是让 NAG 的“响应时间”变得不那么令人尴尬(但仍然令人尴尬)。< br/>

这个“响应时间”问题在 Alec Radford(出现在 萨尔瓦多 · 达利的回答中)的 gif 中得到了很好的证明:
An example of the embarrassing response time of both momentum methods

阿达格拉德

(主要基于 阿达德尔塔: 一种在线机机器学习方法(ADADELTA 原始论文)的2.2.2节,因为我发现它比 在线学习的自适应次梯度方法及其随机优化(ADAGRAD 原始论文)更容易理解。)

新加坡警务处中,步长由 - learning_rate * gradient给出,而 learning_rate是一个超参数。
ADAGRAD 也有一个 learning_rate超参数,但是梯度的每个组成部分的实际学习率是单独计算的。
给出了 t第1步的 i分量: < br/>

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

同时:

  • gradient_i_kk-th 步骤中梯度的第1个分量
  • (gradient_i_1, ..., gradient_i_t)是一个包含 t成分的向量。构造这样一个向量是否有意义并不直观(至少对我来说) ,但这就是算法(概念上)所做的。
  • norm(vector)vector欧几里亚规范(又名 l2范数) ,这是我们对 vector长度的直观概念。
  • 令人困惑的是,在 ADAGRAD (以及其他一些方法)中,表达式乘以 gradient_i_t(在这种情况下,learning_rate / norm(...))通常被称为“学习率”(事实上,我在前一段中称之为“实际学习率”)。我想这是因为在 新加坡警务处中,learning_rate超参数和这个表达式是一样的。
  • 在实际的实现中,为了防止除零,会在分母上添加一些常数。

例如:

  • 第一步中梯度的第 i个分量是 1.15
  • 在第二步中,梯度的第 i个分量是 1.35
  • 在第三步中,梯度的第 i个分量是 0.9

那么 (1.15, 1.35, 0.9)的范数就是黄线的长度,也就是:
sqrt(1.15^2 + 1.35^2 + 0.9^2) = 1.989.
所以第三步的 i-th 分量是: - learning_rate / 1.989 * 0.9 < br/>

l2 norm example

关于这个步骤的第 i部分,请注意两点:

  1. 它与 learning_rate成正比。
  2. 在计算过程中,随着范数的增加,学习速度也随之降低。

这意味着 ADAGRAD 对超参数 learning_rate的选择是敏感的。
此外,可能在一段时间后,这些步骤变得如此之小,以至于 ADAGRAD 实际上陷入了困境。

ADADELTA 和 RMSProp

来自 阿达德尔塔纸:

本文提出的思想来自 ADAGRAD,以改进这两个主要缺点 方法: 1)学习率的持续衰减 在整个培训过程中,以及2)需要手动选择 全球学习率全球学习率。

该论文随后解释了一项旨在解决第一个缺点的改进:

而不是累积所有的平方梯度的总和 时间,我们限制窗口的过去的梯度积累 成为某种固定大小的 w[ ... ]。这确保了学习的继续 即使在许多更新迭代之后仍然可以取得进展 已经完成了。
由于存储 w之前的平方梯度效率不高, 我们的方法以指数形式实现这种积累 平方梯度的衰减平均值。

通过“梯度平方的指数衰减平均值”,这篇论文意味着对于每一个 i,我们计算出所有计算出的梯度的加权平均数。
每个 i次方分量的重量大于前一步 i次方分量的重量。

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

(当我考虑一个指数衰减的平均值时,我喜欢想象一个 彗星的轨迹,随着它离彗星越来越远,它变得越来越暗:

a comet's trail as an intuition for a moving average)

如果只对 ADAGRAD 进行此更改,那么将得到 RMSProp,这是 Geoff Hinton 在 他的课程时代课程第六课第五节课中提出的一种方法。

因此,在 RMSProp 中,t第1步的 i-th 分量由:

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

同时:

  • epsilon是一个防止除以零的超参数。
  • exp_decay_avg_of_squared_grads_i是计算出的所有梯度(包括 gradient_i_t)的第1次分量的平方的指数衰减平均值。

但正如前面提到的,ADADELTA 的目标也是摆脱 learning_rate超参数,所以它必须有更多的东西正在进行。

在 ADADELTA,t步骤的第0个组成部分是:

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

exp_decay_avg_of_squared_steps_i是所有计算步骤(直到 t-1-th 步骤)的 i-th 平方分量的指数衰减平均值。
sqrt(exp_decay_avg_of_squared_steps_i + epsilon)有点类似于动量,根据 报纸,它“作为一个加速项”。(这篇文章还给出了另一个添加的原因,但是我的答案已经太长了,所以如果你感到好奇,可以看看第3.2节。)

亚当

(主要基于亚当的原始论文 亚当: 一种随机优化方法。)

Adam 是自适应矩估计的简称(请参阅 这个答案以获得关于这个名称的解释)。
给出了 t第1步的 i分量: < br/>

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

同时:

  • exp_decay_avg_of_grads_i是所有计算出的梯度(包括 gradient_i_t)的 i-th 分量的指数衰减平均值。
  • 实际上,exp_decay_avg_of_grads_iexp_decay_avg_of_squared_grads_i也都被纠正,以说明对 0的偏倚(关于这方面的更多信息,参见 报纸在 stats.stackexchange 中找到答案的第3节)。

请注意,Adam 使用的是渐变的 i-th 分量的指数衰减平均值,其中大多数 新加坡警务处方法使用的是当前渐变的 i-th 分量。这导致亚当的行为就像“一个有摩擦力的重球”,正如论文 由两个时间尺度的更新规则训练出来的广域网收敛到一个本地纳什均衡点所解释的那样。
参见 这个答案了解更多关于亚当的动量类行为如何不同于通常的动量类行为。

让我们把它归结为几个简单的问题:

哪个优化器会给我最好的结果/准确性?

没有什么灵丹妙药。对于您的任务,一些优化器可能比其他优化器更有效。事先没有办法知道,你必须尝试一些才能找到最好的。好消息是,不同优化器的结果可能彼此接近。但是,您必须为所选择的任何单个优化器找到最佳的超参数。

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

也许,使用 AdamOptimizer 并在 Learning _ rate 0.001和0.0001下运行它。如果你想得到更好的结果,试试其他的学习速度。或者尝试其他优化器并调整它们的超参数。

说来话长

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

  • 易于使用(例如,您可以多快地找到适合您的参数) ;
  • 收敛速度(基本为 SGD 或更快的任何其他) ;
  • 内存占用(通常在模型的0到 x2之间) ;
  • 与培训过程其他部分的关系。

简单的 SGD 是可以实现的最小值: 它只是将梯度乘以学习速率,然后将结果添加到权值中。SGD 有许多优美的品质: 它只有1个超参数; 它不需要任何额外的内存; 它对训练的其他部分影响最小。它也有两个缺点: 它可能过于敏感的学习率选择和培训可以比其他方法需要更长的时间。

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

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

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

我认为 使用方便在优化器的选择中是最重要的。不同的优化器有不同数量的超参数,对它们有不同的敏感性。我认为亚当是所有现成的中最简单的一个。您通常需要检查 0.0010.0001之间的2-4个学习率,以确定模型是否收敛得很好。为了对 SGD (和动量)进行比较,我通常使用 [0.1, 0.01, ... 10e-5]。亚当还有两个超参数很少需要改变。

优化器与训练其他部分的关系。超参数调优通常涉及同时选择 {learning_rate, weight_decay, batch_size, droupout_rate}。它们都是相互关联的,都可以看作是模型正则化的一种形式。例如,如果确切地使用重量衰减或 L2-范数,并且可能选择 AdamWOptimizer而不是 AdamOptimizer,就必须密切注意。