成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

深度學(xué)習(xí)中的優(yōu)化算法

supernavy / 1028人閱讀

摘要:二階動量的出現(xiàn),才意味著自適應(yīng)學(xué)習(xí)率優(yōu)化算法時(shí)代的到來。自適應(yīng)學(xué)習(xí)率類優(yōu)化算法為每個參數(shù)設(shè)定了不同的學(xué)習(xí)率,在不同維度上設(shè)定不同步長,因此其下降方向是縮放過的一階動量方向。

說到優(yōu)化算法,入門級必從SGD學(xué)起,老司機(jī)則會告訴你更好的還有AdaGrad / AdaDelta,或者直接無腦用Adam。可是看看學(xué)術(shù)界的paper,卻發(fā)現(xiàn)一眾大神還在用著入門級的SGD,最多加個Moment或者Nesterov ,還經(jīng)常會黑一下Adam。比如 UC Berkeley的一篇論文就在Conclusion中寫道:

Despite the fact that our experimental evidence demonstrates that adaptive ?methods are not advantageous for machine learning, the Adam algorithm remains incredibly popular. We are not sure exactly as to why ……

無奈與酸楚之情溢于言表。

這是為什么呢?難道平平淡淡才是真?

1、一個框架回顧優(yōu)化算法

首先我們來回顧一下各類優(yōu)化算法。

深度學(xué)習(xí)優(yōu)化算法經(jīng)歷了 SGD -> SGDM -> NAG ->AdaGrad -> AdaDelta -> Adam -> Nadam 這樣的發(fā)展歷程。Google一下就可以看到很多的教程文章,詳細(xì)告訴你這些算法是如何一步一步演變而來的。在這里,我們換一個思路,用一個框架來梳理所有的優(yōu)化算法,做一個更加高屋建瓴的對比。

1.1優(yōu)化算法通用框架

首先定義:待優(yōu)化參數(shù):w ,目標(biāo)函數(shù): f(w),初始學(xué)習(xí)率 α。

而后,開始進(jìn)行迭代優(yōu)化。在每個epoch t:

掌握了這個框架,你可以輕輕松松設(shè)計(jì)自己的優(yōu)化算法。

我們拿著這個框架,來照一照各種玄乎其玄的優(yōu)化算法的真身。步驟3、4對于各個算法都是一致的,主要的差別就體現(xiàn)在1和2上。

2、固定學(xué)習(xí)率的優(yōu)化算法

一階動量是各個時(shí)刻梯度方向的指數(shù)移動平均值,約等于最近 1/(1-β1) 個時(shí)刻的梯度向量和的平均值。

也就是說,t 時(shí)刻的下降方向,不僅由當(dāng)前點(diǎn)的梯度方向決定,而且由此前累積的下降方向決定。β1的經(jīng)驗(yàn)值為0.9,這就意味著下降方向主要是此前累積的下降方向,并略微偏向當(dāng)前時(shí)刻的下降方向。想象高速公路上汽車轉(zhuǎn)彎,在高速向前的同時(shí)略微偏向,急轉(zhuǎn)彎可是要出事的。

2.3SGD with Nesterov Acceleration

SGD 還有一個問題是困在局部最優(yōu)的溝壑里面震蕩。想象一下你走到一個盆地,四周都是略高的小山,你覺得沒有下坡的方向,那就只能待在這里了??墒侨绻闩郎细叩?,就會發(fā)現(xiàn)外面的世界還很廣闊。因此,我們不能停留在當(dāng)前位置去觀察未來的方向,而要向前一步、多看一步、看遠(yuǎn)一些。

NAG全稱Nesterov ?Accelerated Gradient,是在SGD、SGD-M的基礎(chǔ)上的進(jìn)一步改進(jìn),改進(jìn)點(diǎn)在于步驟1。我們知道在時(shí)刻t的主要下降方向是由累積動量決定的,自己的梯度方向說了也不算,那與其看當(dāng)前梯度方向,不如先看看如果跟著累積動量走了一步,那個時(shí)候再怎么走。因此,NAG在步驟1,不計(jì)算當(dāng)前位置的梯度方向,而是計(jì)算如果按照累積動量走了一步,那個時(shí)候的下降方向:

然后用下一個點(diǎn)的梯度方向,與歷史累積動量相結(jié)合,計(jì)算步驟2中當(dāng)前時(shí)刻的累積動量。

3、自適應(yīng)學(xué)習(xí)率的優(yōu)化算法

此前我們都沒有用到二階動量。二階動量的出現(xiàn),才意味著“自適應(yīng)學(xué)習(xí)率”優(yōu)化算法時(shí)代的到來。SGD及其變種以同樣的學(xué)習(xí)率更新每個參數(shù),但深度神經(jīng)網(wǎng)絡(luò)往往包含大量的參數(shù),這些參數(shù)并不是總會用得到(想想大規(guī)模的embedding)。對于經(jīng)常更新的參數(shù),我們已經(jīng)積累了大量關(guān)于它的知識,不希望被單個樣本影響太大,希望學(xué)習(xí)速率慢一些;對于偶爾更新的參數(shù),我們了解的信息太少,希望能從每個偶然出現(xiàn)的樣本身上多學(xué)一些,即學(xué)習(xí)速率大一些。

3.1AdaGrad

怎么樣去度量歷史更新頻率呢?那就是二階動量——該維度上,迄今為止所有梯度值的平方和:

3.2AdaDelta/RMSProp

由于AdaGrad單調(diào)遞減的學(xué)習(xí)率變化過于激進(jìn),我們考慮一個改變二階動量計(jì)算方法的策略:不累積全部歷史梯度,而只關(guān)注過去一段時(shí)間窗口的下降梯度。這也就是AdaDelta名稱中Delta的來歷。

修改的思路很簡單。前面我們講到,指數(shù)移動平均值大約就是過去一段時(shí)間的平均值,因此我們用這一方法來計(jì)算二階累積動量:

3.4Nadam

最后是Nadam。我們說Adam是集大成者,但它居然遺漏了Nesterov,這還能忍?必須給它加上,按照NAG的步驟1:

就是Nesterov + Adam = Nadam了。

說到這里,大概可以理解為什么j經(jīng)常有人說 Adam / Nadam 目前最主流、較好用的優(yōu)化算法了。新手上路,先拿來一試,收斂速度嗖嗖滴,效果也是杠杠滴。

那為什么Adam還老招人黑,被學(xué)術(shù)界一頓鄙夷?難道只是為了發(fā)paper灌水嗎?簡單看看paper里都在說什么。

4、Adam:可能不收斂

這篇是正在深度學(xué)習(xí)領(lǐng)域較高級會議之一 ICLR 2018 匿名審稿中的一篇論文《On the Convergence of Adam and Beyond》,探討了Adam算法的收斂性,通過反例證明了Adam在某些情況下可能會不收斂。

從而使得學(xué)習(xí)率單調(diào)遞減。

5、Adam:可能錯過全局最優(yōu)解

深度神經(jīng)網(wǎng)絡(luò)往往包含大量的參數(shù),在這樣一個維度極高的空間內(nèi),非凸的目標(biāo)函數(shù)往往起起伏伏,擁有無數(shù)個高地和洼地。有的是高峰,通過引入動量可能很容易越過;但有些是高原,可能探索很多次都出不來,于是停止了訓(xùn)練。

近期Arxiv上的兩篇文章談到這個問題。

第一篇就是前文提到的吐槽Adam最狠的UC Berkeley的文章《The Marginal Value of Adaptive Gradient Methods in Machine Learning》。文中說到,同樣的一個優(yōu)化問題,不同的優(yōu)化算法可能會找到不同的答案,但自適應(yīng)學(xué)習(xí)率的算法往往找到非常差的答案(very poor solution)。他們設(shè)計(jì)了一個特定的數(shù)據(jù)例子,自適應(yīng)學(xué)習(xí)率算法可能會對前期出現(xiàn)的特征過擬合,后期才出現(xiàn)的特征很難糾正前期的擬合效果。但這個文章給的例子很極端,在實(shí)際情況中未必會出現(xiàn)。

另外一篇是《Improving Generalization Performance by Switching from Adam to SGD》,進(jìn)行了實(shí)驗(yàn)驗(yàn)證。他們CIFAR-10數(shù)據(jù)集上進(jìn)行測試,Adam的收斂速度比SGD要快,但最終收斂的結(jié)果并沒有SGD好。他們進(jìn)一步實(shí)驗(yàn)發(fā)現(xiàn),主要是后期Adam的學(xué)習(xí)率太低,影響了有效的收斂。他們試著對Adam的學(xué)習(xí)率的下界進(jìn)行控制,發(fā)現(xiàn)效果好了很多。

于是他們提出了一個用來改進(jìn)Adam的方法:前期用Adam,享受Adam快速收斂的優(yōu)勢;后期切換到SGD,慢慢尋找最優(yōu)解。這一方法以前也被研究者們用到,不過主要是根據(jù)經(jīng)驗(yàn)來選擇切換的時(shí)機(jī)和切換后的學(xué)習(xí)率。這篇文章把這一切換過程傻瓜化,給出了切換SGD的時(shí)機(jī)選擇方法,以及學(xué)習(xí)率的計(jì)算方法,效果看起來也不錯。

這個算法挺有趣,下一篇我們可以來談?wù)?,這里先貼個算法框架圖:

6、到底用Adam還是SGD

所以,談到現(xiàn)在,到底Adam好還是SGD好?這可能是很難一句話說清楚的事情。去看學(xué)術(shù)會議中的各種paper,用SGD的很多,Adam的也不少,還有很多偏愛AdaGrad或者AdaDelta??赡苎芯繂T把每個算法都試了一遍,哪個出來的效果好就用哪個了。畢竟paper的重點(diǎn)是突出自己某方面的貢獻(xiàn),其他方面當(dāng)然是無所不用其極,怎么能輸在細(xì)節(jié)上呢?

而從這幾篇怒懟Adam的paper來看,多數(shù)都構(gòu)造了一些比較極端的例子來演示了Adam失效的可能性。這些例子一般過于極端,實(shí)際情況中可能未必會這樣,但這提醒了我們,理解數(shù)據(jù)對于設(shè)計(jì)算法的必要性。優(yōu)化算法的演變歷史,都是基于對數(shù)據(jù)的某種假設(shè)而進(jìn)行的優(yōu)化,那么某種算法是否有效,就要看你的數(shù)據(jù)是否符合該算法的胃口了。

算法固然美好,數(shù)據(jù)才是根本。

另一方面,Adam之流雖然說已經(jīng)簡化了調(diào)參,但是并沒有一勞永逸地解決問題,默認(rèn)的參數(shù)雖然好,但也不是放之四海而皆準(zhǔn)。因此,在充分理解數(shù)據(jù)的基礎(chǔ)上,依然需要根據(jù)數(shù)據(jù)特性、算法特性進(jìn)行充分的調(diào)參實(shí)驗(yàn)。

7、不同算法的核心差異

從第一篇的框架中我們看到,不同優(yōu)化算法最核心的區(qū)別,就是第三步所執(zhí)行的下降方向:

這個式子中,前半部分是實(shí)際的學(xué)習(xí)率(也即下降步長),后半部分是實(shí)際的下降方向。SGD算法的下降方向就是該位置的梯度方向的反方向,帶一階動量的SGD的下降方向則是該位置的一階動量方向。自適應(yīng)學(xué)習(xí)率類優(yōu)化算法為每個參數(shù)設(shè)定了不同的學(xué)習(xí)率,在不同維度上設(shè)定不同步長,因此其下降方向是縮放過(scaled)的一階動量方向。

由于下降方向的不同,可能導(dǎo)致不同算法到達(dá)完全不同的局部最優(yōu)點(diǎn)?!禔n empirical analysis of the optimization of deep network loss surfaces》 這篇論文中做了一個有趣的實(shí)驗(yàn),他們把目標(biāo)函數(shù)值和相應(yīng)的參數(shù)形成的超平面映射到一個三維空間,這樣我們可以直觀地看到各個算法是如何尋找超平面上的較低點(diǎn)的。

上圖是論文的實(shí)驗(yàn)結(jié)果,橫縱坐標(biāo)表示降維后的特征空間,區(qū)域顏色則表示目標(biāo)函數(shù)值的變化,紅色是高原,藍(lán)色是洼地。他們做的是配對兒實(shí)驗(yàn),讓兩個算法從同一個初始化位置開始出發(fā),然后對比優(yōu)化的結(jié)果??梢钥吹?,幾乎任何兩個算法都走到了不同的洼地,他們中間往往隔了一個很高的高原。這就說明,不同算法在高原的時(shí)候,選擇了不同的下降方向。

8、Adam+SGD組合策略

正是在每一個十字路口的選擇,決定了你的歸宿。如果上天能夠給我一個再來一次的機(jī)會,我會對那個女孩子說:SGD!

不同優(yōu)化算法的優(yōu)劣依然是未有定論的爭議話題。據(jù)我在paper和各類社區(qū)看到的反饋,主流的觀點(diǎn)認(rèn)為:Adam等自適應(yīng)學(xué)習(xí)率算法對于稀疏數(shù)據(jù)具有優(yōu)勢,且收斂速度很快;但精調(diào)參數(shù)的SGD(+Momentum)往往能夠取得更好的最終結(jié)果。

那么我們就會想到,可不可以把這兩者結(jié)合起來,先用Adam快速下降,再用SGD調(diào)優(yōu),一舉兩得?思路簡單,但里面有兩個技術(shù)問題:

什么時(shí)候切換優(yōu)化算法?——如果切換太晚,Adam可能已經(jīng)跑到自己的盆地里去了,SGD再怎么好也跑不出來了。

切換算法以后用什么樣的學(xué)習(xí)率?——Adam用的是自適應(yīng)學(xué)習(xí)率,依賴的是二階動量的累積,SGD接著訓(xùn)練的話,用什么樣的學(xué)習(xí)率?

上一篇中提到的論文 Improving Generalization Performance by Switching from Adam to SGD 提出了解決這兩個問題的思路。

首先來看第二個問題,切換之后的學(xué)習(xí)率。

SGD下降方向必定可以分解為Adam下降方向及其正交方向上的兩個方向之和,那么其在Adam下降方向上的投影就意味著SGD在Adam算法決定的下降方向上前進(jìn)的距離,而在Adam下降方向的正交方向上的投影是 SGD 在自己選擇的修正方向上前進(jìn)的距離。

如果SGD要走完Adam未走完的路,那就首先要接過Adam的大旗——沿著 方向走一步,而后在沿著其正交方向走相應(yīng)的一步。

這樣我們就知道該如何確定SGD的步長(學(xué)習(xí)率)了——SGD在Adam下降方向上的正交投影,應(yīng)該正好等于Adam的下降方向(含步長)。也即:

這里直接復(fù)用了Adam的 beta 參數(shù)。

然后來看第一個問題,何時(shí)進(jìn)行算法的切換。

9、優(yōu)化算法的常用tricks

最后,分享一些在優(yōu)化算法的選擇和使用方面的一些tricks。

首先,各大算法孰優(yōu)孰劣并無定論。如果是剛?cè)腴T,優(yōu)先考慮 SGD+Nesterov Momentum或者Adam.(Standford 231n : The two recommended updates to use are either SGD+Nesterov Momentum or Adam)

選擇你熟悉的算法——這樣你可以更加熟練地利用你的經(jīng)驗(yàn)進(jìn)行調(diào)參。

充分了解你的數(shù)據(jù)——如果模型是非常稀疏的,那么優(yōu)先考慮自適應(yīng)學(xué)習(xí)率的算法。

根據(jù)你的需求來選擇——在模型設(shè)計(jì)實(shí)驗(yàn)過程中,要快速驗(yàn)證新模型的效果,可以先用Adam進(jìn)行快速實(shí)驗(yàn)優(yōu)化;在模型上線或者結(jié)果發(fā)布前,可以用精調(diào)的SGD進(jìn)行模型的極致優(yōu)化。

先用小數(shù)據(jù)集進(jìn)行實(shí)驗(yàn)。有論文研究指出,隨機(jī)梯度下降算法的收斂速度和數(shù)據(jù)集的大小的關(guān)系不大。(The mathematics of stochastic gradient descent are amazingly independent of the training set size. In particular, the asymptotic SGD convergence rates are independent from the sample size. [2])因此可以先用一個具有代表性的小數(shù)據(jù)集進(jìn)行實(shí)驗(yàn),測試一下較好的優(yōu)化算法,并通過參數(shù)搜索來尋找最優(yōu)的訓(xùn)練參數(shù)。

考慮不同算法的組合。先用Adam進(jìn)行快速下降,而后再換到SGD進(jìn)行充分的調(diào)優(yōu)。切換策略可以參考本文介紹的方法。

數(shù)據(jù)集一定要充分的打散(shuffle)。這樣在使用自適應(yīng)學(xué)習(xí)率算法的時(shí)候,可以避免某些特征集中出現(xiàn),而導(dǎo)致的有時(shí)學(xué)習(xí)過度、有時(shí)學(xué)習(xí)不足,使得下降方向出現(xiàn)偏差的問題。

訓(xùn)練過程中持續(xù)監(jiān)控訓(xùn)練數(shù)據(jù)和驗(yàn)證數(shù)據(jù)上的目標(biāo)函數(shù)值以及精度或者AUC等指標(biāo)的變化情況。對訓(xùn)練數(shù)據(jù)的監(jiān)控是要保證模型進(jìn)行了充分的訓(xùn)練——下降方向正確,且學(xué)習(xí)率足夠高;對驗(yàn)證數(shù)據(jù)的監(jiān)控是為了避免出現(xiàn)過擬合。

制定一個合適的學(xué)習(xí)率衰減策略。可以使用定期衰減策略,比如每過多少個epoch就衰減一次;或者利用精度或者AUC等性能指標(biāo)來監(jiān)控,當(dāng)測試集上的指標(biāo)不變或者下跌時(shí),就降低學(xué)習(xí)率。

這里只列舉出一些在優(yōu)化算法方面的trick,如有遺漏,歡迎各位在評論中補(bǔ)充。提前致謝!

神經(jīng)網(wǎng)絡(luò)模型的設(shè)計(jì)和訓(xùn)練要復(fù)雜得多,initialization, activation, normalization 等等無不是四兩撥千斤,這些方面的技巧我再慢慢寫。

補(bǔ)充:指數(shù)移動平均值的偏差修正

參考文獻(xiàn):

[1] Stanford CS231n Convolutional Neural Networks for Visual Recognition

[2] Stochastic Gradient Descent Tricks.

[3] Efficient BackProp

歡迎加入本站公開興趣群

商業(yè)智能與數(shù)據(jù)分析群

興趣范圍包括各種讓數(shù)據(jù)產(chǎn)生價(jià)值的辦法,實(shí)際應(yīng)用案例分享與討論,分析工具,ETL工具,數(shù)據(jù)倉庫,數(shù)據(jù)挖掘工具,報(bào)表系統(tǒng)等全方位知識

QQ群:81035754

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/4756.html

相關(guān)文章

  • 利用遺傳算法優(yōu)化神經(jīng)網(wǎng)絡(luò):Uber提出深度學(xué)習(xí)訓(xùn)練新方式

    摘要:和的得分均未超過右遺傳算法在也表現(xiàn)得很好。深度遺傳算法成功演化了有著萬自由參數(shù)的網(wǎng)絡(luò),這是通過一個傳統(tǒng)的進(jìn)化算法演化的較大的神經(jīng)網(wǎng)絡(luò)。 Uber 涉及領(lǐng)域廣泛,其中許多領(lǐng)域都可以利用機(jī)器學(xué)習(xí)改進(jìn)其運(yùn)作。開發(fā)包括神經(jīng)進(jìn)化在內(nèi)的各種有力的學(xué)習(xí)方法將幫助 Uber 發(fā)展更安全、更可靠的運(yùn)輸方案。遺傳算法——訓(xùn)練深度學(xué)習(xí)網(wǎng)絡(luò)的有力競爭者我們驚訝地發(fā)現(xiàn),通過使用我們發(fā)明的一種新技術(shù)來高效演化 DNN,...

    AlienZHOU 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<