某某潮流网,最新潮鞋资讯分享!

微信号:weixin888

深入浅出之梯度下降优化算法

时间:2024-04-15 12:04人气:编辑:佚名

梯度下降是优化神经网络和许多其他机器学习算法的首选方法,但通常是黑匣子。这篇文章探讨了最流行的基于梯度的优化算法(例如Momentum,Adagrad和Adam)是怎么工作的。

原文博客链接

An overview of gradient descent optimization algorithms

arxiv链接

An overview of gradient descent optimization algorithms

梯度下降是执行优化的最流行算法之一,也是迄今为止最优化神经网络的最常用方法。同时,每个最新的深度学习库都包含各种算法的实现,以优化梯度下降(例如lasagne的caffe的和keras的文档)。但是,这些算法通常用作黑盒优化器,因为很难对它们的优缺点进行实用的解释。

这篇博客文章旨在为您提供有关优化梯度下降的不同算法行为的直觉,这将帮助您使用它们。我们首先要看一下梯度下降的不同变体。然后,我们将简要总结培训期间的挑战。随后,我们将介绍最常见的优化算法,说明它们解决这些挑战的动机以及这如何导致其更新规则的推导。我们还将简要介绍在并行和分布式设置中优化梯度下降的算法和体系结构。最后,我们将考虑有助于优化梯度下降的其他策略。

梯度下降是一种最小化目标函数的方法J(θ),由模型的参数进行参数化θ∈Rd

通过在目标函数梯度的相反方向上更新参数?θJ(θ) 学习率 η 确定我们为达到(本地)最低要求而采取的步骤的大小。换句话说,我们沿着由下坡的目标函数创建的表面的倾斜方向,直到到达山谷。如果您不熟悉梯度下降,可以在这里找到有关优化神经网络的很好的介绍。

梯度下降变种

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

1)批量梯度下降(Batch gradient descent)

计算整个数据集成本函数到参数θ梯度

θ=θ?ηθJ(θ)

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

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。我们的参数向量参数。请注意,最新的深度学习库提供了自动区分功能,可以有效地计算出梯度w.r.t.一些参数。如果您自己获得渐变,则渐变检查是个好主意。

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

2)随机梯度下降(Stochastic gradient descent)

相反,随机梯度下降(SGD)对每个训练示例执行参数更新

θ=θ?ηθJ(θ;x(i);y(i))θ=θ?ηθJ(θ;x(i);y(i)).

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

当批次梯度下降收敛到参数所放置的盆地的最小值时,SGD的波动一方面使它跳到新的并可能是更好的局部最小值。另一方面,由于SGD会不断超调,因此最终会使收敛变得非常复杂,甚至达到最低限度。但是,已经表明,当我们缓慢降低学习率时,SGD会显示与批处理梯度下降相同的收敛行为,几乎可以肯定,对于非凸和凸优化,它们分别收敛到局部或全局最小值。
它的代码片段只是在训练示例上添加了一个循环,并计算了梯度w.r.t。每个例子。请注意,如本节所述,我们在每个纪元都对训练数据进行洗牌。

3)小批量梯度下降(Mini-batch gradient descent)

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

这样,它a)减少了参数更新的方差,这可以导致更稳定的收敛;和b)可以利用最先进的深度学习库所共有的高度优化的矩阵优化,从而可以计算出梯度w.r.t.一个小批量非常有效。常见的迷你批处理大小在50到256之间,但是会因不同的应用而异。训练神经网络时,通常选择小批量梯度下降算法,而当使用小批量时,通常也使用术语SGD。注意:在本文其余部分中,对SGD的修改中,我们省略了参数x(i:i+n);y(i:i+n

但是,小批量梯度下降不能保证良好的收敛性,但是存在一些需要解决的挑战:

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

学习率表[1]尝试通过例如调整训练过程中的学习率。退火,即根据预先定义的时间表或在各个时期之间的目标变化降至阈值以下时降低学习率。但是,这些计划和阈值必须预先定义,因此无法适应数据集的特征

此外,相同的学习率适用于所有参数更新。如果我们的数据稀疏并且我们的要素具有非常不同的频率,则我们可能不希望将所有要素更新到相同的程度,而是对很少发生的要素执行较大的更新。

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

梯度下降优化算法

在下文中,我们将概述深度学习社区广泛使用的一些算法来应对上述挑战。我们不会讨论在实际中无法计算高维数据集的算法,例如二阶方法,例如牛顿法。

Momentum(动量)

SGD难以在沟壑中航行,即,在一个维度上,曲面的弯曲比在另一个维度上的弯曲要陡得多[4],这在局部最优情况下很常见。在这些情况下,SGD会在峡谷的山坡上振荡,而仅沿着底部朝着局部最优方向犹豫前进,如图2所示。

图2 无动量的随机梯度下降
图3 动量随机梯度下降

动量是一种有助于在相关方向上加速SGD并抑制振荡的方法(指数加权平均,缩小纵轴,横轴加速),如图3所示。它通过添加一个分数来实现动量是一种有助于在相关方向上加速SGD并抑制振荡的方法,如图3所示。它通过添加一个分数来实现过去时间步的更新向量γ到当前更新向量的比率过去时间步的更新向量到当前更新向量的比率

注意:某些实现交换方程式中的符号。动量项 γ 通常设置为0.9或类似值。 本质上,当使用动量时,我们将球推下山坡。球在下坡时滚动时会累积动量,在途中速度会越来越快(如果存在空气阻力,直到达到极限速度,即达到 γ < 1 )。我们的参数更新发生了相同的事情:动量项对于梯度指向相同方向的维增加,而对于梯度改变方向的维减少动量。结果,我们获得了更快的收敛并减少了振荡。

Nesterov accelerated gradient

然而,如果一个球从山上滚下来,盲目地跟随斜坡下滑,这是非常不合适的。我们希望有一个更聪明的球,这个球有一个去向的概念,这样它就知道在山坡再次变缓之前会减速。

Nesterov加速梯度(NAG)是一种用这种先知来赋予我们动量术语的方法。我们知道我们将使用动量项γvt?1来更改参数θ。通过计算θ?γv(t?1)得到参数的下一个位置的近似值(完全更新缺少梯度),这是我们的参数将要存在的大致思路。现在,我们可以通过计算梯度w.r.t.来有效地向前看。我们不是通过计算当前参数θ的梯度值,而是通过相关参数的大致未来位置,来有效的预知未来的方向。

同样,我们设置动量项 γ 值约为0.9。动量首先计算当前梯度(图4中的蓝色小矢量),然后在更新的累积梯度(蓝色矢量)的方向上发生较大的跳跃,而NAG首先在先前的累积梯度的方向上进行较大的跳跃(棕色矢量),测量梯度,然后进行校正(红色矢量),从而完成NAG更新(绿色矢量)。此预期更新可防止我们过快地进行,并导致响应速度提高,从而显着提高了RNN在许多任务上的性能

有关NAG背后的直觉的另一解释,请参见此处,而Ilya Sutskever在其博士论文中提供了更详细的概述[8]。

既然我们能够使更新适应误差函数的斜率并依次提高SGD,我们还希望使更新适应每个单独的参数,以根据其重要性执行更大或更小的更新。

Adagrad

Adagrad[9]是一种基于梯度的优化算法,它可以做到这一点:它使学习率适应参数,执行较小的更新
(即学习率较低)与频繁出现的特征相关的参数,以及较大更新(即学习率较高)与不经常出现的特征相关的参数。因此,它非常适合处理稀疏数据。迪恩等。[10]发现Adagrad大大提高了SGD的鲁棒性,并将其用于Google的大规模神经网络的训练,其中包括学会在YouTube视频中识别猫。此外Pennington等。[11]使用Adagrad来训练GloVe单词嵌入,因为不常用的单词比常用的单词需要更大的更新。

先前,我们对所有参数θ作为每个参数θi使用相同的学习率η进行了更新一次。由于Adagrad对每个参数使用不同的学习率θ在每个时刻t
,我们首先显示Adagrad的每个参数更新,然后将其向量化。为了简洁起见,我们使用gt
表示时间步的梯度 gt,i是目标函数w.r.t的偏导数,在time step t


这是一个对角矩阵,其中每个对角元素是梯度w.r.t的平方和 而?是一个避免被零除的平滑项

有趣的是,如果没有平方根运算,该算法的性能将大大降低

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

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

Adadelta

Adadelta 是Adagrad的扩展,旨在降低其激进的,单调降低的学习率。 Adadelta不会累计所有过去的平方梯度,而是将累计过去的梯度的窗口限制为某个固定大小w。与之前低效的存储w以前的平方梯度不同,梯度之和被递归定义为所有过去平方梯度的衰减平均值。作为与动量项相似的分数γ,在t时刻的滑动平均值E[g2]t仅仅取决于先前的平均值和当前梯度值。

RMSprop

RMSprop是由Geoff Hinton在他的Coursera课的第6e讲中提出的未公开的自适应学习率方法。

RMSprop和Adadelta都是在同时解决方案的基础上独立开发的,这是因为需要解决Adagrad的学习率急剧下降的问题。 RMSprop实际上与我们上面得出的Adadelta的第一个更新向量相同:

RMSprop也将学习率除以平方梯度的指数衰减平均值。欣顿建议 γ 设置为0.9,同时学习率的默认值也不错 η 是0.001

Adam

自适应矩估计(Adam)[14]是另一种计算每个参数的自适应学习率的方法。除了存储过去平方梯度的指数衰减平均值外vt,像Adadelta和RMSprop一样,Adam还保留了过去梯度的指数衰减平均值mt
,类似于动量。动量可以看作是一个顺着斜坡滑下的球,而Adam的行为就像是一个带有摩擦的沉重的球,因此,它更喜欢在误差表面上保持平坦的最小值[15]。我们计算过去和过去平方梯度的衰减平均值mt和vt
分别如下:

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

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

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

作者建议将 β1默认值设置为0.9,β2的值为0.999和?的值为10-8 他们从经验上证明Adam在实践中表现良好,并且与其他自适应学习方法算法相比具有优势。

AdaMax


Nadam

如前所述,Adam可以看作是RMSprop和动量的组合:RMSprop贡献了过去平方梯度的指数衰减平均值vt,而动量占了过去梯度mt的指数衰减平均值。 我们还发现,Nesterovaccelerated梯度(NAG)优于vanilla动量。Nadam(Nesterov加速的自适应矩估计)[7]因此结合了Adam和NAG。 为了将NAG合并到Adam中,我们需要修改其动量项。首先,让我们使用当前符号回顾动量更新规则

以下两个图提供了对所介绍的优化算法的优化行为的直觉。13在图4a中,我们看到了它们在损耗表面轮廓上所走的路径(Beale函数)。所有这些都是从同一点开始的,并采取了不同的途径以达到最低要求。请注意,Adagrad,Adadelta和RMSprop立即向正确的方向驶去,并以类似的速度收敛,而Momentum和NAG则偏离了轨道,让人联想起滚下山顶的球的形象。但是,由于NAG的响应性增强,它可以通过向前看并最小化来更快地纠正航向。图4b显示了算法在鞍点处的行为,即一维具有正斜率,而另一维具有正斜率。尺寸具有负斜率,这给我们之前提到的SGD带来了困难。在这里请注意,SGD,动量和NAG很难打破对称,尽管后两者最终设法逃脱了鞍点,而Adagrad,RMSprop和Adadelta迅速下降到负斜率,而Adadelta领先。损失表面轮廓上的SGD优化(b)鞍点上的SGD优化图4:源和完整动画:Alec Radford如我们所见,自适应学习速率方法,即Adagrad,Adadelta,RMSprop和Adam最适合并提供最佳收敛针对这些情况。4.10使用哪个优化器?那么,应该使用哪个优化器?如果您的输入数据稀疏,那么您可能会使用一种自适应学习率方法来获得最佳结果。另一个好处是,您不需要调整学习速度,但可能会使用默认值获得最佳结果。总之,RMSprop是Adagrad的扩展,用于处理其学习速度急剧下降的问题。它与Adadelta相同,除了Adadelta在分子更新规则中使用参数更新的RMS。最后,Adam为RMSprop添加了偏差校正和动量。就此而言,RMSprop,Adadelta和Adam是非常相似的算法,在相似的情况下效果很好。[10]表明,随着梯度变得稀疏,它的偏差校正有助于Adam在优化结束时略胜于RMSprop。就目前而言,亚当可能是最好的整体选择。有趣的是,许多最新论文使用香草SGD却没有动力,并且学习率退火时间表很简单。如图所示,SGD通常可以找到最小值,但是它可能比某些优化程序花费更长的时间,更多地依赖于可靠的初始化和退火程序,并且可能陷入鞍点而不是局部最小值。因此,如果您关心快速收敛并训练深度或复杂的神经网络,则应选择一种自适应学习率方法。13另请参见cs231n.github.io/neural Karpathy对相同图像的描述以及所讨论算法的另一简要概述。

(a) SGD optimization on loss surface contours

Which optimizer to use?

那么,您现在应该使用哪个优化程序? 如果输入数据稀疏,则可能会使用一种自适应学习率方法来获得最佳结果。 另一个好处是,您无需调整学习率,但可以使用默认值获得最佳结果。

总而言之,RMSprop是Adagrad的扩展,用于处理其学习率急剧下降的问题。 它与Adadelta相同,除了Adadelta在numinator更新规则中使用参数更新的RMS。 最后,adam为RMSprop添加了偏差校正和动量。 就此而言,RMSprop,Adadelta和Adam是非常相似的算法,在相似的情况下效果很好。 金马等。[14:1]表明,随着梯度变得稀疏,它的偏差校正有助于Adam在优化结束时略胜于RMSprop。 就目前而言,Adam可能是最好的整体选择。

有趣的是,最近的许多论文都使用没有动力且简单的学习速率退火计划的朴素SGD(vanilla SGD)。 如图所示,SGD通常可以找到最小值,但与某些优化程序相比,它可能花费更长的时间,它更多地依赖于可靠的初始化和退火程序,并且可能卡在鞍点而不是局部最小值。 因此,如果您关心快速收敛并训练一个深度或复杂的神经网络,则应选择一种自适应学习率方法。

标签: 梯度   更新   学习   我们   参数  
相关资讯
热门频道

热门标签

官方微信官方微博百家号

网站简介 | 意见反馈 | 联系我们 | 法律声明 | 广告服务

Copyright © 2002-2022 天富平台-全球注册登录站 版权所有 备案号:粤ICP备xxxxxxx号

平台注册入口