梯度下降类优化算法概述SebastianRuderInsightCentreforDataAnalytics,NUIGalwayAylienLtd.,Dublinruder.sebastian@gmail.com翻译:管枫(初),彭博(复),zhangdotcn(审)AbstractGradientdescentoptimizationalgorithms,whileincreasinglypopular,areoftenusedasblack-boxoptimizers,aspracticalexplanationsoftheirstrengthsandweaknessesarehardtocomeby.Thisarticleaimstoprovidethereaderwithintuitionswithregardtothebehaviourofdifferentalgorithmsthatwillallowhertoputthemtouse.Inthecourseofthisoverview,welookatdifferentvariantsofgradientdescent,summarizechallenges,introducethemostcommonoptimizationalgorithms,reviewarchitecturesinaparallelanddistributedsetting,andinvesti-gateadditionalstrategiesforoptimizinggradientdescent.梯度下降类算法在优化问题中非常流行,但是因为难以简单的对众多梯度下降类算法给出一个实用的优劣分析,所以在实际应用中这类算法常常被当作黑箱算法来使用。本文的目的是为读者提供不同算法效果的直观展示,并希望读者能够在实际问题中更合理的选择和使用梯度下降类算法。在这个概述中,我们考察梯度下降算法的不同类型,总结其面临的挑战,介绍几种常用的具体算法,简单介绍并行与分布式架构,并探索其他一些梯度下降类优化策略。1IntroductionGradientdescentisoneofthemostpopularalgorithmstoperformoptimizationandbyfarthemostcommonwaytooptimizeneuralnetworks.Atthesametime,everystate-of-the-artDeepLearninglibrarycontainsimplementationsofvariousalgorithmstooptimizegradientdescent(e.g.lasagne’s2,caffe’s3,andkeras’4documentation).Thesealgorithms,however,areoftenusedasblack-boxoptimizers,aspracticalexplanationsoftheirstrengthsandweaknessesarehardtocomeby.梯度下降作为最流行的优化算法之一,目前也是神经网络问题中最常用的优化方法。同时每一个最先进的深度学习库里都包含各种算法来优化梯度下降法(比如:lasagne5,caffe6,andkeras7documentation).然而难以合理的解释其优缺点,这些算法通常被当作黑箱算法来使用。Thisarticleaimsatprovidingthereaderwithintuitionswithregardtothebehaviourofdifferentalgorithmsforoptimizinggradientdescentthatwillhelpherputthemtouse.InSection2,wearefirstgoingtolookatthedifferentvariantsofgradientdescent.Wewillthenbrieflysummarize本文原载于2016年1月19号的博客://lasagne.readthedocs.org/en/latest/modules/updates.html3://keras.io/optimizers/5://caffe.berkeleyvision.org/tutorial/solver.html7本文的目的是提供给读者一些用来优化梯度下降的不同算法的效果的直观展示,并希望能够帮助读者在实际问题中更合理的选择和使用梯度下降类算法。第2节,我们首先考察一下梯度下降算法的几种类型。然后在第3节中简单总结在使用中容易遇到的问题。接下来在第4节中,我们介绍最常用的几种算法的动机以及其数学实现,并在第5节中简单看一下在并行和分布式环境中,这些算法和框架是如何来优化梯度下降算法的。最后在第6节中,我们介绍其他一些可以用来优化梯度下降类算法的策略。GradientdescentisawaytominimizeanobjectivefunctionJ()parameterizedbyamodel’spa-rameters2Rdbyupdatingtheparametersintheoppositedirectionofthegradientoftheobjectivefunction∇J()w.r.t.totheparameters.Thelearningratedeterminesthesizeofthestepswetaketoreacha(local)minimum.Inotherwords,wefollowthedirectionoftheslopeofthesurfacecreatedbytheobjectivefunctiondownhilluntilwereachavalley.8梯度下降法的基本思想是向着目标函数J()梯度的反方向更新模型参数2Rd,并以此达到最小化目标函数的目的.并通过定义学习率来决定每一次参数更新时步伐的大小。如果把目标函数图像看作一个山丘,梯度下降法就是沿着山坡最陡峭的方向逐级下降直至山谷的过程。92GradientdescentvariantsTherearethreevariantsofgradientdescent,whichdifferinhowmuchdataweusetocomputethegradientoftheobjectivefunction.Dependingontheamountofdata,wemakeatrade-offbetweentheaccuracyoftheparameterupdateandthetimeittakestoperformanupdate.针对于在计算目标函数梯度时所使用数据量的不同,梯度下降分为三种类型.具体操作时,我们在参数更新的准确率和执行更新所消耗的时间之间进行权衡,来选用最合适的类型。2.1批梯度下降Vanillagradientdescent,akabatchgradientdescent,computesthegradientofthecostfunctionw.r.t.totheparametersfortheentiretrainingdataset:普通(vanilla)梯度下降,又称为批梯度下降,在整个数据集上计算损失函数关于参数的梯度:= ∇J()(1)Asweneedtocalculatethegradientsforthewholedatasettoperformjustoneupdate,batchgradientdescentcanbeveryslowandisintractablefordatasetsthatdonotfitinmemory.Batchgradientdescentalsodoesnotallowustoupdateourmodelonline,i.e.withnewexampleson-the-fly.由于在批梯度下降中为了执行一次更新,我们需要在整个数据集上计算梯度,因此这将会是很慢的,并且内存也是一个棘手的问题.批梯度下降同样也不适用于在线更新我们的模型,例如使用新的样例on-the-fly.Incode,batchgradientdescentlookssomethinglikethis:在代码中,批梯度下降形如此:foriinrange(nb_epochs):params_grad=evaluate_gradient(loss_function,data,params)params=params-learning_rate*params_grad8Ifyouareunfamiliarwithgradientdescent,youcanfindagoodintroductiononoptimizingneuralnetworksat对于梯度下降不熟悉的同学可以参考:SGDfluctuation(Source:Wikipedia)Forapre-definednumberofepochs,wefirstcomputethegradientvectorparams_gradofthelossfunctionforthewholedatasetw.r.t.ourparametervectorparams.Notethatstate-of-the-artdeeplearninglibrariesprovideautomaticdifferentiationthatefficientlycomputesthegradientw.r.t.someparameters.Ifyouderivethegradientsyourself,thengradientcheckingisagoodidea.10对于预先确定的迭代次数nb_epochs,在每一次迭代中,我们首先在整个数据集上计算损失函数关于模型参数向量params的梯度params_grad.最先进的深度学习代码库都会提供计算梯度的工具,但是如果使用者使用自己的梯度计算工具的话,最好使用梯度检查11确保不会出错。Wethenupdateourparam