梯度下降优化算法概述感谢:本文最初作为博客文章出现在http://sebastianruder.com/optimizing-gradient-descent/index.html 2016 年 1 月 19 日。

Sebastian Ruder
Insight Centre for Data Analytics, NUI Galway
Aylien Ltd., Dublin
ruder.sebastian@gmail.com
摘要

梯度下降优化算法虽然越来越流行,但经常被用作黑盒优化器,因为很难对其优点和缺点进行实际解释。 本文旨在为读者提供有关不同算法行为的直觉,以便他们能够使用它们。 在本概述的过程中,我们研究了梯度下降的不同变体,总结了挑战,介绍了最常见的优化算法,回顾了并行和分布式设置中的架构,并研究了优化梯度下降的其他策略。

1简介

梯度下降是最流行的优化算法之一,也是迄今为止优化神经网络的最常见方法。 同时,每个最先进的深度学习库都包含各种优化梯度下降算法的实现(例如烤宽面条的111http://lasagne.readthedocs.org/en/latest/modules/updates.html,caffe的 222http://caffe.berkeleyvision.org/tutorial/solver.html 和 keras 的35>33http://keras.io/optimizers/ 然而,这些算法通常被用作黑盒优化器,因为很难对其优点和缺点进行实际解释。

本文旨在为读者提供关于优化梯度下降的不同算法的行为的直觉,这将有助于他们使用它们。 在第 2 节中,我们首先将了解梯度下降的不同变体。 然后,我们将在第 3 节中简要总结训练期间的挑战。 随后,在第4节中,我们将介绍最常见的优化算法,展示它们解决这些挑战的动机以及这如何导致其更新规则的推导。 然后,在第 5 节中,我们将简要介绍在并行和分布式设置中优化梯度下降的算法和架构。 最后,我们将在第 6 节中考虑有助于优化梯度下降的其他策略。

梯度下降是一种通过以与目标函数θJ(θ)相反的方向更新参数来最小化由模型参数θd参数化的目标函数J(θ)的方法> 写。 到参数。 学习率η决定了我们达到(局部)最小值所采取的步骤的大小。 换句话说,我们沿着目标函数创建的表面坡度方向下坡,直到到达山谷。444如果您不熟悉梯度下降,您可以在 http://cs231n.github.io/optimization- 找到关于优化神经网络的很好的介绍。 1/

2 梯度下降变体

梯度下降有三种变体,其不同之处在于我们使用多少数据来计算目标函数的梯度。 根据数据量,我们在参数更新的准确性和执行更新所需的时间之间进行权衡。

2.1 批量梯度下降

普通梯度下降,又名批量梯度下降,计算成本函数的梯度。 整个训练数据集的参数 θ

θ=θηθJ(θ) (1)

由于我们需要计算整个数据集的梯度来执行一次更新,因此批量梯度下降可能非常慢,并且对于不适合内存的数据集来说是很棘手的。 批量梯度下降也不允许我们在线更新模型,即即时使用新示例。

在代码中,批量梯度下降看起来像这样:

for i in range(nb_epochs):
params_grad = evaluate_gradient(loss_function, data, params)
params = params - learning_rate * params_grad

对于预定义的 epoch 数,我们首先计算整个数据集的损失函数的梯度向量 params_grad 我们的参数向量params 请注意,最先进的深度学习库提供自动微分,可以有效计算梯度。 一些参数。 如果您自己导出梯度,那么梯度检查是一个好主意。555请参阅 http://cs231n.github.io/neural-networks-3/,了解有关如何检查梯度的一些重要提示适当地。

然后,我们沿梯度方向更新参数,学习率决定我们执行的更新大小。 批量梯度下降保证凸误差曲面收敛到全局最小值,非凸曲面收敛到局部最小值。

2.2随机梯度下降

相反,随机梯度下降 (SGD) 对 each 训练示例 x(i) 和标签 y(i) 执行参数更新:

θ=θηθJ(θ;x(i);y(i)) (2)

批量梯度下降对大型数据集执行冗余计算,因为它在每次参数更新之前重新计算类似示例的梯度。 SGD 通过一次执行一个更新来消除这种冗余。 因此,它通常要快得多,也可以用于在线学习。 SGD 执行高方差的频繁更新,导致目标函数剧烈波动,如图 1 所示。

Refer to caption
图1: 新元波动(来源:维基百科)

虽然批量梯度下降收敛到参数所在盆地的最小值,但 SGD 的波动一方面使其能够跳跃到新的、可能更好的局部最小值。 另一方面,这最终会使收敛到精确最小值变得复杂,因为 SGD 会不断超调。 然而,研究表明,当我们缓慢降低学习率时,SGD 表现出与批量梯度下降相同的收敛行为,几乎肯定会分别收敛到非凸优化和凸优化的局部或全局最小值。 它的代码片段只是在训练示例上添加一个循环并评估梯度。 每个例子。 请注意,我们按照 6.1 节中的说明在每个时期对训练数据进行混洗。

for i in range(nb_epochs):
np.random.shuffle(data)
for example in data:
params_grad = evaluate_gradient(loss_function, example, params)
params = params - learning_rate * params_grad

2.3 小批量梯度下降

小批量梯度下降最终实现了两全其美,并对每个小批量 n 训练示例执行更新:

θ=θηθJ(θ;x(i:i+n);y(i:i+n)) (3)

这样,a)减少了参数更新的方差,这可以导致更稳定的收敛; b) 可以利用最先进的深度学习库常见的高度优化的矩阵优化,从而可以计算梯度。 小批量非常高效。 常见的小批量大小范围在 50256 之间,但根据不同的应用程序可能会有所不同。 小批量梯度下降通常是训练神经网络时选择的算法,并且在使用小批量时通常也会使用术语 SGD。 注意:在本文其余部分对 SGD 的修改中,为了简单起见,我们省略了参数 x(i:i+n);y(i:i+n)

在代码中,我们现在不再迭代示例,而是迭代大小为 50 的小批量:

for i in range(nb_epochs):
np.random.shuffle(data)
for batch in get_batches(data, batch_size=50):
params_grad = evaluate_gradient(loss_function, batch, params)
params = params - learning_rate * params_grad

3挑战

然而,普通的小批量梯度下降并不能保证良好的收敛性,而是提出了一些需要解决的挑战:

  • 选择合适的学习率可能很困难。 学习率太小会导致收敛速度极其缓慢,而学习率太大会阻碍收敛并导致损失函数在最小值附近波动甚至发散。

  • 学习率计划[18]尝试在训练期间调整学习率,例如退火,即根据预定义的时间表或当历元之间的目标变化低于阈值时降低学习率。 然而,这些时间表和阈值必须提前定义,因此无法适应数据集的特征[4]

  • 此外,相同的学习率适用于所有参数更新。 如果我们的数据稀疏并且我们的特征具有非常不同的频率,我们可能不想将所有特征更新到相同的程度,而是对很少出现的特征执行更大的更新。

  • 最小化神经网络常见的高度非凸误差函数的另一个关键挑战是避免陷入众多次优局部最小值中。 Dauphin 等人[5]认为,困难实际上不是来自局部极小值,而是来自鞍点,即一个维度向上倾斜而另一个维度向下倾斜的点。 这些鞍点通常被相同误差的平台所包围,这使得 SGD 很难逃脱,因为在所有维度上梯度都接近于零。

4梯度下降优化算法

接下来,我们将概述深度学习社区广泛使用的一些算法来应对上述挑战。 我们不会讨论在实践中无法计算高维数据集的算法,例如二阶方法,例如牛顿法666https://en.wikipedia.org/wiki/Newton%27s_method_in_optimization

4.1势头

SGD 在穿越峡谷时遇到困难,即表面曲线在一个维度上比在另一个维度上弯曲得多的区域 [20],这在局部最优附近很常见。 在这些情况下,SGD 在峡谷的斜坡上振荡,同时仅沿着底部向局部最优方向犹豫前进,如图 2(a) 所示。

Refer to caption
(a) SGD without momentum
Refer to caption
(b) SGD with momentum
图2: 资料来源:吉纳维芙·B·奥尔

动量[17]是一种有助于在相关方向加速SGD并抑制振荡的方法,如图2(b)所示。 它通过将过去时间步的更新向量的分数 γ 添加到当前更新向量来实现此目的777一些实现会交换方程中的符号。

vt=γvt1+ηθJ(θ)θ=θvt (4)

动量项γ通常设置为0.9或类似值。

本质上,当使用动量时,我们将球推下山。 球在滚下坡时积累动量,一路上变得越来越快(直到达到最终速度,如果存在空气阻力,即 γ<1)。 我们的参数更新也会发生同样的事情:对于梯度指向相同方向的维度,动量项会增加,对于梯度改变方向的维度,动量项会减少更新。 结果,我们获得了更快的收敛速度并减少了振荡。

4.2Nesterov加速梯度

然而,一个球从山上滚下来,盲目地跟随斜坡,是非常不令人满意的。 我们希望有一个更智能的球,一个知道自己要去哪里的球,这样它就知道在山再次倾斜之前要减速。

Nesterov 加速梯度 (NAG) [14] 是为我们的动量项提供这种先见之明的一种方式。 我们知道我们将使用动量项 γvt1 来移动参数 θ。因此,计算 θγvt1 为我们提供了参数下一个位置的近似值(完整更新时缺少梯度),即我们的参数将在哪里的粗略想法。 我们现在可以通过计算梯度而不是 w.r.t 来有效地预测未来。 到我们当前的参数 θ 但 w.r.t. 我们参数的大致未来位置:

vt=γvt1+ηθJ(θγvt1)θ=θvt (5)

我们再次将动量项 γ 设置为 0.9 左右的值。 Momentum 首先计算当前梯度(图 3 中的小蓝色向量),然后在更新的累积梯度(大蓝色向量)的方向上进行大跳跃,而 NAG 首先在先前累积梯度的方向(棕色向量),测量梯度,然后进行校正(绿色向量)。 这种预期的更新可以防止我们走得太快,并提高响应能力,从而显着提高 RNN 在许多任务上的性能[2]888请参阅http://cs231n.github.io/neural-networks-3/了解 NAG 背后直觉的另一种解释,而 Ilya Sutskever 在他的博士论文 [19] 中给出了更详细的概述。

现在我们能够根据误差函数的斜率调整更新并反过来加速 SGD,我们还希望根据每个参数的重要性来调整更新以执行更大或更小的更新。

Refer to caption
图3: Nesterov 更新(来源:G. Hinton 的讲座 6c)

4.3阿达格勒

Adagrad [8] 是一种基于梯度的优化算法,它的作用是:根据参数调整学习率,对不频繁的参数执行较大的更新,对频繁的参数执行较小的更新。 因此,它非常适合处理稀疏数据。 Dean 等人 [6] 发现 Adagrad 极大地提高了 SGD 的鲁棒性,并将其用于 Google 的大规模神经网络训练,其中包括学会识别 Youtube 视频中的猫999http://www.wired.com/2012/06/google-x-neural-network/ 此外,Pennington 等人 [16] 使用 Adagrad 来训练 GloVe 词嵌入,因为不常见的单词比频繁的单词需要更大的更新。

之前,我们一次对所有参数 θ 进行更新,因为每个参数 θi 使用相同的学习率 η 由于 Adagrad 在每个时间步 t 对每个参数 θi 使用不同的学习率,因此我们首先显示 Adagrad 的每个参数更新,然后对其进行矢量化。 为了简洁起见,我们将 gt,i 设置为目标函数 w.r.t 的梯度。 到时间步t处的参数θi

gt,i=θtJ(θt,i) (6)

每个参数 θi 在每个时间步 t 的 SGD 更新将变为:

θt+1,i=θt,iηgt,i (7)

在更新规则中,Adagrad 会根据过去为 θi 计算的梯度,在每个时间步 t 对每个参数 θi 修改一般学习率 η

θt+1,i=θt,iηGt,ii+ϵgt,i (8)

Gtd×d 这里是一个对角矩阵,其中每个对角元素 i,i 是梯度的平方和。 θi 直到时间步 t101010Duchi 等人 [8] 将此矩阵作为包含外部产品的 full 矩阵的替代所有先前的梯度,因为即使对于中等数量的参数d,矩阵平方根的计算也是不可行的。,而 ϵ 是避免被零除的平滑项(通常约为 1e8)。 有趣的是,如果没有平方根运算,算法的性能会差很多。

由于 Gt 包含过去梯度的平方和。 的对角线上的所有参数 θ,现在我们可以通过在 Gtgt 之间执行元素向矩阵-向量乘法 来实现向量化:

θt+1=θtηGt+ϵgt. (9)

Adagrad 的主要好处之一是它无需手动调整学习率。 大多数实现都使用默认值 0.01 并保留该值。

Adagrad 的主要弱点是分母中梯度平方的累积:由于每一项相加的项都是正数,因此累积的总和在训练过程中不断增长。 这反过来会导致学习率缩小并最终变得无限小,此时算法不再能够获取额外的知识。 以下算法旨在解决此缺陷。

4.4阿达德尔塔

Adadelta [22] 是 Adagrad 的扩展,旨在降低其攻击性、单调递减的学习率。 Adadelta 不是累积所有过去的平方梯度,而是将累积的过去梯度的窗口限制为某个固定大小w

不是低效地存储 w 先前的平方梯度,而是将梯度总和递归地定义为所有过去的平方梯度的衰减平均值。 时间步 t 处的运行平均值 E[g2]t 仅取决于(与动量项类似的分数 γ)仅取决于先前平均值和当前梯度:

E[g2]t=γE[g2]t1+(1γ)gt2 (10)

我们将 γ 设置为与动量项类似的值,大约在 0.9 附近。 为了清楚起见,我们现在根据参数更新向量 Δθt 重写我们的普通 SGD 更新:

Δθt=ηgt,iθt+1=θt+Δθt (11)

我们之前推导的 Adagrad 参数更新向量的形式如下:

Δθt=ηGt+ϵgt (12)

现在,我们只需将对角矩阵 Gt 替换为过去平方梯度 E[g2]t 的衰减平均值:

Δθt=ηE[g2]t+ϵgt (13)

由于分母只是梯度的均方根(RMS)误差准则,我们可以将其替换为准则简写:

Δθt=ηRMS[g]tgt (14)

作者指出,此更新中的单位(以及 SGD、Momentum 或 Adagrad 中的单位)不匹配,即更新应具有与参数相同的假设单位。 为了实现这一点,他们首先定义另一个指数衰减平均值,这次不是梯度平方而是参数更新平方:

E[Δθ2]t=γE[Δθ2]t1+(1γ)Δθt2 (15)

参数更新的均方根误差为:

RMS[Δθ]t=E[Δθ2]t+ϵ (16)

由于 RMS[Δθ]t 未知,因此我们使用上一个时间步之前参数更新的 RMS 对其进行近似。 将之前更新规则中的学习率η替换为RMS[Δθ]t1,最终得到Adadelta更新规则:

Δθt=RMS[Δθ]t1RMS[g]tgtθt+1=θt+Δθt (17)

使用 Adadelta,我们甚至不需要设置默认学习率,因为它已从更新规则中删除。

4.5RMSprop

RMSprop 是一种未发表的自适应学习率方法,由 Geoff Hinton 在他的 Coursera 课程第 6e 课中提出111111http://www.cs.toronto.edu/~tijmen/csc321/slides/lecture_slides_lec6.pdf

RMSprop 和 Adadelta 都是在同一时间独立开发的,因为需要解决 Adagrad 学习率急剧下降的问题。 事实上,RMSprop 与我们上面推导的 Adadelta 的第一个更新向量相同:

E[g2]t=0.9E[g2]t1+0.1gt2θt+1=θtηE[g2]t+ϵgt (18)

RMSprop 还将学习率除以平方梯度的指数衰减平均值。 Hinton 建议将 γ 设置为 0.9,而学习率 η 的一个很好的默认值是 0.001

4.6亚当

自适应矩估计 (Adam) [10] 是另一种计算每个参数的自适应学习率的方法。 除了像 Adadelta 和 RMSprop 一样存储过去梯度平方 vt 的指数衰减平均值之外,Adam 还保存过去梯度 mt 的指数衰减平均值,类似于动量:

mt=β1mt1+(1β1)gtvt=β2vt1+(1β2)gt2 (19)

mtvt 分别是梯度的一阶矩(平均值)和二阶矩(非中心方差)的估计,因此该方法的名称。 由于 mtvt 被初始化为 0 的向量,Adam 的作者观察到它们偏向于零,特别是在初始时间步长期间,尤其是当衰减率较小时(即 β1β2 接近 1)。

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

m^t=mt1β1tv^t=vt1β2t (20)

然后他们使用这些来更新参数,就像我们在 Adadelta 和 RMSprop 中看到的那样,这产生了 Adam 更新规则:

θt+1=θtηv^t+ϵm^t (21)

作者建议 β1 的默认值为 0.9β2 的默认值为 0.999ϵ 的默认值为 108 他们凭经验表明,Adam 在实践中效果良好,并且与其他自适应学习方法算法相比具有优势。

4.7AdaMax

Adam 更新规则中的 vt 因子与过去梯度的 2 范数(通过 vt1 项)和当前梯度 |gt|2

vt=β2vt1+(1β2)|gt|2 (22)

我们可以将此更新推广到 p 规范。 请注意,Kingma 和 Ba 还将 β2 参数化为 β2p

vt=β2pvt1+(1β2p)|gt|p (23)

p 值的范数通常在数值上变得不稳定,这就是为什么 12 范数在实践中最常见的原因。 然而, 通常也表现出稳定的行为。 为此,作者提出了 AdaMax [10] 并证明 vt 收敛到以下更稳定的值。 为了避免与 Adam 混淆,我们使用 ut 来表示无限范数约束的 vt

ut=β2vt1+(1β2)|gt|=max(β2vt1,|gt|) (24)

我们现在可以将其代入 Adam 更新方程,将 v^t+ϵ 替换为 ut 以获得 AdaMax 更新规则:

θt+1=θtηutm^t (25)

请注意,由于 ut 依赖于 max 操作,因此不像 Adam 中的 mtvt 那样倾向于零,这就是为什么我们不需要计算 ut 的偏差校正。 好的默认值还是 η=0.002β1=0.9β2=0.999

4.8那达慕

正如我们之前所看到的,Adam 可以被视为 RMSprop 和动量的组合:RMSprop 贡献了过去梯度平方vt的指数衰减平均值,而动量则贡献了过去梯度mt 我们还看到 Nesterov 加速梯度(NAG)优于普通动量。

Nadam(Nesterov 加速自适应矩估计)[7] 因此结合了 Adam 和 NAG。 为了将NAG合并到Adam中,我们需要修改它的动量项mt

首先,让我们使用当前的符号回顾一下动量更新规则:

gt=θtJ(θt)mt=γmt1+ηgtθt+1=θtmt (26)

其中 J 是我们的目标函数,γ 是动量衰减项,η 是我们的步长。 展开上面的第三个方程得出:

θt+1=θt(γmt1+ηgt) (27)

这再次证明动量涉及在先前动量向量的方向上迈出一步以及在当前梯度方向上迈出一步。

然后,NAG 允许我们在计算梯度之前,通过动量步更新参数,在梯度方向上执行更精确的步骤。 因此我们只需要修改梯度 gt 即可得到 NAG:

gt=θtJ(θtγmt1)mt=γmt1+ηgtθt+1=θtmt (28)

Dozat 建议按以下方式修改 NAG:不是应用两次动量步骤——一次用于更新梯度 gt,第二次用于更新参数 θt+1——我们现在应用直接预测前向动量向量来更新当前参数:

gt=θtJ(θt)mt=γmt1+ηgtθt+1=θt(γmt+ηgt) (29)

请注意,我们现在使用当前动量向量 mt 来展望未来,而不是像方程 27 中那样利用先前的动量向量 mt1 为了给 Adam 添加 Nesterov 动量,我们可以类似地用当前动量向量替换之前的动量向量。 首先,回想一下 Adam 更新规则如下(请注意,我们不需要修改 v^t):

mt=β1mt1+(1β1)gtm^t=mt1β1tθt+1=θtηv^t+ϵm^t (30)

m^tmt 的定义依次展开第二个方程,得出:

θt+1=θtηv^t+ϵ(β1mt11β1t+(1β1)gt1β1t) (31)

请注意,β1mt11β1t 只是前一时间步动量向量的偏差校正估计。 因此我们可以将其替换为 m^t1

θt+1=θtηv^t+ϵ(β1m^t1+(1β1)gt1β1t) (32)

该方程看起来与方程 27 中的扩展动量项非常相似。 现在,我们可以添加 Nesterov 动量,就像在方程 29 中所做的那样,只需将前一时间步 m^t1 的动量向量的偏差校正估计替换为偏差校正估计即可当前动量向量m^t,这给我们提供了Nadam更新规则:

θt+1=θtηv^t+ϵ(β1m^t+(1β1)gt1β1t) (33)

4.9 算法可视化

下面两幅图提供了对所提出的优化算法的优化行为的一些直觉。121212另请参阅http://cs231n.github.io/neural-networks-3/以获取相同的描述Karpathy 提供的图像以及所讨论算法的另一个简明概述。

在图4(a)中,我们看到它们在损失表面轮廓上所采取的路径(Beale函数)。 所有人都从同一点开始,并采取不同的路径来达到最小值。 请注意,Adagrad、Adadelta 和 RMSprop 立即朝正确的方向前进,并且收敛得同样快,而 Momentum 和 NAG 则偏离了轨道,让人联想到球滚下山的图像。 然而,NAG 能够更快地纠正其路线,因为它通过展望未来并走向最低限度来提高响应能力。

4(b)显示了算法在鞍点处的行为,即一个维度具有正斜率,而另一个维度具有负斜率的点,这给SGD带来了困难:我们之前提到过。 请注意,SGD、Momentum 和 NAG 发现很难打破对称性,尽管后两者最终设法逃离鞍点,而 Adagrad、RMSprop 和 Adadelta 则迅速走下负斜率,其中 Adadelta 处于领先地位。

Refer to caption
(a) SGD optimization on loss surface contours
Refer to caption
(b) SGD optimization on saddle point
图4: 来源和完整动画:Alec Radford

正如我们所看到的,自适应学习率方法,即 Adagrad、Adadelta、RMSprop 和 Adam 最合适,并为这些场景提供最佳的收敛性。

4.10 使用哪个优化器?

那么,您应该使用哪个优化器? 如果您的输入数据稀疏,那么您可能会使用其中一种自适应学习率方法获得最佳结果。 另一个好处是您不需要调整学习率,但可能会使用默认值获得最佳结果。

总之,RMSprop 是 Adagrad 的扩展,可解决学习率急剧下降的问题。 它与 Adadelta 相同,只是 Adadelta 在分子更新规则中使用参数更新的 RMS。 最后,Adam 在 RMSprop 中添加了偏差校正和动量。 就目前而言,RMSprop、Adadelta 和 Adam 是非常相似的算法,在相似的情况下表现良好。 Kingma 等人 [10] 表明,随着梯度变得稀疏,其偏差校正有助于 Adam 在优化结束时略微优于 RMSprop。 就目前而言,亚当可能是最好的整体选择。

有趣的是,最近的许多论文都使用没有动量的普通 SGD 和简单的学习率退火计划。 正如所示,SGD 通常可以找到最小值,但它可能比某些优化器花费更长的时间,更依赖于稳健的初始化和退火计划,并且可能会陷入鞍点而不是局部最小值。 因此,如果您关心快速收敛并训练深度或复杂的神经网络,您应该选择其中一种自适应学习率方法。

5 并行化和分发 SGD

鉴于大规模数据解决方案的普遍存在以及低商品集群的可用性,分发 SGD 以进一步加快速度是一个显而易见的选择。 SGD 本身本质上是顺序的:我们一步一步地朝着最小值前进。 运行它可以提供良好的收敛性,但速度可能会很慢,尤其是在大型数据集上。 相比之下,异步运行 SGD 速度更快,但工作线程之间的次优通信可能会导致收敛不良。 此外,我们还可以在一台机器上并行化SGD,而不需要大型计算集群。 以下是为优化并行和分布式 SGD 而提出的算法和架构。

5.1霍格野生!

Niu 等人[15]介绍一个名为Hogwild的更新方案! 允许在 CPU 上并行执行 SGD 更新。 允许处理器访问共享内存而不锁定参数。 这只适用于输入数据稀疏的情况,因为每次更新只会修改所有参数的一小部分。 他们表明,在这种情况下,更新方案几乎实现了最佳收敛率,因为处理器不太可能覆盖有用信息。

5.2倾盆大雨新加坡元

Downpour SGD 是 SGD 的异步变体,由 Dean 等人 [6] 在 Google 的 DistBelief 框架(TensorFlow 的前身)中使用。 它在训练数据的子集上并行运行模型的多个副本。 这些模型将其更新发送到参数服务器,该服务器分布在许多机器上。 每台机器负责存储和更新模型参数的一部分。 然而,由于副本之间不进行通信,例如通过共享权重或更新,它们的参数不断面临发散的风险,从而阻碍收敛。

5.3 SGD 的延迟容忍算法

McMahan 和 Streeter [12] 通过开发延迟容忍算法将 AdaGrad 扩展到并行设置,该算法不仅适应过去的梯度,而且适应更新延迟。 这在实践中已被证明效果良好。

5.4TensorFlow

TensorFlow131313https://www.tensorflow.org/ [1] 是 Google 最近开源的用于实现和部署大规模机器学习模型的框架。 它基于他们在 DistBelief 方面的经验,并且已经在内部用于在大量移动设备以及大型分布式系统上执行计算。 分布式版本,于 2016 年 4 月发布 141414http://googleresearch.blogspot.ie/2016/04/announcing-tensorflow-08-now-with.html 依赖于每个设备分成子图的计算图,而通信则使用发送/接收节点对。

5.5 弹性平均 SGD

张等人[23]提出弹性平均SGD(EASGD),它将异步SGD的worker参数与弹性力(即参数服务器存储的中心变量)联系起来。 这允许局部变量远离中心变量波动,理论上允许对参数空间进行更多探索。 他们根据经验表明,探索能力的增加可以通过寻找新的局部最优来提高性能。

6 优化 SGD 的其他策略

最后,我们介绍了可以与前面提到的任何算法一起使用的其他策略,以进一步提高 SGD 的性能。 有关其他一些常见技巧的详细概述,请参阅[11]

6.1 洗牌和课程学习

一般来说,我们希望避免以有意义的顺序向我们的模型提供训练示例,因为这可能会使优化算法产生偏差。 因此,在每个时期之后对训练数据进行洗牌通常是一个好主意。

另一方面,对于某些我们旨在解决逐渐困难的问题的情况,以有意义的顺序提供训练示例实际上可能会提高性能和更好的收敛性。 建立这种有意义的秩序的方法称为课程学习[3]

Zaremba 和 Sutskever [21] 只能训练 LSTM 来评估使用课程学习的简单程序,并表明组合或混合策略比简单策略更好,后者通过增加难度对示例进行排序。

6.2 批量归一化

为了促进学习,我们通常通过使用零均值和单位方差初始化参数来标准化参数的初始值。 随着训练的进行以及我们不同程度地更新参数,我们会失去这种标准化,这会减慢训练速度并随着网络变得更深而放大变化。

批量标准化[9]为每个小批量重新建立这些标准化,并且更改也通过操作反向传播。 通过使归一化成为模型架构的一部分,我们能够使用更高的学习率并减少对初始化参数的关注。 批量归一化还充当正则化器,减少(有时甚至消除)Dropout 的需要。

6.3提前停止

根据 Geoff Hinton 的说法:“早点停下来就是美丽的免费午餐”151515NIPS 2015 Tutorial slides, slide 63, http://www.iro.umontreal.ca/~bengioy/talks/DL-Tutorial-NIPS2015.pdf 因此,您应该在训练期间始终监控验证集上的错误,如果验证错误没有得到足够的改善,则停止(需要一些耐心)。

6.4梯度噪声

Neelakantan 等人 [13] 将遵循高斯分布 N(0,σt2) 的噪声添加到每个梯度更新中:

gt,i=gt,i+N(0,σt2) (34)

他们根据以下时间表对方差进行退火:

σt2=η(1+t)γ (35)

他们表明,添加这种噪声可以使网络对不良初始化更加鲁棒,并有助于训练特别深度和复杂的网络。 他们怀疑增加的噪声使模型有更多机会逃脱并找到新的局部最小值,这对于更深的模型来说更常见。

7结论

在本文中,我们初步了解了梯度下降的三种变体,其中最流行的是小批量梯度下降。 然后,我们研究了最常用于优化 SGD 的算法:Momentum、Nesterov 加速梯度、Adagrad、Adadelta、RMSprop、Adam、AdaMax、Nadam,以及用于优化异步 SGD 的不同算法。 最后,我们考虑了其他改进 SGD 的策略,例如洗牌和课程学习、批量归一化和早期停止。

参考

  • [1] Martin Abadi, Ashish Agarwal, Paul Barham, Eugene Brevdo, Zhifeng Chen, Craig Citro, Greg Corrado, Andy Davis, Jeffrey Dean, Matthieu Devin, Sanjay Ghemawat, Ian Goodfellow, Andrew Harp, Geoffrey Irving, Michael Isard, Yangqing Jia, Lukasz Kaiser, Manjunath Kudlur, Josh Levenberg, Dan Man, Rajat Monga, Sherry Moore, Derek Murray, Jon Shlens, Benoit Steiner, Ilya Sutskever, Paul Tucker, Vincent Vanhoucke, Vijay Vasudevan, Oriol Vinyals, Pete Warden, Martin Wicke, Yuan Yu, and Xiaoqiang Zheng. TensorFlow: Large-Scale Machine Learning on Heterogeneous Distributed Systems. 2015.
  • [2] Yoshua Bengio, Nicolas Boulanger-Lewandowski, and Razvan Pascanu. Advances in Optimizing Recurrent Networks. 2012.
  • [3] Yoshua Bengio, Jérôme Louradour, Ronan Collobert, and Jason Weston. Curriculum learning. Proceedings of the 26th annual international conference on machine learning, pages 41–48, 2009.
  • [4] C. Darken, J. Chang, and J. Moody. Learning rate schedules for faster stochastic gradient search. Neural Networks for Signal Processing II Proceedings of the 1992 IEEE Workshop, (September):1–11, 1992.
  • [5] Yann N. Dauphin, Razvan Pascanu, Caglar Gulcehre, Kyunghyun Cho, Surya Ganguli, and Yoshua Bengio. Identifying and attacking the saddle point problem in high-dimensional non-convex optimization. arXiv, pages 1–14, 2014.
  • [6] Jeffrey Dean, Greg S. Corrado, Rajat Monga, Kai Chen, Matthieu Devin, Quoc V. Le, Mark Z. Mao, Marc Aurelio Ranzato, Andrew Senior, Paul Tucker, Ke Yang, and Andrew Y. Ng. Large Scale Distributed Deep Networks. NIPS 2012: Neural Information Processing Systems, pages 1–11, 2012.
  • [7] Timothy Dozat. Incorporating Nesterov Momentum into Adam. ICLR Workshop, (1):2013–2016, 2016.
  • [8] John Duchi, Elad Hazan, and Yoram Singer. Adaptive Subgradient Methods for Online Learning and Stochastic Optimization. Journal of Machine Learning Research, 12:2121–2159, 2011.
  • [9] Sergey Ioffe and Christian Szegedy. Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift. arXiv preprint arXiv:1502.03167v3, 2015.
  • [10] Diederik P. Kingma and Jimmy Lei Ba. Adam: a Method for Stochastic Optimization. International Conference on Learning Representations, pages 1–13, 2015.
  • [11] Yann LeCun, Leon Bottou, Genevieve B. Orr, and Klaus Robert Müller. Efficient BackProp. Neural Networks: Tricks of the Trade, 1524:9–50, 1998.
  • [12] H. Brendan Mcmahan and Matthew Streeter. Delay-Tolerant Algorithms for Asynchronous Distributed Online Learning. Advances in Neural Information Processing Systems (Proceedings of NIPS), pages 1–9, 2014.
  • [13] Arvind Neelakantan, Luke Vilnis, Quoc V. Le, Ilya Sutskever, Lukasz Kaiser, Karol Kurach, and James Martens. Adding Gradient Noise Improves Learning for Very Deep Networks. pages 1–11, 2015.
  • [14] Yurii Nesterov. A method for unconstrained convex minimization problem with the rate of convergence o(1/k2). Doklady ANSSSR (translated as Soviet.Math.Docl.), 269:543–547.
  • [15] Feng Niu, Benjamin Recht, R Christopher, and Stephen J Wright. Hogwild!: A Lock-Free Approach to Parallelizing Stochastic Gradient Descent. pages 1–22, 2011.
  • [16] Jeffrey Pennington, Richard Socher, and Christopher D. Manning. Glove: Global Vectors for Word Representation. Proceedings of the 2014 Conference on Empirical Methods in Natural Language Processing, pages 1532–1543, 2014.
  • [17] Ning Qian. On the momentum term in gradient descent learning algorithms. Neural networks : the official journal of the International Neural Network Society, 12(1):145–151, 1999.
  • [18] Herbert Robbins and Sutton Monro. A Stochastic Approximation Method. The Annals of Mathematical Statistics, 22(3):400–407, 1951.
  • [19] Ilya Sutskever. Training Recurrent neural Networks. PhD thesis, page 101, 2013.
  • [20] Richard S. Sutton. Two problems with backpropagation and other steepest-descent learning procedures for networks, 1986.
  • [21] Wojciech Zaremba and Ilya Sutskever. Learning to Execute. pages 1–25, 2014.
  • [22] Matthew D. Zeiler. ADADELTA: An Adaptive Learning Rate Method. arXiv preprint arXiv:1212.5701, 2012.
  • [23] Sixin Zhang, Anna Choromanska, and Yann LeCun. Deep learning with Elastic Averaging SGD. Neural Information Processing Systems Conference (NIPS 2015), pages 1–24, 2015.