本文是根据 链接 进行的翻译,回顾了深度学习的各种梯度下降优化算法。*已获得原作者的翻译许可。
文章目录
一.概述
梯度下降虽然是优化神经网络和许多其他机器学习算法最受欢迎的方法,但是通常却被作为黑盒子去使用。这篇文章探讨了最受欢迎的几种基于梯度的优化算法比如Momentum(动量)、Adagrad 和 Adam,这些优化算法在某些处理问题上很有效。
二.引言
梯度下降法是最流行的神经网络优化算法之一,也是目前最常用的神经网络优化方法。同时,每个最先进的深度学习库都包含各种算法的实现,以优化梯度下降(比如说lasagne,caffe,和keras的文档都有说明)。但是这些算法通常被用于黑箱优化,它们的优点和缺点的实际解释很难去获得。
这篇文章旨在提供给你不同梯度优化算法的行为的直观感受,帮助你去运用它们。我们首先先看一下不同的梯度下降算法变体。我们将会后续简要概括训练中的挑战。随后我们将通过展示最常用的优化算法去解决这些挑战的动机和如何进行更新规则推导来介绍它们。我们也会简短的介绍下并行和分布式下的优化梯度下降的算法和架构。最后,我们将会考虑其他有助于梯度下降优化的策略。
梯度下降法是一种最小化由模型参数θ(属于n维向量空间Rn)参数化的目标函数J(θ)(代价函数),它通过以关于θ参数目标函数▽θJ(θ)梯度相反的方向来更新参数。(公示见下图)
三.Gradient Descent Variants(梯度下降法变体)
有三种变种梯度下降算法,它们的不同之处在于我们是用多少数据来计算目标函数的梯度。根据数据量,我们在参数更新的准确性和执行更新所需的时间之间进行权衡。
1.1 Batch Gradient Descent(批量梯度下降)
Vanilla gradient descent,又称批量梯度下降,计算的整个训练数据集上的所有数据的关于θ参数的损失函数的梯度:
因为我们需要计算整个数据集上的梯度来执行一次更新,BGD运行可能会非常缓慢,并且对于不适合内存存储的数据集很棘手。同时BGD也不允许我们在线更新我们的模型,也就是说不能同时运行新的样本。
在代码中,BGD看起来像这样:
对于一个预定义的epochs数量(三者区别见此),我们首先计算整个数据集的关于参数向量params
的损失函数的梯度向量params_grad
。这里注意一下,先进的深度学习库提供了自动微分,有效地计算关于一些参数的梯度。如果你自动推导出梯度,梯度检查是一个好主意(这里给了你一些如果进行梯度检查的技巧(后面我也会进行翻译))。
然后我们就可以以梯度相反的方向更新参数,学习率决定我们执行更新的大小。对于凸误差曲面(二次函数小于0),BGD可以做到收敛到全局最小值;但是对于非凸误差曲面,BGD收敛到局部最小值。
1.2 Stochastic Gradient Descent(随机梯度下降)
SGD则是对每个训练样本x(i) 和标签y(i) 执行参数更新:
BGD对于大型数据集执行冗余计算,因为它在每次参数更新之前重新计算类似样本的梯度。SGD则通过每次执行一个更新而消除了这种冗余。因此,它通常更快,也可以用于在线学习。SGD进行频繁的更新,其方差很大,导致目标函数波动很大,如图。
虽然BGD收敛到所在盆地的最小值,但SGD的波动一方面使其能够跳转到新的、更好的局部最小值。另一方面,这最终会使收敛变得更复杂,因为SGD会持续过度。然而研究表明,当我们慢慢地降低学习率时,SGD表现出与BGD相同的收敛行为,几乎可以肯定可以收敛于非凸优化和凸优化的局部或全局最小值。
它的代码片段只是在训练样本上增加了一个循环,并对每个样本的梯度进行评估。值得注意的是,我们会在每个epoch中打乱训练数据,这一点会在之后提及。
为了更好地理解,附上花书图:
1.3 Mini-Batch Gradient Descent(小批量梯度下降)
小批量梯度下降最终采取了均和以上两种方法的方式,每次随机抽取一个小批量的n个训练样本进行更新。
这种方式可以减少参数更新的方差,使得收敛更新稳定。还可以利用被先进的深度学习库使用的高度优化的矩阵优化来高效计算梯度。常见的小批量数据个数取值在50到256之间,但可以根据不同的应用而变化,当训练神经网络时,MBGD是典型的选择算法,小批量数据被使用时,也通常使用SGD指代。提醒一下,本文剩余部分内容的SGD描述中,为了简化我们省略了参数x(i:i+n),y(i:i+n)。
在代码中,我们不在遍历样本,而是便利大小为60的小批量数据。
1.4 总结
2. 挑战
然而,Vanilla mini-batch gradient descent并不能保证良好的收敛性,但是提供了一些需要解决的挑战问题:
- 选择合适的学习率很难,学习率过小会导致收敛过慢,学习率过大会阻碍收敛,导致损失函数在最小值附近波动,甚至发散。
- 学习率计划(这句话具体是啥,见参考文献[1]) 尝试在训练过程中通过退火法来调整学习率,即根据预先定义的计划或者根据在不同epochs之间的目标变化低于阈值时来降低学习速率。然而这些调度和阈值必须事先定义,因此不能适应数据集的特征。(参考文献[2])。
- 此外,相同的学习率应用于所有参数更新。如果我们的数据稀疏,并且我们的功能需要非常不同的频率,我们可能不想更新所有的功能到相同的程度,而是对很少出现的功能执行更大的更新。
- 最小化神经网络中常见的非凸性损失函数的另一关键挑战时避免陷入大量次最优局部极小值。Dauphin等认为(参考文献[3]),困难实际上不是来自于局部极小值,而是来自于鞍点,即一个维度向上倾斜和另一个向下倾斜的点。这些鞍点通常被一个具有相同误差的停滞期包围,这使得SGD很难去跳出这片区域,因为所有维度上梯度都接近于0.
四. Gradient descent optimization algorithms(梯度下降优化算法)
接下来,开始阐述一些被深度学习社区广泛使用的算法,以应对上述挑战。我们不会讨论在高维数据集的实际计算中不可行的算法,比如Newton’s method(牛顿法)等二阶方法(感兴趣的可以点开链接维基百科自行学习)。
4.1 Momentum(动量)
SGD很难进行导航(找到极小值),即在一个维度的表面曲线比在另一个维度更陡峭的区域(参考文献[4]),这是在局部最优值周围常见的。在这些情况下,SGD在峡谷的斜坡上振荡,只是沿着谷底缓慢地向局部最优方向前进,如图。
Pic. SGD without momentum
Momentum(参考文献[5])是一个在相关方向帮助加速SGD和抑制振荡的方法,如图。
Pic. SGD with momentum
它通过将之前的时间步长的更新向量乘以权重γ来增加到目前的更新变量:
注意:在等式中,动量系数γ通常设置为0.9或者相似值。
本质上,当使用动量时,我们把一个球推下山。当球下坡时,它的动量就会不断地增加,在这个过程中,它的速度会越来越快(如果有空气阻力的话,它会达到最大速度,γ<1),同样的事情发生在我们的参数更新:对于梯度指向相同方向的维度,动量项会增加,而对于梯度改变方向的维度,动量项会减少更新。 结果,我们获得了更快的收敛和减少的振荡。
4.2 Nesterov accelerated gradient(Nesterov 加速梯度)
但是,一个球从山上滚下来,跟着斜坡盲目地滚下去,这种情况下非常令人不满意。我们想要一个更聪明的球,一个知道自己要去哪里的球,这样它就知道在山坡再次向上倾斜之前减速。
Nesterov加速梯度(参考文献[6])给了我们这用有预见性的动量项的一种方式。我们知道我们要用动量项γvt−1来移动参数θ。计算θ-γvt−1从而给我们一个参数的下一个未知的近似值(梯度在完整更新中丢失),一个粗略的想法,我们的参数将在哪里。现在,我们可以有效地通过不是我们当前的参数θ而是我们的参数的近似的未来位置作为参数来计算的梯度来预测:
我们再一次设定动量项γ到0.9附近的值。而Momentum首先计算当前梯度(短段的蓝色矢量线).然后需要大幅增加的方向更新累计梯度(长段蓝色矢量线)。NAG首先使大幅上涨之前的积累的方向梯度(棕色矢量线),测量梯度然后修正梯度(红色矢量线),这就生成了完整的NAG更新(绿色向量)。这种预先更新可以防止我们的速度过快,提高响应能力,这大大提高了RNN在许多任务的性能(参考文献[7])
Pic. Nesterov update
参考这个关于BAG背后的直观的一个解释,并且Ilya Sutskever 也在他的博士论文给出了更详细的解释(参考文献[8])。
既然我们能够根据损失函数的斜率调整更新,进而加快SGD的速度,我们还希望根据每个参数调整更新,已根据它们的重要性执行更大或更小的更新。
4.3 Adagrad
Adagrad(参考文献[9])是一种基于梯度的优化算法,它的作用是:根据参数调整学习率,对于与频繁出现的特征相关的参数执行较小的更新(比如赋予低学习率),对于与非频繁出现的特征相关的参数执行较大的更新(比如赋予高学习率)。因此,他非常适合处理稀疏数据。Dean等人(参考文献[10])发现Adagrad极大地提高了SGD的鲁棒性,并将其用于训练谷歌的大规模神经网络,其中包括在Youtube中学会了识别猫。 而且,Pennington等人(参考文献[11])使用Adagrad算法训练GloVe words enbedding(Glove 词嵌入),因为不频繁的单词比频繁的单词需要更大的更新。
以前,我们会对所有参数θ执行一次更新,因为每个参数θi使用相同的学习率η.随着Adagrad算法在每个时间步长t内对每个参数θi使用不同的学习率更新,我们首先显示Adagrad的每个参数更新,然后对其进行矢量化。为了简单起见,我们用gt表示在时间步长t处的梯度。gt,i为在时间步长t处对于参数θi的目标函数偏导数:
SGD算法在每个时间步长t内对每个参数θi更新公式变为:
在它的更新规则里,Adagrad修正了在每个时间步长t内对于基于之前的梯度计算的每个参数θi的一般学习率η:
其中,这里的分母中的Gt,ii属于dd维的向量空间,是一个对角矩阵,其中每个对角元素(i,i)为在时间步长t内关于参数θi的梯度的平方和(参考文献[12]),而ε是一个平滑项,避免分母为0(通常取1e-8)。有趣的是,如果没有平方根运算,算法的性能会差很多。
由于Gt沿对角线方向包含对于所有参数θ的之前的梯度的平方和,我们可以通过执行Gt和gt的矩阵向量乘积(⊙表示向量乘积)来矢量化我们的执行结果:
Adagrad主要的一个好处是消除了手动调整学习率的需要。大多数实现时使用0.01作为默认值并在整个过程保持不变。
Adagrad的主要缺点是它在分母上累积梯度的平方和:由于每个添加项都是正的,积累的和在训练过程中不断增加。这反过来又会导致学习率速率下降,最终变得无穷小,此时算法不再能够获取额外的知识。下面的算法旨在解决这个缺陷。
为了更好地理解,附上花书图:
4.4 Adadelta
Adadelta(参考文献[13])是Adagrad的扩展,旨在降低它的后期快速下降的,单调减少的学习率。Adadelta不是累加所有的平方梯度,而是将累加之前梯度的窗口限制在某个固定大小ω中。
不同于低效地存储ω大小的之前的平方梯度,在Adadelta中,梯度的和被递归地定义为所有之前的平方梯度的衰减平均值。在时间步长t内的运行平均值E[g2]t (这里与动量项类似的小数γ)只取决于之前的平均值和当前的梯度:
我们设置γ取一个与动量项(约等于0.9)相近的的值。为了清晰起见,我们现在根据参数更新向量△θt重写我们的普通的SGD算法的更新:
我们之前导出的Adagrad算法的参数更新向量是以下形式:
我们现在简单地用之前的平和梯度E[g2]t来替换对角矩阵Gt实现:
由于分母就是梯度的均方根(RMS)误差准则,我们可以用简化准则替换上面公式:
作者指出,这次更新中的单位(以及SGD,Momentum或者Adagrad)并不匹配,也就是说,这次更新应该使用与参数相同的假设单位,为了实现这一点,他们首先定义了另一个指数衰减平均值,这次不是平方梯度,而是平方参数更新:
参数更新的均方根(RMS)误差就变成下式了:
由于RMS[△θ]t不知道,我们用之前的时间步长的参数更新(△θt-1)的RMS近似表示。用之前的更新规则替换学习率η为RMS[△θ]t-1,最后得到Adadelta更新规则为:
使用Adadelta,我们不再需要设置默认的学习率,因为它已经从更新规则里被消除了。
为了更好地理解,附上花树图:
4.5 RMSprop
RMSprop是Geoff Hintin在Lecture 6e of his Coursera Class(Coursera课程的第6e节,这里提供了ppt)提出的一种未发表的自适应学习率方法。
RMSprop和Adadelta都是为了需要解决Adagrad的学习率急剧下降的问题在同一时间独立开发的。事实上,RMSprop与我们在上面推导出来的Adadelta的第一个更新向量是相同的:
RMSprop也采用学习率除以梯度平方的指数衰减平均值。γ设置成了0.9和学习率η的默认值为0.001。
为了更好的理解,贴上花书步骤图:
3.6 Adam
自适应矩估计(Adam)(参考文献14)是另一种计算每个参数的自适应学习率的方法。除了像Adamdelta和RMSprop存储之前的平方梯度的指数衰减平均值vt。Adam也保持了之前梯度mt-1(原文为mt,我觉得是写错了,如果我理解错了,麻烦告知)的指数衰减平均值(类似于动量)。虽然动量可以看做是一个球在斜坡上滚落,但不同的是,Adam像是一个有摩擦力的重量很大的球,这个球更喜欢处在误差平面的最小值处(参考文献[15]。我们分别计算之前的平方梯度mt-1和平方梯度的指数衰减平均值vt-1如下式:
mt和vt分别是梯度的第一阶矩(均值)和第二阶矩(非中心方差)的估计值,因此被称为Adam。当mt和vt被初始化为零向量时,Adam的作者发现它们偏向于0,特别是在初始时间步长期间和当衰减指数很小时(比方说β1和β2都接近于1)。
他们通过计算误差校正的第一和第二时刻估计来抵消这些偏差:
然后他们使用上式两个量来更新参数,就像我们在Adadelta和RMSprop中看到的那样,通过这种方式产生了Adam的更新规则:
Adam的作者们建议β1的默认值采用0.9和β2的默认值采用0.999,ε默认值为1e-8.它们从经验中表明Adam在实际工作中比其他自适应学习算法要好。
为了更好的理解,贴上花书步骤图:
4.7 AdaMax
在Adam算法的更新规则中vt因子将梯度调节到之前的梯度(通过vt-1项表达)和当前梯度|gt2|成反比的ℓ2[范数]内(https://blog.csdn.net/haima1998/article/details/82929896):
我们把这个更新推广到ℓp范数。注意,Kingma和Ba也参数化β2成β2p:
p值大的范数通常在数值上变得不稳当,这就是为什么ℓ1和ℓ2范数在实际中是最常用的。但是,ℓ∞也表现出稳定的行为。因此,作者提出了AdaMax(Kingma和Ba, 2015),并展示了使用用ℓ∞时vt收敛到更稳定的值。为了避免和Adam混淆,我们使用ut来定义无限受约束的vt:
我们现在可以将这个公式带入Adam更新等式中,将替换成ut来得到AdaMax更新规则:
注意:ut依赖于最大操作,它就不像Adam算法中mt和vt倾向于0那样容易受到影响这也是为什么我们不需要为ut计算偏差修正,默认值最好设置成学习率η=0.002,β1=0.9和β2=0.999。
4.8 Nadam
正如我们之前看到的,Adam可以被看作是RMSprop和momentum的结合:RMSprop贡献了之前平方梯度的指数衰减平均值vt,动量则解释了之前梯度的指数衰减平均值mt.我们也看到了Nesterov加速梯度法(NAG)其实优于Vanilla Monmtntum的。
Nadam(Nesterov-accelerated Adaptive Moment Estimation)(参考文献16)因此结合了Adam和NAG而产生的。为了去将NAG整合到Adam中,我们需要修改Adam的动量项mt。
首先,使用我们当前的符号来回顾一下动量更新规则:
公式中J是我们的目标函数,γ是动量衰减项,η是我们的步长大小。第三个等式展开为:
这再次表明动量涉及到前一个动量矢量方向上走一步和之前梯度方向上走一步。
NAG(Nesterov加速梯度法)允许我们在计算梯度前通过加入动量步长更新参数来在梯度方向上获得更精确的步长。我们因此只需要修改梯度gt来得到NAG:
Dozat提出用一下方式去修正NAG:与其两次应用动量步骤(第一次更新梯度gt和第二次更新参数θt+1,我们现在只要应用先见性的动量矢量直接更新当前参数:
注意:我们现在使用当前的动量矢量,而不是像上面的扩展动量更新规则的等式那样使用之前的的动量向量mt-1来更新。为了去添加Nesterov动量到Adam中,我们同样可以使用当前的动量向量替换之前的动量向量。首先,回想一下Adam更新规则如下所示,(我们不需要修改):
接下来用和mt展开第二个等式带入第三个等式得到:
注意:是前一个时间步长的动量矢量经偏置校正的估计。我们因此用替换它:
注意:为了简化起见,我们忽略了分母是而不是因为我们将在下一个步长中替换这个分母。这个方程看起来和我们上面的扩展动量更新规则非常相似。我们现在可以添加Nesterov动量,就像我们以前做的那样,简单地用现在的动量矢量的偏置校正估计替换之前时间步长的动量矢量的偏置校正估计,这给出了我们Nadam更新规则:
4.9 AMSGrad
随着自适应学习率方法已成为训练神经网络的规范,应用者注意到在某些情况下比如物体识别(参考文献17)或机器翻译(参考文献18),自适应学习率方法不能收敛到最优,通过使用带有动量的SGD却效果非凡。
Reddi等人(参考文献19)正式提出了这个问题,并指出过去平方梯度的指数移动平均是自适应学习速率方法的较差的概化行为的原因。回忆一下,引入指数平均的动机很好的:它应防止学习率随着训练的进展变得无穷小,这是Adagrad算法的关键缺陷。然而,这种梯度的短期记忆在其他场景中成为一个障碍。
在Adam收敛到次优解的情况下,可以观察到一些小批量提供了很大的信息梯度,但由于这些小批量很少出现,指数平均减少了它们的影响,导致收敛较差。作者提供了一种简单地凸优化问题的例子,在这里可以观察到和Adam算法中同样的行为。
为了修正这种行为,作者提出了一种新的算法,AMSgrad,它使用了过去平方梯度的最大值vt而不是指数平均来更新参数.vt和上述Adam算法中一样:
我们没有直接使用vt(或者它的修正量),我们而是采用如果之前的值大于现在的值vt就使用之前的:
这种方式,AMSGrad的结果是不增加步长大小,从而避免了Adam所遇到的问题。为了简单起见,作者还去掉了我们在Adam算法上看到的去偏步骤。完整的AMSG更新(不带偏置校正估计)如下式:
作者观察到,在小数据集和CIFAR-10上,性能比Adam有所提高,然而,其他实验的表现与Adam算法相似,甚至更差。AMSGrad是否能够在实践中持续优于Adam算法,仍有待观察。要想了解更多关于深度学习优化的最新进展,参考此博文。
4.10 其他最近的算法
在AMSGrad之后,许多其他优化器也被提出,其中包括AdamW(参考文献20),它修正了Adam权重衰减;QHAdam(参考文献21)用一个动量SGD步长平均一个标准SGD步长;AggMo(参考文献22)结合了多个动量项和还有其他好多算法。关于最近的梯度下降算法的概述,请看这篇博文。
4.11 算法可视化
下图的两个动画(图片来源:Alec Radford)提供了对大多数优化方法的优化行为的一些直觉。也可以在这里查看Karpathy对同样一幅图的描述和对所讨论的算法的另外一种简要阐述。
在图5中,我们看到它们随着时间在损失曲面(Beale函数)的轮廓上的行为。注意, Adagrad、Adadelta和RMSprop几乎立即朝着正确的方向前进,并以同样快的速度收敛,而Momentum和NAG被引导偏离轨道,让人想起一个球滚下山的画面。然而,NAG由于它通过向前看和朝着最小值前进而增加的响应能力能很快纠正它的进程.
在图6中,显示了算法在鞍点的行为,即一个维度的斜率为正,而另一个维度的斜率为负,这给SGD带来了困难,正如我们之前提到的,请注意,SGD、Momentum和NAG很难打破对称性,尽管后者最终设法逃离了鞍点,而Adagrad、RMSprop和Adadelta则迅速下滑到负斜率。
提示一下:如果你最可视化这些或者其他优化算法感兴趣,可以看看这个。
4.12 如何选择算法
所以,你现在应该使用哪个优化算法呢? 如果你的输入数据是稀疏的,然后你可能使用其中一个自适应学习率方法来实现最好的结果。另外一个好处是,您不需要调整学习率,但是使用默认值可能获得最佳结果。
总之,RMSprop算法是一个Adagrad算法(处理学习率急剧下降)的扩展,它与Adadelta算法相同,只是Adadelta在numinator更新规则(这个更新规则应该就是指Adadelta更新规则)中使用了参数更新的RMS。最后,Adam为RMSprop添加了偏差校正和动量。到目前为止,RMSprop、Adadelta和Adam算法都是非常相似的算法,它们在类似的环境中表现良好。Kingma等人(参考文献14)表明,当梯度变得稀疏时,其偏置校正帮助Adam算法在优化结束时的表现略优于RMSprop算法,到目前为止,Adam算法可能是最好的选择。
有趣的是,最近的许多论文使用的是没有动量和简单学习率退火方法的普通SGD。如前所述,SGD算法通常能够找到最小值,但它可能比某些优化器花费的时间要长得多,更依赖于健壮的初始化和退货华方法,而且可能会卡在鞍点而不是最小值,因此,如果你关心快速收敛和训练一个深度或者复杂的神经网络,你应该选择自适应学习率方法中的一个。
五. Parallelizing and distributing SGD(并行分布随机梯度下降算法)
考虑到大规模数据解决方案的普遍性和低复杂度集群的可用性,分布式SGD来进一步加速是一个明显的选择。
SGD本身具有内在的顺序性:我们逐步朝着最小值的目标前进,运行它可以提供良好的收敛性,但在大型数据集上可能会很慢。相比之下,异步运行SGD更快,但是不同线程之间的不理想的通信可能会导致较差的收敛。此外,我们还可以在一台机器上并行化SGD,而不需要大型计算集群。以下是已经提出的优化并行和分布式SGD的算法和架构。
5.1 Hogwild!
Niu等人(参考文献23)介绍了一个叫做Hogwild的更新方法!它允许在cpu上并行执行SGD更新。允许处理器访问共享内存而不锁定参数。这只在输入数据稀疏的情况下有效,因为每次更新只会修改所有参数的一小部分。它们表明,在这种情况下,更新方案实现了几乎最优的收敛速度,因为处理器不太可能覆盖有用的信息。
5.2 Downpour SGD
Downpour SGD是SGD算法的一个异步变体,Dean等人(参考文献10)在谷歌的DistBelief框架 (Tensorflow前身)中使用了它。他在训练数据的子集上并行地运行一个模型的多个副本。这些模型将它们的更新发送到一个参数服务器,该服务器分布在许多机器上。每台机器负责存储和更新一部分模型参数。然而,由于副本之间不会通过共享权重或更新进行通信,它们的参数会持续存在发散的的风险,阻碍收敛。
5.3 Delay-tolerant Algorithms for SGD
McMahan和Streeter(参考文献24)通过delay-tolerant算法(不仅适应之前的梯度,而且适应更新延迟)扩展Adagrad算法到并行设置上。这在实践中表明是有效的。
5.4 TensorFlow
Tensorflow(参考文献25)是谷歌最近的开源框架,用于实现和部署大规模机器学习模型。它是基于他们使用DistBelief的经验,并且已经在内部用于在大量移动设备和大规模分布式系统上执行计算。对于分布式执行,计算图被分割成每个设备的子图,使用发送/接收节点对进行通信.但是,Tensorflow的开源版本目前并不支持分布式功能(参见此处).
更新13.04.16版本:Tensorflow的分布式版本已经发布.
5.5 Elastic Averaging SGD
张等人(参考文献26)提出了Elastic Averaging SGD算法(EASGD),它将异步SGD的worker参数与elastic force(即由参数服务器存储的中心变量)联系起来。这允许局部变量从中心变量进一步波动,这在理论上允许对参数空间进行更多的探索。他们的经验表明增加的探索能力可以通过新的局部最优值来提高性能。
六. Additional strategies for optimizing SGD
最后,我们介绍了可以与前面提到的任何算法一起使用的其他策略,以进一步提高SGD的性能。要获得其他一些常见技巧的详细概述,请参阅(参考文献27).
6.1 Shuffling and Curriculum Learning
通常,我们希望避免以有意义的顺序为模型提供训练示例,因为这可能会使优化算法产生偏差。因此,在每个历元之后都洗牌训练数据通常是一个好主意。
另一方面,在某些情况下,我们的目标是解决越来越难的问题,以有意义的顺序提供训练示例实际上可能会提高性能和更好的收敛性。建立这种有意义的顺序的方法被称作课程学习(参考文献28).
Zaremba和Stuskever(参考文献29)只能使用CL(课程学习)训练LSTMs来评估简单地程序,表明了组合或者混合策略比单纯策略更好,后者通过增加难度来排序示例。
6.2 Batch normalization
为了便于学习, 我们通常使用零均值和单位方差初始化参数达到标准化初始值。随着训练的进行,我们在不同程度上更新参数,我们失去了这种标准化,,从而减慢了训练速度,并且随着网络层数变深,变化变得更大。
批处理规范化(参考文献30)为每一个小批量数据重新建立这些规范化,并且听过反向传播操作改变。通过将规范化作为模型体系结构的一部分,我们能够使用更高的学习率,而较少关注初始化参数。批处理归一化还充当了正则化器,减少(有时甚至消除)Dropout的需要。
6.3 Early Stopping
根据Geoff Hinton的说法:‘Early Stopping是美丽的免费午餐’(NIPS 2015教程幻灯片, P63)。因此,在训练期间,您应该始终监视验证机上的错误,如果验证错误没有得到足够的改进,就应该停止(类比决策树过拟合方法剪枝)。(这期间要有耐心)。
6.4 Gradient noise
Neelakantan等人(参考文献[31])添加了高斯分布N(0,σt2)的噪声到每一个梯度更新上:
他们按照下列方法对方差进行退火:
他们表明,添加这种噪声可以使网络对于刚开始设定不当的初始化更健壮,并有助于训练特别是深度和复杂的网络。他们认为增加的噪声是的模型有更多的机会去逃离当前局部极小值去寻找新的局部极小值,这在更深层次的模型中比较常见。
七. 结论
在这篇文章中,我们初步研究了梯度下降的三种变体,其中小批量梯度下降是最受欢迎的。然后,我们研究了最常用于优化SGD算法的几种算法:Momentum\Nesterov加速梯度、Adagrad、Adadelta、RMSprop、Adam以及优化异步SGD的不同算法。最后,我们考虑了其他改进SGD的策略,如shuffling, curriculum learning,batch normalization和early stopping。
我希望这篇博文能够为你提供一些有关不同优化算法的动机和行为的直觉。有没有什么明显的算法可以改进我没有想到的SGD,你使用了什么技巧来促进SGD的训练?欢迎在英文网站的下面评论区留言。
八. 参考
- [1] H. Robinds and S. Monro, “A stochastic approximation method,” Annals of Mathematical Statistics, vol. 22, pp. 400–407, 1951.
- [2] Darken, C., Chang, J., & Moody, J. (1992). Learning rate schedules for faster stochastic gradient search. Neural Networks for Signal Processing II Proceedings of the 1992 IEEE Workshop, (September), 1–11. http://doi.org/10.1109/NNSP.1992.253713 .
- [3] Dauphin, Y., Pascanu, R., Gulcehre, C., Cho, K., Ganguli, S., & Bengio, Y. (2014). Identifying and attacking the saddle point problem in high-dimensional non-convex optimization. arXiv, 1–14. Retrieved from http://arxiv.org/abs/1406.2572.
- [4] Sutton, R. S. (1986). Two problems with backpropagation and other steepest-descent learning procedures for networks. Proc. 8th Annual Conf. Cognitive Science Society.
- [5] Qian, N. (1999). On the momentum term in gradient descent learning algorithms. Neural Networks : The Official Journal of the International Neural Network Society, 12(1), 145–151. http://doi.org/10.1016/S0893-6080(98)00116-6.
- [6] Nesterov, Y. (1983). A method for unconstrained convex minimization problem with the rate of convergence o(1/k2). Doklady ANSSSR (translated as Soviet.Math.Docl.), vol. 269, pp. 543– 547.
- [7] Bengio, Y., Boulanger-Lewandowski, N., & Pascanu, R. (2012). Advances in Optimizing Recurrent Networks. Retrieved from http://arxiv.org/abs/1212.0901.
- [8] Sutskever, I. (2013). Training Recurrent neural Networks. PhD Thesis.
- [9] Duchi, J., Hazan, E., & Singer, Y. (2011). Adaptive Subgradient Methods for Online Learning and Stochastic Optimization. Journal of Machine Learning Research, 12, 2121–2159. Retrieved from http://jmlr.org/papers/v12/duchi11a.html .
- [10] Dean, J., Corrado, G. S., Monga, R., Chen, K., Devin, M., Le, Q. V, … Ng, A. Y. (2012). Large Scale Distributed Deep Networks. NIPS 2012: Neural Information Processing Systems, 1–11. http://papers.nips.cc/paper/4687-large-scale-distributed-deep-networks.pdf.
- [11] Pennington, J., Socher, R., & Manning, C. D. (2014). Glove: Global Vectors for Word Representation. Proceedings of the 2014 Conference on Empirical Methods in Natural Language Processing, 1532–1543. http://doi.org/10.3115/v1/D14-1162.
- [12] Duchi et al. [3] give this matrix as an alternative to the full matrix containing the outer products of all previous gradients, as the computation of the matrix square root is infeasible even for a moderate number of parameters d.
- [13] Zeiler, M. D. (2012). ADADELTA: An Adaptive Learning Rate Method. Retrieved from http://arxiv.org/abs/1212.5701.
- [14] Kingma, D. P., & Ba, J. L. (2015). Adam: a Method for Stochastic Optimization. International Conference on Learning Representations, 1–13.
- [15] Heusel, M., Ramsauer, H., Unterthiner, T., Nessler, B., & Hochreiter, S. (2017). GANs Trained by a Two Time-Scale Update Rule Converge to a Local Nash Equilibrium. In Advances in Neural Information Processing Systems 30 (NIPS 2017).
- [16] Dozat, T. (2016). Incorporating Nesterov Momentum into Adam. ICLR Workshop, (1), 2013–2016.
- [17] Huang, G., Liu, Z., Weinberger, K. Q., & van der Maaten, L. (2017). Densely Connected Convolutional Networks. In Proceedings of CVPR 2017.
- [18] Johnson, M., Schuster, M., Le, Q. V, Krikun, M., Wu, Y., Chen, Z., … Dean, J. (2016). Google’s Multilingual Neural Machine Translation System: Enabling Zero-Shot Translation. arXiv Preprint arXiv:1611.0455.
- [19] Reddi, Sashank J., Kale, Satyen, & Kumar, Sanjiv. On the Convergence of Adam and Beyond. Proceedings of ICLR 2018.
- [20] Loshchilov, I., & Hutter, F. (2019). Decoupled Weight Decay Regularization. In Proceedings of ICLR 2019.
- [21] Ma, J., & Yarats, D. (2019). Quasi-hyperbolic momentum and Adam for deep learning. In Proceedings of ICLR 2019.
- [22] Lucas, J., Sun, S., Zemel, R., & Grosse, R. (2019). Aggregated Momentum: Stability Through Passive Damping. In Proceedings of ICLR 2019.
- [23] Niu, F., Recht, B., Christopher, R., & Wright, S. J. (2011). Hogwild! : A Lock-Free Approach to Parallelizing Stochastic Gradient Descent, 1–22.
- [24] Mcmahan, H. B., & Streeter, M. (2014). Delay-Tolerant Algorithms for Asynchronous Distributed Online Learning. Advances in Neural Information Processing Systems (Proceedings of NIPS), 1–9. Retrieved from http://papers.nips.cc/paper/5242-delay-tolerant-algorithms-for-asynchronous-distributed-online-learning.pdf.
- [25] Abadi, M., Agarwal, A., Barham, P., Brevdo, E., Chen, Z., Citro, C., … Zheng, X. (2015). TensorFlow : Large-Scale Machine Learning on Heterogeneous Distributed Systems.
- [26] Zhang, S., Choromanska, A., & LeCun, Y. (2015). Deep learning with Elastic Averaging SGD. Neural Information Processing Systems Conference (NIPS 2015), 1–24. Retrieved from http://arxiv.org/abs/1412.6651.
- [27] LeCun, Y., Bottou, L., Orr, G. B., & Müller, K. R. (1998). Efficient BackProp. Neural Networks: Tricks of the Trade, 1524, 9–50. http://doi.org/10.1007/3-540-49430-8_2.
- [28] Bengio, Y., Louradour, J., Collobert, R., & Weston, J. (2009). Curriculum learning. Proceedings of the 26th Annual International Conference on Machine Learning, 41–48. http://doi.org/10.1145/1553374.1553380.
- [29] Zaremba, W., & Sutskever, I. (2014). Learning to Execute, 1–25. Retrieved from http://arxiv.org/abs/1410.4615
- [30] Ioffe, S., & Szegedy, C. (2015). Batch Normalization : Accelerating Deep Network Training by Reducing Internal Covariate Shift. arXiv Preprint arXiv:1502.03167v3.
- [31] Neelakantan, A., Vilnis, L., Le, Q. V., Sutskever, I., Kaiser, L., Kurach, K., & Martens, J. (2015). Adding Gradient Noise Improves Learning for Very Deep Networks, 1–11. Retrieved from http://arxiv.org/abs/1511.06807.