梯度下降优化算法综述

image.png

标题:An overview of gradient descent optimization algorithms∗

论文地址:https://arxiv.org/pdf/1609.04747.pdf

Abstract:

虽然梯度下降优化算法越来越受欢迎,但通常作为黑盒优化器使用,因此很难对其优点和缺点的进行实际的解释。本文旨在让读者对不同的算法有直观的认识,以帮助读者使用这些算法。在本综述中,我们介绍梯度下降的不同变形形式,总结这些算法面临的挑战,介绍最常用的优化算法,回顾并行和分布式架构,以及调研用于优化梯度下降的其他的策略。

1、Introduction:

梯度下降法是最常用的优化算法之一,也是迄今为止最常用的神经网络优化方法。

同时,每一SOTA的深度学习lib库都包含各种算法来实现梯度下降的优化。然而,这些算法通常被用作黑盒优化器,因为很难找到它们的优缺点的实际解释。

本文旨在为读者提供有关优化梯度下降的不同算法。

  • 第2节,梯度下降的不同变体。
  • 第3节,简要总结训练期间面临的挑战。
  • 第4节,介绍最常用的优化算法,包括这些算法在解决以上挑战时的动机以及如何得到更新规则的推导形式。
  • 第5节,在并行和分布式环境中优化梯度下降的算法和框架。
  • 第6节,优化梯度下降的附加策略。

梯度下降法是最小化目标函数J(θ)的一种方法,其中,θ∈Rd为模型参数,梯度下降法利用目标函数关于参数的梯度∇θJ(θ) 的反方向更新参数。学习率η决定达到最小值或者局部最小值过程中所采用的的步长的大小。即,我们沿着目标函数的斜面下降的方向

2、 梯度下降法的变形形式:

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

2.1 Batch gradient descent【批量梯度下降】:

Vanilla gradient descent,又名batch gradient descent,在整个训练数据集上计算损失函数关于参数θ的梯度

image.png

因为在执行每次更新时,我们需要在整个数据集上计算所有的梯度,所以批梯度下降法的速度会很慢,同时,批梯度下降法无法处理超出内存容量限制的数据集。批梯度下降法同样也不能在线更新模型,即在运行的过程中,不能增加新的样本。

批梯度下降法的代码如下所示:

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

对于预定义数量的历元,我们首先计算整个数据集w.r.t.的损失函数的梯度向量params_grad。我们的参数向量params。请注意,最先进的深度学习库提供了自动微分,可以有效地计算梯度w.r.t.一些参数。如果你自己推导梯度,那么梯度检查是个好主意。6. 然后,我们按照梯度的方向更新参数,学习速率决定我们执行的更新的大小。对于凸误差曲面,批梯度下降法保证收敛到全局最小值,对于非凸曲面,批梯度下降法保证收敛到局部最小值。

对于给定的迭代次数epchs:

(1)首先,我们利用全部数据集计算损失函数关于参数向量params的梯度向量params_grad。注意,最新的深度学习库中提供了自动求导的功能,可以有效地计算关于参数梯度。如果你自己求梯度,那么,梯度检查是一个不错的主意。

(2)然后,我们利用梯度的方向和学习率更新参数学习率决定我们将以多大的步长更新参数
O 对于凸误差函数,批梯度下降法能够保证收敛到全局最小值。
O 对于非凸函数,则收敛到一个局部最小值。

2.2、 Stochastic gradient descent【随机梯度下降算法】:

相比之下,随机梯度下降(SGD)根据每一条训练样本x(i)和标签y(i)更新参数:

image.png

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

image.png

与批量梯度下降算法的收敛会使得损失函数陷入局部最小相比,由于SGD的波动性:

  • 一方面,波动性使得SGD可以跳到新的和潜在更好的局部最优。
  • 另一方面,这使得最终收敛到特定最小值的过程变得复杂,因为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、Mini-batch gradient descent【小批量梯度下降】:

小批量梯度下降法最终结合了上述两种方法的优点,在每次更新时使用n个小批量训练样本:

image.png
这种方法:
  • (a)减少参数更新的方差,这样可以得到更加稳定的收敛结果;
  • (b)可以利用最新的深度学习库中高度优化的矩阵优化方法,高效地求解每个小批量数据的梯度。

通常,小批量数据的大小在50到256之间,也可以根据不同的应用有所变化。当训练神经网络模型时,小批量梯度下降法是典型的选择算法,当使用小批量梯度下降法时,也将其称为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、Challenges:

虽然Vanilla小批量梯度下降法并不能保证较好的收敛性,但是需要强调的是,这也给我们留下了如下的一些挑战:

  • 选择一个合适的学习率可能是困难的。学习率太小会导致收敛的速度很慢,学习率太大会妨碍收敛,导致损失函数在最小值附近波动甚至偏离最小值

  • 学习率调整试图在训练的过程中通过例如退火的方法调整学习率,即根据预定义的策略或者当相邻两epochs之间的下降值小于某个阈值时减小学习率。然而,策略和阈值需要预先设定好,因此无法适应数据集的特点

  • 此外,对所有的参数更新使用同样的学习率。如果数据是稀疏的,同时,特征的频率差异很大时,我们也许不想以同样的学习率更新所有的参数,对于出现次数较少的特征,我们对其执行更大的学习率。

  • 高度非凸误差函数普遍出现在神经网络中,在优化这类函数时,另一个关键的挑战是使函数避免陷入无数次优的局部最小值。Dauphin等人指出出现这种困难实际上并不是来自局部最小值,而是来自鞍点,即那些在一个维度上是递增的,而在另一个维度上是递减的。这些鞍点通常被具有相同误差的点包围,因为在任意维度上的梯度都近似为0,所以SGD很难从这些鞍点中逃开。

4、Gradient descent optimization algorithms【梯度下降优化算法】:

在下文中,我们将概述一些算法,这些算法被深度学习社区广泛用来处理前面提到的挑战。我们不会讨论在高维数据集的实际计算中不可行的算法,例如二阶方法,如牛顿法7。

4.1 Momentum【动量法】:

SGD难以在沟壑中航行,即曲面在一个维度上的曲线比在另一个维度上的曲线陡峭得多的区域[20],这在局部最优点附近很常见。在这些情况下,SGD在沟谷的斜坡上振荡,同时沿着底部向局部最优方向缓慢前进,如图2a所示:

image.png
  • 动量是一种有助于在相关方向上加速SGD并抑制振荡的方法,如图2b所示。它通过将过去时间步长的更新向量的一部分γ添加到当前更新向量来实现这一点。
image.png
  • 动量项γ通常设置为0.9或类似值

基本上,当使用动量时,我们将球推下山。球在下坡时积累动量,在途中变得越来越快(如果存在空气阻力,即γ<1,则直到达到其极限速度)。我们的参数更新也会发生同样的情况:

(1)对于在梯度点处具有相同的方向的维度,其动量项增大。
(2)对于在梯度点处改变方向的维度,其动量项减小。
(3)因此,我们可以得到更快的收敛速度,同时可以减少摇摆。
4.2 Nesterov accelerated gradient【内斯特罗夫加速梯度下降法NAG】:

然而,球从山上滚下的时候,盲目地沿着斜率方向,往往并不能令人满意。我们希望有一个智能的球,这个球能够知道它将要去哪,以至于在将要重新遇到斜率上升时能够知道减速。

Nesterov加速梯度下降法(Nesterov accelerated gradient,NAG)是一种能够给动量项这样的预知能力的方法。我们知道,我们利用动量项γvt−1来更新参数θ。通过计算θ−γvt−1能够告诉我们参数未来位置的一个近似值(梯度并不是完全更新),这也就是告诉我们参数大致将变为多少。通过计算关于参数未来的近似位置的梯度,而不是关于当前的参数θ的梯度,我们可以高效的求解 :

image.png
  • (1)同时,我们设置动量项γ大约为0.9。
  • (2)动量法首先计算当前的梯度值(图3中的小的蓝色向量),然后在更新的累积梯度(大的蓝色向量)方向上前进一大步,
  • (3)Nesterov加速梯度下降法NAG首先在先前累积梯度(棕色的向量)方向上前进一大步,计算梯度值,然后做一个修正(绿色的向量)。
  • (4)这个具有预见性的更新防止我们前进得太快,同时增强了算法的响应能力,这一点在很多的任务中对于RNN的性能提升有着重要的意义[2]。
image.png

既然我们能够使得我们的更新适应误差函数的斜率以相应地加速SGD,我们同样也想要使得我们的更新能够适应每一个单独参数,以根据每个参数的重要性决定大的或者小的更新。

4.3 Adagrad:
  • Adagrad是一种基于梯度的优化算法,它可以做到这一点:它根据参数调整学习速率,对不频繁的参数执行较大的更新,对频繁的参数执行较小的更新。

  • 因此,它非常适合处理稀疏数据。Dean等人发现Adagrad极大地提高了SGD的稳健性,并将其用于在谷歌(Google)训练大规模神经网络,其中包括在Youtube视频10中学习识别猫。

  • 此外,Pennington等人[16]使用Adagrad来训练GloVe词嵌入,因为低频词比高频词需要更大的步长

前面,我们每次更新所有的参数θ时,每一个参数θi都使用的是相同的学习率η。由于Adagrad在t时刻对每一个参数θi使用了不同的学习率,我们首先介绍Adagrad对每一个参数的更新,然后我们对其向量化。为了简洁,令gt,i为在t时刻目标函数关于参数θi的梯度:

image.png

在t时刻,对每个参数θi的更新过程变为:

image.png

对于上述的更新规则,在t时刻,基于对θi计算过的历史梯度,Adagrad修正了对每一个参数θi的学习率:

image.png

其中,Gt∈ℝd×d是一个对角矩阵,对角线上的元素i,i是直到t时刻为止,所有关于θi的梯度的平方和(Duchi等人[7]将该矩阵作为包含所有先前梯度的外积的完整矩阵的替代,因为即使是对于中等数量的参数d,矩阵的均方根的计算都是不切实际的。),ϵ是平滑项,用于防止除数为0(通常大约设置为1e−8)。比较有意思的是,如果没有平方根的操作,算法的效果会变得很差。

  • 由于Gt的对角线上包含了关于所有参数θ的历史梯度的平方和,现在,我们可以通过Gt和gt之间的元素向量乘法⊙向量化上述的操作
image.png
优缺点:

(1)Adagrad的主要优点之一是,它无需手动调整学习速度。大多数实现都使用默认值0.01,并保持该值不变。

(2) Adagrad的主要缺点是分母中平方梯度的累积:由于每个附加项都是正的,因此累积的总和在训练期间不断增长。这反过来会导致学习速度下降,最终变得无穷小,此时算法不再能够获得额外的知识。以下算法旨在解决此缺陷。

4.4 Adadelta【阿达德尔塔】:

Adadelta是Adagrad的一个扩展,旨在减少其攻击性、单调递减性学习率。Adadelta并没有累加所有过去的平方梯度,而是将计算历史梯度的窗口大小限制为一个固定值w

  • 在Adadelta中,无需存储先前的w个平方梯度,而是将梯度的平方递归地表示成所有历史梯度平方的均值。在t时刻的均值E[g2]t只取决于先前的均值和当前的梯度(分量γ类似于动量项):
image.png

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

image.png

因此,我们之前导出的Adagrad的参数更新向量的形式如下:

image.png

现在,我们简单将对角矩阵Gt替换成历史梯度的均值E[g2]t:

image.png

由于分母只是梯度的均方根(RMS)误差准则,我们可以用标准简写来代替它:

image.png

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

image.png

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

image.png

由于RMS[Δθ]t是未知的,我们利用参数的均方根误差来近似更新。利用RMS[Δθ]t−1替换先前的更新规则中的学习率η,最终得到Adadelta的更新规则:

image.png
  • 使用Adadelta,我们甚至不需要设置默认学习速率,因为更新规则中已经移除了学习率。
4.5 RMSprop:

RMSprop是一个未被发表的自适应学习率的算法,该算法由Geoff Hinton在其[Coursera课堂的课程6e]中提出。

RMSprop和Adadelta都是在同一时间独立开发的,这是因为需要解决Adagrad学习率急剧下降的问题。实际上,RMSprop是先前我们得到的Adadelta的第一个更新向量的特例:

image.png

RMSprop将学习率分解成一个平方梯度的指数衰减的平均。

  • (1)Hinton建议将γ设置为0.9
  • (2)而学习率η的良好默认值为0.001
4.6、 Adam:

自适应矩估计(Adam)是另一种计算每个参数的自适应学习率的方法。Adam对每一个参数都计算自适应的学习率

  • (1)除了像Adadelta和RMSprop一样存储一个指数衰减的历史平方梯度的平均vt
  • (2)Adam同时还保存一个历史梯度的指数衰减均值mt,类似于动量:
image.png

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

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

image.png

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

image.png
  • 作者建议β1的默认值为0.9,β2的默认值为0.999,ϵ为10−8�。他们的经验表明,Adam在实践中运行良好,并优于其他自适应学习方法算法。
4.7、 AdaMax【阿达麦克斯】:

Adam update规则中的vt因子与过去梯度的`2范数成反比缩放梯度(通过vt−1项)和电流梯度|gt | 2:

image.png

我们可以将这个更新推广到`p范数。注意,Kingma和Ba也将β2参数化为βp2:

image.png

大p值的范数通常在数值上变得不稳定,这就是为什么“1”和“2”范数在实践中最常见的原因。然而∞ 也通常表现出稳定的行为。因此,作者提出AdaMax[10],并表明vt与∞ 收敛到以下更稳定的值。

image.png

我们现在可以通过替换√vˆt+�通过ut获得AdaMax更新规则:

image.png
  • 请注意,由于ut依赖于max运算,因此不可能像Adam中的mt和vt那样偏向于零,这就是为什么我们不需要计算ut的偏差校正。好的默认值是同样,η=0.002,β1=0.9,β2=0.999。
4.8、 Nadam【Nesterov加速自适应矩估计】:

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

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

  • (1) 首先,让我们回顾一下使用当前符号的动量更新规则:
image.png

其中J是我们的目标函数,γ是动量衰减项,η是我们的步长。将上面的第三个等式展开,可以得到:

image.png
这再次证明,动量包括朝着前一个动量向量的方向迈出一步,以及朝着当前梯度的方向迈出一步。

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

image.png

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

image.png

请注意,不要使用前面的动量向量mt−1如等式27所示,我们现在使用当前动量向量mt来展望未来。为了给Adam增加Nesterov动量,我们可以用当前动量向量替换之前的动量向量。第一回想一下,Adam更新规则如下(请注意,我们不需要修改vˆt):

image.png

用mˆt和mt的定义来展开第二个方程,我们可以得到:

image.png

注意β1mt−1除以1−βT1.只是前一次动量向量的偏差修正估计步,因此,我们可以用mˆt代替它−1:

image.png

这个方程看起来非常类似于方程27中的扩展动量项。我们现在可以添加Nesterov动量,就像我们在等式29中所做的那样,只需替换前一时间步mˆt-1动量向量的偏差修正估计.电流的偏差修正估计值动量向量mˆt,它给出了Nadam更新规则:

image.png
4.9 、Visualization of algorithms【算法可视化】:

以下两幅图提供了对所提出的优化算法的优化行为的一些直觉:

在图4a中,我们看到不同算法在损失曲面的等高线上走的不同路线。所有的算法都是从同一个点出发并选择不同路径到达最优点。注意:Adagrad,Adadelta和RMSprop能够立即转移到正确的移动方向上并以类似的速度收敛,而动量法和NAG会导致偏离,想像一下球从山上滚下的画面。然而,NAG能够在偏离之后快速修正其路线,因为NAG通过对最优点的预见增强其响应能力。

图4b中,展示了不同算法在鞍点出的行为,鞍点即为一个点在一个维度上的斜率为正,而在其他维度上的斜率为负,正如我们前面提及的,鞍点对SGD的训练造成很大困难。这里注意,SGD,动量法和NAG在鞍点处很难打破对称性,尽管后面两个算法最终设法逃离了鞍点。而Adagrad,RMSprop和Adadelta能够快速向着梯度为负的方向移动,其中Adadelta走在最前面。

image.png

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

4.10 、Which optimizer to use?

那么,我们应该选择使用哪种优化算法呢?如果输入数据是稀疏的,选择任一自适应学习率算法可能会得到最好的结果。选用这类算法的另一个好处是无需调整学习率,选用默认值就可能达到最好的结果。

总的来说:

(1)RMSprop是Adagrad的扩展形式,用于处理在Adagrad中急速递减的学习率。
(2)RMSprop与Adadelta相同,所不同的是Adadelta在更新规则中使用参数的均方根进行更新。
(3)最后,Adam是将偏差校正和动量加入到RMSprop中。

在这样的情况下,RMSprop、Adadelta和Adam是很相似的算法并且在相似的环境中性能都不错。Kingma等人[9]指出在优化后期由于梯度变得越来越稀疏,偏差校正能够帮助Adam微弱地胜过RMSprop综合看来,Adam可能是最佳的选择

有趣的是,最近许多论文中采用不带动量的SGD和一种简单的学习率的退火策略。已表明,通常SGD能够找到最小值点,但是比其他优化的SGD花费更多的时间,与其他算法相比,SGD更加依赖鲁棒的初始化和退火策略,同时,SGD可能会陷入鞍点,而不是局部极小值点。因此,如果你关心的是快速收敛和训练一个深层的或者复杂的神经网络,你应该选择一个自适应学习率的方法

5 、Parallelizing and distributing SGD【并行化和分布式SGD】:

当存在大量的大规模数据和廉价的集群时,利用分布式SGD来加速是一个显然的选择。SGD本身有固有的顺序:一步一步,我们进一步进展到最小。SGD提供了良好的收敛性,但SGD的运行缓慢,特别是对于大型数据集。相反,SGD异步运行速度更快,但客户端之间非最理想的通信会导致差的收敛。此外,我们也可以在一台机器上并行SGD,这样就无需大的计算集群。以下是已经提出的优化的并行和分布式的SGD的算法和框架。

5.1 Hogwild!:

Niu等人[14]提出称为Hogwild!的更新机制,Hogwild!允许在多个CPU上并行执行SGD更新。在无需对参数加锁的情况下,处理器可以访问共享的内存。这种方法只适用于稀疏的输入数据,因为每一次更新只会修改一部分参数。在这种情况下,该更新策略几乎可以达到一个最优的收敛速率,因为CPU之间不可能重写有用的信息。

5.2、 Downpour SGD:

Downpour SGD是SGD的一种异步的变形形式,在Google,Dean等人[6]在他们的DistBelief框架(TensorFlow的前身)中使用了该方法。Downpour SGD在训练集的子集上并行运行多个模型的副本。这些模型将各自的更新发送给一个参数服务器,参数服务器跨越了多台机器。每一台机器负责存储和更新模型的一部分参数。然而,因为副本之间是彼此不互相通信的,即通过共享权重或者更新,因此可能会导致参数发散而不利于收敛。

5.3 、Delay-tolerant Algorithms for SGD【延迟容忍SGD】:

通过容忍延迟算法的开发,McMahan和Streeter[11]将AdaGraad扩展成并行的模式,该方法不仅适应于历史梯度,同时适应于更新延迟。该方法已经在实践中被证实是有效的。

5.4 、TensorFlow:

TensorFlow是Google近期开源的框架,该框架用于实现和部署大规模机器学习模型。TensorFlow是基于DistBelief开发,同时TensorFlow已经在内部用来在大量移动设备和大规模分布式系统的执行计算。在[2016年4月]发布的分布式版本依赖于图计算,图计算即是对每一个设备将图划分成多个子图,同时,通过发送、接收节点对完成节点之间的通信

5.5 、Elastic Averaging SGD【弹性平均SGD

】:

Zhang等人[22]提出的弹性平均SGD(Elastic Averaging SGD,EASGD)连接了异步SGD的参数客户端和一个弹性力,即参数服务器存储的一个中心变量。EASGD使得局部变量能够从中心变量震荡得更远,这在理论上使得在参数空间中能够得到更多的探索。经验表明这种增强的探索能力通过发现新的局部最优点,能够提高整体的性能

6 Additional strategies for optimizing SGD【优化SGD的其他策略】:

最后,我们介绍可以与前面提及到的任一算法配合使用的其他的一些策略,以进一步提高SGD的性能。

6.1、 Shuffling and Curriculum Learning【数据集的洗牌和课程学习】:
  • 总的来说,我们希望避免向我们的模型中以一定意义的顺序提供训练数据,因为这样会使得优化算法产生偏差。因此,在每一轮迭代后对训练数据洗牌是一个不错的主意。

  • 另一方面,在很多情况下,我们是逐步解决问题的,而将训练集按照某个有意义的顺序排列会提高模型的性能和SGD的收敛性,如何将训练集建立一个有意义的排列被称为课程学习。

  • Zaremba and Sutskever[20]只能使用课程学习训练LSTM来评估简单程序,并表明组合或混合策略比单一的策略更好,通过增加难度来排列示例。

6.2、 Batch normalization【批量归一化】:

(1)为了便于学习,我们通常用0均值和单位方差初始化我们的参数的初始值来归一化。 随着不断训练,参数得到不同的程度的更新,我们失去了这种归一化,随着网络变得越来越深,这种现象会降低训练速度,且放大参数变化。

(2)批量归一化在每次小批量数据反向传播之后重新对参数进行0均值单位方差标准化。通过将模型架构的一部分归一化,我们能够使用更高的学习率,更少关注初始化参数。批量归一化还充当正则化的作用,减少(有时甚至消除)Dropout的必要性。

6.3、 Early stopping:

需要在训练的过程中时常在验证集上监测误差,在验证集上如果损失函数不再显著地降低,那么应该提前结束训练

6.4 、Gradient noise【梯度噪音】:
  • (1)Neelakantan等人[12]在每个梯度更新中增加满足高斯分布N(0,σ2t)的噪音:

    image.png

  • (2)高斯分布的方差需要根据如下的策略退火:

image.png
  • (3)他们指出增加了噪音,使得网络对不好的初始化更加鲁棒,同时对深层的和复杂的网络的训练特别有益。他们猜测增加的噪音使得模型更有机会逃离当前的局部最优点,以发现新的局部最优点,这在更深层的模型中更加常见。

7、 Conclusion【结论】:

我们初步研究了:

  • (1)梯度下降的三个变形形式,其中,小批量梯度下降是最受欢迎的。
  • (2)然后我们研究了最常用于优化SGD的算法:动量法,Nesterov加速梯度,Adagrad,Adadelta,RMSprop,Adam以及不同的优化异步SGD的算法。
  • (3)最后,我们已经考虑其他一些改善SGD的策略,如洗牌和课程学习,批量归一化和early stopping。

你可能感兴趣的:(梯度下降优化算法综述)