文末有彩蛋呀!注意查收
說(shuō)到優(yōu)化算法,,入門(mén)級(jí)必從SGD學(xué)起,,老司機(jī)則會(huì)告訴你更好的還有AdaGrad / AdaDelta,或者直接無(wú)腦用Adam??墒强纯磳W(xué)術(shù)界的最新paper,,卻發(fā)現(xiàn)一眾大神還在用著入門(mén)級(jí)的SGD,最多加個(gè)Moment或者Nesterov ,,還經(jīng)常會(huì)黑一下Adam,。比如 UC Berkeley的一篇論文就在Conclusion中寫(xiě)道:
無(wú)奈與酸楚之情溢于言表。 這是為什么呢,?難道平平淡淡才是真,? 首先我們來(lái)回顧一下各類(lèi)優(yōu)化算法。 深度學(xué)習(xí)優(yōu)化算法經(jīng)歷了 SGD -> SGDM -> NAG ->AdaGrad -> AdaDelta -> Adam -> Nadam 這樣的發(fā)展歷程,。Google一下就可以看到很多的教程文章,,詳細(xì)告訴你這些算法是如何一步一步演變而來(lái)的。在這里,,我們換一個(gè)思路,,用一個(gè)框架來(lái)梳理所有的優(yōu)化算法,做一個(gè)更加高屋建瓴的對(duì)比,。 1.1優(yōu)化算法通用框架 首先定義:待優(yōu)化參數(shù):w ,,目標(biāo)函數(shù): f(w),,初始學(xué)習(xí)率 α,。 而后,開(kāi)始進(jìn)行迭代優(yōu)化,。在每個(gè)epoch t:
掌握了這個(gè)框架,,你可以輕輕松松設(shè)計(jì)自己的優(yōu)化算法。 我們拿著這個(gè)框架,,來(lái)照一照各種玄乎其玄的優(yōu)化算法的真身,。步驟3、4對(duì)于各個(gè)算法都是一致的,,主要的差別就體現(xiàn)在1和2上,。 2.1SGD 先來(lái)看SGD。SGD沒(méi)有動(dòng)量的概念,,也就是說(shuō): 代入步驟3,,可以看到下降梯度就是最簡(jiǎn)單的 SGD最大的缺點(diǎn)是下降速度慢,而且可能會(huì)在溝壑的兩邊持續(xù)震蕩,,停留在一個(gè)局部最優(yōu)點(diǎn),。 2.2SGD with Momentum 為了抑制SGD的震蕩,SGDM認(rèn)為梯度下降過(guò)程可以加入慣性,。下坡的時(shí)候,,如果發(fā)現(xiàn)是陡坡,那就利用慣性跑的快一些。SGDM全稱(chēng)是SGD with momentum,,在SGD基礎(chǔ)上引入了一階動(dòng)量: 一階動(dòng)量是各個(gè)時(shí)刻梯度方向的指數(shù)移動(dòng)平均值,,約等于最近 1/(1-β1) 個(gè)時(shí)刻的梯度向量和的平均值。 也就是說(shuō),,t 時(shí)刻的下降方向,,不僅由當(dāng)前點(diǎn)的梯度方向決定,而且由此前累積的下降方向決定,。β1的經(jīng)驗(yàn)值為0.9,,這就意味著下降方向主要是此前累積的下降方向,并略微偏向當(dāng)前時(shí)刻的下降方向,。想象高速公路上汽車(chē)轉(zhuǎn)彎,,在高速向前的同時(shí)略微偏向,急轉(zhuǎn)彎可是要出事的,。 2.3SGD with Nesterov Acceleration SGD 還有一個(gè)問(wèn)題是困在局部最優(yōu)的溝壑里面震蕩,。想象一下你走到一個(gè)盆地,四周都是略高的小山,,你覺(jué)得沒(méi)有下坡的方向,,那就只能待在這里了??墒侨绻闩郎细叩?,就會(huì)發(fā)現(xiàn)外面的世界還很廣闊。因此,,我們不能停留在當(dāng)前位置去觀察未來(lái)的方向,,而要向前一步、多看一步,、看遠(yuǎn)一些,。 NAG全稱(chēng)Nesterov Accelerated Gradient,是在SGD,、SGD-M的基礎(chǔ)上的進(jìn)一步改進(jìn),,改進(jìn)點(diǎn)在于步驟1。我們知道在時(shí)刻t的主要下降方向是由累積動(dòng)量決定的,,自己的梯度方向說(shuō)了也不算,,那與其看當(dāng)前梯度方向,不如先看看如果跟著累積動(dòng)量走了一步,,那個(gè)時(shí)候再怎么走,。因此,NAG在步驟1,,不計(jì)算當(dāng)前位置的梯度方向,,而是計(jì)算如果按照累積動(dòng)量走了一步,那個(gè)時(shí)候的下降方向: 然后用下一個(gè)點(diǎn)的梯度方向,與歷史累積動(dòng)量相結(jié)合,,計(jì)算步驟2中當(dāng)前時(shí)刻的累積動(dòng)量,。 此前我們都沒(méi)有用到二階動(dòng)量。二階動(dòng)量的出現(xiàn),,才意味著“自適應(yīng)學(xué)習(xí)率”優(yōu)化算法時(shí)代的到來(lái),。SGD及其變種以同樣的學(xué)習(xí)率更新每個(gè)參數(shù),但深度神經(jīng)網(wǎng)絡(luò)往往包含大量的參數(shù),,這些參數(shù)并不是總會(huì)用得到(想想大規(guī)模的embedding),。對(duì)于經(jīng)常更新的參數(shù),我們已經(jīng)積累了大量關(guān)于它的知識(shí),,不希望被單個(gè)樣本影響太大,,希望學(xué)習(xí)速率慢一些;對(duì)于偶爾更新的參數(shù),,我們了解的信息太少,,希望能從每個(gè)偶然出現(xiàn)的樣本身上多學(xué)一些,即學(xué)習(xí)速率大一些,。 3.1AdaGrad 怎么樣去度量歷史更新頻率呢,?那就是二階動(dòng)量——該維度上,迄今為止所有梯度值的平方和: 我們?cè)倩仡櫼幌虏襟E3中的下降梯度: 可以看出,,此時(shí)實(shí)質(zhì)上的學(xué)習(xí)率由變成了,。 一般為了避免分母為0,會(huì)在分母上加一個(gè)小的平滑項(xiàng),。因此是恒大于0的,,而且參數(shù)更新越頻繁,,二階動(dòng)量越大,,學(xué)習(xí)率就越小。 這一方法在稀疏數(shù)據(jù)場(chǎng)景下表現(xiàn)非常好,。但也存在一些問(wèn)題:因?yàn)?/span>是單調(diào)遞增的,,會(huì)使得學(xué)習(xí)率單調(diào)遞減至0,可能會(huì)使得訓(xùn)練過(guò)程提前結(jié)束,,即便后續(xù)還有數(shù)據(jù)也無(wú)法學(xué)到必要的知識(shí),。 3.2AdaDelta/RMSProp 由于AdaGrad單調(diào)遞減的學(xué)習(xí)率變化過(guò)于激進(jìn),我們考慮一個(gè)改變二階動(dòng)量計(jì)算方法的策略:不累積全部歷史梯度,,而只關(guān)注過(guò)去一段時(shí)間窗口的下降梯度,。這也就是AdaDelta名稱(chēng)中Delta的來(lái)歷。 修改的思路很簡(jiǎn)單,。前面我們講到,,指數(shù)移動(dòng)平均值大約就是過(guò)去一段時(shí)間的平均值,因此我們用這一方法來(lái)計(jì)算二階累積動(dòng)量: 就避免了二階動(dòng)量持續(xù)累積、導(dǎo)致訓(xùn)練過(guò)程提前結(jié)束的問(wèn)題了,。 3.3Adam 談到這里,,Adam和Nadam的出現(xiàn)就很自然而然了——它們是前述方法的集大成者。我們看到,,SGD-M在SGD基礎(chǔ)上增加了一階動(dòng)量,,AdaGrad和AdaDelta在SGD基礎(chǔ)上增加了二階動(dòng)量。把一階動(dòng)量和二階動(dòng)量都用起來(lái),,就是Adam了——Adaptive + Momentum,。 SGD的一階動(dòng)量: 加上AdaDelta的二階動(dòng)量: 優(yōu)化算法里最常見(jiàn)的兩個(gè)超參數(shù),都在這里了,,前者控制一階動(dòng)量,,后者控制二階動(dòng)量。 3.4Nadam 最后是Nadam,。我們說(shuō)Adam是集大成者,,但它居然遺漏了Nesterov,這還能忍,?必須給它加上,,按照NAG的步驟1: 就是Nesterov + Adam = Nadam了。 說(shuō)到這里,,大概可以理解為什么j經(jīng)常有人說(shuō) Adam / Nadam 目前最主流,、最好用的優(yōu)化算法了。新手上路,,先拿來(lái)一試,,收斂速度嗖嗖滴,效果也是杠杠滴,。 那為什么Adam還老招人黑,,被學(xué)術(shù)界一頓鄙夷?難道只是為了發(fā)paper灌水嗎,?簡(jiǎn)單看看paper里都在說(shuō)什么,。 這篇是正在深度學(xué)習(xí)領(lǐng)域頂級(jí)會(huì)議之一 ICLR 2018 匿名審稿中的一篇論文《On the Convergence of Adam and Beyond》,探討了Adam算法的收斂性,,通過(guò)反例證明了Adam在某些情況下可能會(huì)不收斂,。 回憶一下上文提到的各大優(yōu)化算法的學(xué)習(xí)率: 其中,SGD沒(méi)有用到二階動(dòng)量,,因此學(xué)習(xí)率是恒定的(實(shí)際使用過(guò)程中會(huì)采用學(xué)習(xí)率衰減策略,,因此學(xué)習(xí)率遞減)。AdaGrad的二階動(dòng)量不斷累積,,單調(diào)遞增,,因此學(xué)習(xí)率是單調(diào)遞減的,。因此,這兩類(lèi)算法會(huì)使得學(xué)習(xí)率不斷遞減,,最終收斂到0,,模型也得以收斂。 但AdaDelta和Adam則不然,。二階動(dòng)量是固定時(shí)間窗口內(nèi)的累積,,隨著時(shí)間窗口的變化,遇到的數(shù)據(jù)可能發(fā)生巨變,,使得 可能會(huì)時(shí)大時(shí)小,,不是單調(diào)變化。這就可能在訓(xùn)練后期引起學(xué)習(xí)率的震蕩,,導(dǎo)致模型無(wú)法收斂,。 這篇文章也給出了一個(gè)修正的方法。由于Adam中的學(xué)習(xí)率主要是由二階動(dòng)量控制的,,為了保證算法的收斂,,可以對(duì)二階動(dòng)量的變化進(jìn)行控制,避免上下波動(dòng),。 通過(guò)這樣修改,,就保證了 從而使得學(xué)習(xí)率單調(diào)遞減。 深度神經(jīng)網(wǎng)絡(luò)往往包含大量的參數(shù),,在這樣一個(gè)維度極高的空間內(nèi),,非凸的目標(biāo)函數(shù)往往起起伏伏,擁有無(wú)數(shù)個(gè)高地和洼地,。有的是高峰,,通過(guò)引入動(dòng)量可能很容易越過(guò);但有些是高原,,可能探索很多次都出不來(lái),,于是停止了訓(xùn)練。 近期Arxiv上的兩篇文章談到這個(gè)問(wèn)題,。 第一篇就是前文提到的吐槽Adam最狠的UC Berkeley的文章《The Marginal Value of Adaptive Gradient Methods in Machine Learning》,。文中說(shuō)到,,同樣的一個(gè)優(yōu)化問(wèn)題,,不同的優(yōu)化算法可能會(huì)找到不同的答案,但自適應(yīng)學(xué)習(xí)率的算法往往找到非常差的答案(very poor solution),。他們?cè)O(shè)計(jì)了一個(gè)特定的數(shù)據(jù)例子,,自適應(yīng)學(xué)習(xí)率算法可能會(huì)對(duì)前期出現(xiàn)的特征過(guò)擬合,后期才出現(xiàn)的特征很難糾正前期的擬合效果,。但這個(gè)文章給的例子很極端,,在實(shí)際情況中未必會(huì)出現(xiàn),。 另外一篇是《Improving Generalization Performance by Switching from Adam to SGD》,進(jìn)行了實(shí)驗(yàn)驗(yàn)證,。他們CIFAR-10數(shù)據(jù)集上進(jìn)行測(cè)試,,Adam的收斂速度比SGD要快,但最終收斂的結(jié)果并沒(méi)有SGD好,。他們進(jìn)一步實(shí)驗(yàn)發(fā)現(xiàn),,主要是后期Adam的學(xué)習(xí)率太低,影響了有效的收斂,。他們?cè)囍鴮?duì)Adam的學(xué)習(xí)率的下界進(jìn)行控制,,發(fā)現(xiàn)效果好了很多。 于是他們提出了一個(gè)用來(lái)改進(jìn)Adam的方法:前期用Adam,,享受Adam快速收斂的優(yōu)勢(shì),;后期切換到SGD,慢慢尋找最優(yōu)解,。這一方法以前也被研究者們用到,,不過(guò)主要是根據(jù)經(jīng)驗(yàn)來(lái)選擇切換的時(shí)機(jī)和切換后的學(xué)習(xí)率。這篇文章把這一切換過(guò)程傻瓜化,,給出了切換SGD的時(shí)機(jī)選擇方法,,以及學(xué)習(xí)率的計(jì)算方法,效果看起來(lái)也不錯(cuò),。 這個(gè)算法挺有趣,,下一篇我們可以來(lái)談?wù)劊@里先貼個(gè)算法框架圖: 所以,,談到現(xiàn)在,,到底Adam好還是SGD好?這可能是很難一句話說(shuō)清楚的事情,。去看學(xué)術(shù)會(huì)議中的各種paper,,用SGD的很多,Adam的也不少,,還有很多偏愛(ài)AdaGrad或者AdaDelta,。可能研究員把每個(gè)算法都試了一遍,,哪個(gè)出來(lái)的效果好就用哪個(gè)了,。畢竟paper的重點(diǎn)是突出自己某方面的貢獻(xiàn),其他方面當(dāng)然是無(wú)所不用其極,,怎么能輸在細(xì)節(jié)上呢,? 而從這幾篇怒懟Adam的paper來(lái)看,多數(shù)都構(gòu)造了一些比較極端的例子來(lái)演示了Adam失效的可能性,。這些例子一般過(guò)于極端,,實(shí)際情況中可能未必會(huì)這樣,,但這提醒了我們,理解數(shù)據(jù)對(duì)于設(shè)計(jì)算法的必要性,。優(yōu)化算法的演變歷史,,都是基于對(duì)數(shù)據(jù)的某種假設(shè)而進(jìn)行的優(yōu)化,那么某種算法是否有效,,就要看你的數(shù)據(jù)是否符合該算法的胃口了,。 算法固然美好,數(shù)據(jù)才是根本,。 另一方面,,Adam之流雖然說(shuō)已經(jīng)簡(jiǎn)化了調(diào)參,但是并沒(méi)有一勞永逸地解決問(wèn)題,,默認(rèn)的參數(shù)雖然好,,但也不是放之四海而皆準(zhǔn)。因此,,在充分理解數(shù)據(jù)的基礎(chǔ)上,,依然需要根據(jù)數(shù)據(jù)特性、算法特性進(jìn)行充分的調(diào)參實(shí)驗(yàn),。 從第一篇的框架中我們看到,,不同優(yōu)化算法最核心的區(qū)別,就是第三步所執(zhí)行的下降方向: 這個(gè)式子中,,前半部分是實(shí)際的學(xué)習(xí)率(也即下降步長(zhǎng)),,后半部分是實(shí)際的下降方向。SGD算法的下降方向就是該位置的梯度方向的反方向,,帶一階動(dòng)量的SGD的下降方向則是該位置的一階動(dòng)量方向,。自適應(yīng)學(xué)習(xí)率類(lèi)優(yōu)化算法為每個(gè)參數(shù)設(shè)定了不同的學(xué)習(xí)率,在不同維度上設(shè)定不同步長(zhǎng),,因此其下降方向是縮放過(guò)(scaled)的一階動(dòng)量方向,。 由于下降方向的不同,可能導(dǎo)致不同算法到達(dá)完全不同的局部最優(yōu)點(diǎn),?!禔n empirical analysis of the optimization of deep network loss surfaces》 這篇論文中做了一個(gè)有趣的實(shí)驗(yàn),他們把目標(biāo)函數(shù)值和相應(yīng)的參數(shù)形成的超平面映射到一個(gè)三維空間,,這樣我們可以直觀地看到各個(gè)算法是如何尋找超平面上的最低點(diǎn)的,。 上圖是論文的實(shí)驗(yàn)結(jié)果,橫縱坐標(biāo)表示降維后的特征空間,,區(qū)域顏色則表示目標(biāo)函數(shù)值的變化,,紅色是高原,藍(lán)色是洼地,。他們做的是配對(duì)兒實(shí)驗(yàn),,讓兩個(gè)算法從同一個(gè)初始化位置開(kāi)始出發(fā),然后對(duì)比優(yōu)化的結(jié)果,??梢钥吹剑瑤缀跞魏蝺蓚€(gè)算法都走到了不同的洼地,,他們中間往往隔了一個(gè)很高的高原,。這就說(shuō)明,不同算法在高原的時(shí)候,,選擇了不同的下降方向,。 正是在每一個(gè)十字路口的選擇,決定了你的歸宿,。如果上天能夠給我一個(gè)再來(lái)一次的機(jī)會(huì),,我會(huì)對(duì)那個(gè)女孩子說(shuō):SGD! 不同優(yōu)化算法的優(yōu)劣依然是未有定論的爭(zhēng)議話題,。據(jù)我在paper和各類(lèi)社區(qū)看到的反饋,,主流的觀點(diǎn)認(rèn)為:Adam等自適應(yīng)學(xué)習(xí)率算法對(duì)于稀疏數(shù)據(jù)具有優(yōu)勢(shì),且收斂速度很快,;但精調(diào)參數(shù)的SGD(+Momentum)往往能夠取得更好的最終結(jié)果,。 那么我們就會(huì)想到,可不可以把這兩者結(jié)合起來(lái),,先用Adam快速下降,,再用SGD調(diào)優(yōu),一舉兩得,?思路簡(jiǎn)單,,但里面有兩個(gè)技術(shù)問(wèn)題:
上一篇中提到的論文 Improving Generalization Performance by Switching from Adam to SGD 提出了解決這兩個(gè)問(wèn)題的思路。 首先來(lái)看第二個(gè)問(wèn)題,,切換之后的學(xué)習(xí)率,。 Adam的下降方向是 而SGD的下降方向是 SGD下降方向必定可以分解為Adam下降方向及其正交方向上的兩個(gè)方向之和,那么其在Adam下降方向上的投影就意味著SGD在Adam算法決定的下降方向上前進(jìn)的距離,,而在Adam下降方向的正交方向上的投影是 SGD 在自己選擇的修正方向上前進(jìn)的距離,。 如果SGD要走完Adam未走完的路,,那就首先要接過(guò)Adam的大旗——沿著 方向走一步,而后在沿著其正交方向走相應(yīng)的一步,。 這樣我們就知道該如何確定SGD的步長(zhǎng)(學(xué)習(xí)率)了——SGD在Adam下降方向上的正交投影,,應(yīng)該正好等于Adam的下降方向(含步長(zhǎng))。也即: 解這個(gè)方程,,我們就可以得到接續(xù)進(jìn)行SGD的學(xué)習(xí)率: 為了減少噪聲影響,,我們可以使用移動(dòng)平均值來(lái)修正對(duì)學(xué)習(xí)率的估計(jì): 這里直接復(fù)用了Adam的 beta 參數(shù)。 然后來(lái)看第一個(gè)問(wèn)題,,何時(shí)進(jìn)行算法的切換,。 作者提出的方法很簡(jiǎn)單,那就是當(dāng) SGD的相應(yīng)學(xué)習(xí)率的移動(dòng)平均值基本不變的時(shí)候,,即: 每次迭代完都計(jì)算一下SGD接班人的相應(yīng)學(xué)習(xí)率,,如果發(fā)現(xiàn)基本穩(wěn)定了,那就SGD以為學(xué)習(xí)率接班前進(jìn),。不過(guò),,這一時(shí)機(jī)是不是最優(yōu)的切換時(shí)機(jī),作者并沒(méi)有給出數(shù)學(xué)證明,,只是通過(guò)實(shí)驗(yàn)驗(yàn)證了效果,,切換時(shí)機(jī)還是一個(gè)很值得深入研究的話題。 最后,,分享一些在優(yōu)化算法的選擇和使用方面的一些tricks,。
這里只列舉出一些在優(yōu)化算法方面的trick,,如有遺漏,歡迎各位在評(píng)論中補(bǔ)充,。提前致謝,! 神經(jīng)網(wǎng)絡(luò)模型的設(shè)計(jì)和訓(xùn)練要復(fù)雜得多,initialization, activation, normalization 等等無(wú)不是四兩撥千斤,,這些方面的技巧我再慢慢寫(xiě),。 補(bǔ)充:指數(shù)移動(dòng)平均值的偏差修正前面我們講到,一階動(dòng)量和二階動(dòng)量都是按照指數(shù)移動(dòng)平均值進(jìn)行計(jì)算的: 實(shí)際使用過(guò)程中,,參數(shù)的經(jīng)驗(yàn)值是 初始化: 這個(gè)時(shí)候我們看到,,在初期,都會(huì)接近于0,,這個(gè)估計(jì)是有問(wèn)題的,。因此我們常常根據(jù)下式進(jìn)行誤差修正: 參考文獻(xiàn): [1] Stanford CS231n Convolutional Neural Networks for Visual Recognition [2] Stochastic Gradient Descent Tricks. [3] Efficient BackProp IELTS a bit |
|
來(lái)自: 太極混元天尊 > 《學(xué)習(xí)資料》