梯度下降算法是机器学习中使用非常广泛的优化算法,也是众多机器学习算法中最常用的优化方法。几乎当前每一个先进的(state-of-the-art)机器学习库或者深度学习库都会包括梯度下降算法的不同变种实现。但是,它们就像一个黑盒优化器,很难得到它们优缺点的实际解释。Sebastian Ruder曾在去年发表博文 《梯度下降优化算法综述》(An overview of gradient descent optimization algorithms),详细对比了梯度下降算法中的不同变种,并帮助使用者根据具体需要进行使用。 近日Ruder在针对2017年优化算法的一些新方法,在之前综述的基础上,整理出2017深度学习优化研究亮点,值得关注。
1,An overview of gradient descent optimization algorithms
http://ruder.io/optimizing-gradient-descent/index.html
https://arxiv.org/abs/1609.04747
2, 中文翻译《梯度下降优化算法综述》 http://blog.csdn.net/heyongluoyao8/article/details/52478715
3.,Sebastian Ruder 深度学习中的优化 Optimization for Deep Learning PPT 2017/11/2讲座
Optimization for Deep Learning Highlights in 2017
2017深度学习优化算法研究亮点
作者:Sebastian Ruder
译者:专知内容组
目录
1 Adam改进(Improving Adam)
- - 解耦权重衰减(Decoupling weight decay)
- - 固定指数移动平均数(Fixing the exponential moving average)
2 微调学习速率(Tuning the learning rate)
3 热重启(Warm restarts)
- 热重启的SGD(SGD with restarts)
- 照集成(Snapshot ensembles)
- 热重启的Adam(Adam with restarts)
4 学习优化(Learning to optimize)
5 理解泛化(Understanding generalization)
深度学习的终极目标是找到一个能够很好进行泛化的最小值,如果可以快速而可靠地找到这个值当然更好了。主要的方法是随机梯度下降(SGD)法,该算法已有60年历史(Robbins and Monro,1951)[1],它对于当前的深度学习的反向传播算法来说是非常重要的。
近年来提出了不同的优化算法,分别利用不同的公式来更新模型的参数。Adam(Kingma and Ba,2015)[18] 自从2015年被推出后,一直到今天仍然是最常用的优化算法之一。这表明从机器学习从业者的角度来看,深度学习的优化的最好的方法在很大程度上并没有多大改变。
然而,今年已经产生了一些新的想法来改进深度学习的优化方法,这可能会成为未来我们模型的优化方式。在这篇博文中,我将深入探讨深度学习最令人激动的亮点和最有前景的方向。请注意,这篇博文事先假定你已经熟悉SGD和自适应学习速率方法(如Adam)。要想提高学习的速度,请先了解现有梯度下降优化算法,可参阅我的另一个博客文章(http://ruder.io/optimizing-gradient-descent/index.html)。
Adam改进(Improving Adam)
尽管像Adam这样的自适应学习速率方法是有着最广泛的使用,但计算机视觉和NLP中的许多任务的最新结果,如物体识别(Huang等,2017)[17] 或机器翻译(Wu et al,2016年)3 仍然是由最简单古老的随机梯度下降SGD来实现的。最近的理论(Wilson等,2017)[15] 为此提供了一些充足的论据,它指出跟带动量momentum的SGD相比,自适应学习率的优化方法更难收敛到(可能并且不太理想的)最小值点。
根据经验可以看出,用自适应学习率方法找到的极小值与带动量的SGD中发现的极小值相比,在物体识别,字符级语言建模和选区分析(constituency parsing)方面,表现出更糟的性能。这好像与直觉相反,因为Adam能保证良好的收敛,而且其自适应学习率应该比正常的SGD有优势。但是,Adam和其他适应性学习率方法并不是没有缺陷的。
- 解耦权重衰减(Decoupling weight decay)
Adam在一些数据集上比带动量SGD泛化能力差的一个原因是权重衰减。权重衰减最常用于图像分类问题,并在每次参数更新后衰减权重θt,方法是乘以稍小于1的衰减率wt:
这样可以防止权重过大。因此,权重衰减也可以理解为一个L2正则化项,它取决于加入到损失中权重衰减率:
权重衰减通常在许多神经网络库中都被实现,或者作为上述正则化项或者直接修改梯度。当动量和Adam更新方程(通过与其他衰减项相乘)中的梯度被修改时,权重衰减不再等于L2正则项。因此,Loshchilov和Hutter(2017)[19] 提出通过在参数更新之后添加它来解耦梯度更新中的权重衰减,就像在原始定义中那样。
动量和重量衰减(SGDW)更新的SGD如下所示:
其中η是学习率,第二个方程中的第三项是解耦权重衰减项。同样,对于权重衰减的Adam(AdamW),我们可以得到:
其中、、和分别是第一和第二时刻的偏差和偏差校正估计,β1和β2是同时加入相同的权重衰减项之后,它们的衰减率。作者表示,这大大提高了Adam的泛化性能,并使Adam能与SGD在图像分类数据集上展开激烈竞争。
另外,它将学习速率的选择与权重衰减的选择分开,这使得超参数能更好的优化,因为超参数之间不再相互依赖。它还将优化器的实现与权重衰减的实现分开,这有助于实现更干净和可重用的代码(参见fast.ai AdamW/SGDW implementation https://github.com/fastai/fastai/pull/46/files)。
- 固定指数移动平均数(Fixing the exponential moving average)
最近的几篇论文(Dozat和Manning,2017; Laine和Aila,2017)[13,16] 发现,较低的β2值可控制Adam过去平方梯度的指数移动平均的贡献。相对于默认的0.999,取值0.99或者0.9在它们在各自的应用中能表现更好,表明可能存在指数移动平均值的问题。
一个ICLR 2018提交的论文形式化了这个问题,并指出过去平方梯度的指数移动平均值是自适应学习率方法的普遍性能不佳的另一个原因。通过过去平方梯度的指数移动平均值来更新参数是自适应学习速率方法的核心,例如Adadelta,RMSprop和Adam。指数平均值的贡献的动机是很好理解的:应该防止学习率随着训练的进行而变得极小,这是Adagrad算法的主要缺陷。然而,这种梯度的短期记忆(short-term memory)成为应用在其他情况下的障碍。
在Adam收敛到次优解的情况下,可以观察到一些minibatches贡献了绝大部分的的梯度值,但是这些minibatches很少发生,指数平均值减小了它们的影响,所以导致收敛性差,。作者提供了一个简单的凸优化问题的例子,其中Adam可以观察到相同的行为。
为了解决这个问题,作者提出了一种新的算法AMSGrad,它使用过去平方梯度的最大值而不是指数平均值来更新参数。完整的AMSGrad更新没有偏差修正的估计,如下所示:
与Adam相比,作者在小数据集和CIFAR-10上观测到了改进的性能。
微调学习速率(Tuning the learning rate)
在许多情况下,除了超参数我们的模型是不需要改进和调整的。最近的语言建模实例证明,与更复杂的模型相比,仅仅调整LSTM参数(Melis等,2017)[20] 和正则化参数(Merity等,2017)[21] 就可以产生更好的结果。
学习速率η是深度学习中一个重要的优化超参数。实际上,SGD已经被证明需要一个学习率退火方案,以收敛到一个好的最小值。人们经常认为,像Adam这样的自适应学习速率方法对于不同的学习速率更具有鲁棒性,因为他们自己更新了学习速率。但是,即使对于这些方法,好的学习速率和最佳的学习速率之间也可能有很大的差别。
Zhang等(2017)[2] 表明,具有调整学习率退火方案和动量参数的SGD不仅可以与Adam竞争,而且收敛速度更快。另一方面,虽然我们可能认为Adam学习速率的适应性可以模仿学习速率退火,但是明确使用退火方案仍然是有益的:如果我们对Adam增加SGD的学习速率退火,它在机器翻译任务中(Denkowski和Neubig,2017)[4] 收敛速度更快。
事实上,学习速率退火方案似乎是新的特征工程,因为我们经常可以找到改进的学习速率退火方案,来改善了我们模型的最终收敛行为。一个有趣的例子如Vaswani等(2017)[14]。虽然通常看到一个模型的超参数要经过大规模的超参数优化,但有趣的是将学习速率退火方案看作是对细节同样重视的焦点:作者在Adam中使用参数β1= 0.9,非默认β2= 0.98,ε= 10^-9,学习率η可能是最复杂的退火方案之一:
其中是模型参数的数量,且 warmup_steps=4000史密斯等人最近的另一篇论文(2017)[5] 展示了学习率和batch大小之间有一定的联系,两个超参数通常被认为是相互独立的:他们表明,衰减学习率相当于增加batch大小,然而batch可以并行的增加。相反,我们可以减少模型更新次数,从而通过提高学习速度和缩放batch来加快训练速度。这对于大规模的深度学习有影响,现在可以重新调整现有的训练方案,而不需要调整超参数。
热重启(Warm restarts)
- 热重启的SGD(SGD with restarts)
SGDR(Loshchilov andHutter,2017)[6] 是近期提出的一个有效的方法,这是一种使用热重启替代学习速率退火的SGD方法。在每次重新启动时,学习速率被初始化为某个值,并且将减少。重要的是,重启是热重启,因为优化不是从头开始,而是从最后一个步骤中模型收敛的参数开始。关键因素是用积极的余弦退火方案使学习率下降,这会迅速降低学习率,如下所示:
图1:学习速率热重启方案(Loshchilov和Hutter,2017)
其中和是在第i次运行期间的学习速率的范围,指示自上次重新启动以来已经经过了多少个时期,并且指定了下一次重新开始的时期。与常规的学习速率退火方法相比,和的热启动方案如图1所示。
图1:学习速率热重启方案(Loshchilov和Hutter,2017)
重新启动后的初始的高学习率用于基本上将参数从它们先前收敛的最小值弹射到不同的损失表面(loss surface)。激进的退火使模型能够快速收敛到一个新的更好的解决方案。作者根据经验发现,热重启的SGD需要的时间比学习速率退火少2〜4倍,并且能达到相当或更好的性能。
学习率退火与热重启也称为周期性学习率,最初由Smith(2017)[22] 提出。 fast.ai(最近开始教这个方法)的学生还有两篇文章讨论热启动和循环学习的速率,其地址在(https://medium.com/@bushaev/improving-the-way-we-work-with-learning-rate-5e99554f163b)和(http://teleported.in/posts/cyclic-learning-rate/)。
- 快照集成(Snapshot ensembles)
快照集成(Huang et al,2017)[7] 是最近提出的一种聪明的技术,当训练单个模型时,使用热重启来组装一个基本上免费的集成。该方法训练一个单一的模型,直到与我们已经看到的余弦退火方案收敛。然后保存模型参数,执行热重启,然后重复这些步骤M次。最后,所有保存的模型快照都是整体的。在图2中可以看到与快照集成相比,常用的SGD优化是运行在误差曲面上的。
图2:SGDvs. 快照集成方法(Huang等,2017)
一般而言,总体的成功取决于组合中各个模型的多样性。因此,快照集成依赖于余弦退火方案的能力,使得模型在每次重新启动后能够收敛到不同的局部最优值。作者证明,这在实践中是成立的,在CIFAR-10,CIFAR-100和SVHN上都取得了最好的结果。
- 热重启的Adam(Adam with restarts)
热重启的Adam原本不起作用,因为它的权重衰减的功能障碍问题。在固定权重衰减之后,Loshchilov和Hutter(2017)也同样将Adam扩展到热重启。他们设置
和,得到:他们建议从最初的小开始(在所有迭代的1到10之间),并在每次重启时将其乘以一个因子(例如)。
学习优化
去年最有趣的论文之一是Andrychowicz等人撰写的一篇论文(且为reddit的“2016年最佳论文”) (2016) [23]。]他们训练了一个LSTM优化器来在训练期间提供主模型的更新。 不幸的是,学习单独的LSTM优化器或即使使用预先训练好的LSTM优化器来优化都会大大增加模型训练的复杂性。
今年另一个非常有影响力的“learning-to-learn”论文使用LSTM来生成领域特定语言的模型结构(Zoph and Quoc,2017)[24]。 虽然搜索过程需要大量的资源,但是产生的结构可以用来替代现有的结构。这个搜索过程已经被证明是有效的,并且结构能够在语言建模方面取得卓越成果,并且与CIFAR-10上的最新技术相比具有竞争力。
相同的搜索原则可以应用于任何其他领域,其中的关键过程之前已经手动定义了。其中一个领域是深度学习的优化算法。 正如我们以前所见,优化算法比它们看起来更相似:它们都使用指数移动平均指数(如动量)和过去平方梯度的指数移动平均值的组合(如Adadelta,RMSprop ,Adam))(Ruder,2016)[25]。
Bello等(2017)[8] 定义了一个domain-specific语言,它由对优化有用的基元组成,例如这些指数移动平均值。然后,他们从可行更新规则空间中采样更新规则,使用此更新规则来训练模型,并基于测试集上训练模型的性能来更新RNN控制器。完整的程序可以在图3中看到。
图2:神经优化搜索(Bello et al., 2017)
特别的,他们发现了两个更新方程,即PowerSign和AddSign。 PowerSign的更新公式如下:
这里α是超参数,通常被设定为e或2.,被设置为1或者执行线性的衰减函数,周期性或衰减重新启动基于时间t,是过去渐变的移动平均值。常见的配置是
我们可以观察到,更新通过或来缩放渐变,具体取决于梯度的方向和移动平均值是否一致。这表明,过去的梯度和当前的梯度之间的这种动量般的协议是优化深度学习模型的关键信息。
AddSign定义如下:
和上述一样,这里α通常取1或2.这一次更新量还是这取决于梯度的方向。作者指出,PowerSign和AddSign在CIFAR-10方面的表现优于Adam,RMSprop和SGD,并能很好地转移到ImageNet分类和机器翻译等其他任务。
理解泛化
优化与泛化密切相关,因为模型收敛的最小值定义了模型泛化的程度。因此,提升优化与理解这种极小值泛化行为的理论进展密切相关,更普遍的是,对深度学习的泛化能力有更深的理解。
然而,我们对深度神经网络泛化行为的理解仍然很浅。 最新工作表明,可能的局部极小值数量随参数的数量呈指数增长(Kawaguchi,2016)[9]。考虑到目前深度学习架构的参数数量巨大,这样的模型能收敛并且泛化的还不错,看起来很神奇,尤其是考虑到他们可以完全记住随机输入(Zhang等,2017)[10],
Keskar等(2017)[11]将最小值的清晰度确定为不良泛化的一个来源:特别的,他们表明,批量梯度下降发现的明确的极小值具有较高的泛化误差。这是直观的,因为我们通常会希望我们的函数是平滑的,明确的最小值表示相应误差曲面具有高度不规则性。 然而,近期工作表明,清晰度可能并不是一个好的指标,因为它表明局部最小值能够很好地泛化(Dinh et al,2017)[12]。 Eric Jang的quora问答也讨论了这些文章。
一份ICLR 2018投稿论文通过一系列消融分析表明,一个模型在激活空间中对单个方向的依赖(即单个单元或特征图的激活)是其泛化性能的良好表现。他们证明了这种模式适用于不同数据集的模型,以及不同程度的标签损坏。 同时他们发现dropout并没有帮助解决这个问题,而批量规范化阻碍了单方向依赖。
虽然这些发现表明我们在深度学习优化方面仍然有许多不知道的,但重要的是要记住,收敛保证和存在于凸优化中的大量工作,在一定程度上现有的想法和见解也可以应用于非凸优化。 NIPS 2016的大规模优化教程提供了该领域更多理论工作的精彩概述(请参见幻灯片第1部分,第2部分和视频)。
结论
我希望能够为过去一年的深度优化发展提供一些令人信服的依据。毫无疑问,我没有提到许多同样重要和值得注意的方法。 请在下面的评论中告诉我,我错过了什么,我在哪里犯了错误或歪曲了方法,或者哪一方面的深度学习优化,你觉得特别令人兴奋或低估。
原文发布时间为:2017-12-6
本文来自云栖社区合作伙伴新智元,了解相关信息可以关注“AI_era”微信公众号