Adam那么棒,为什么还对SGD念念不忘 (2)—— Adam的两宗罪
在上篇文章中,我們用一個(gè)框架來(lái)回顧了主流的深度學(xué)習(xí)優(yōu)化算法??梢钥吹?#xff0c;一代又一代的研究者們?yōu)榱宋覀兡軣?#xff08;xun)好(hao)金(mo)丹(xing)可謂是煞費(fèi)苦心。從理論上看,一代更比一代完善,Adam/Nadam已經(jīng)登峰造極了,為什么大家還是不忘初心SGD呢?
?
舉個(gè)栗子。很多年以前,攝影離普羅大眾非常遙遠(yuǎn)。十年前,傻瓜相機(jī)開始風(fēng)靡,游客幾乎人手一個(gè)。智能手機(jī)出現(xiàn)以后,攝影更是走進(jìn)千家萬(wàn)戶,手機(jī)隨手一拍,前后兩千萬(wàn),照亮你的美(咦,這是什么亂七八糟的)。但是專業(yè)攝影師還是喜歡用單反,孜孜不倦地調(diào)光圈、快門、ISO、白平衡……一堆自拍黨從不care的名詞。技術(shù)的進(jìn)步,使得傻瓜式操作就可以得到不錯(cuò)的效果,但是在特定的場(chǎng)景下,要拍出最好的效果,依然需要深入地理解光線、理解結(jié)構(gòu)、理解器材。
?
優(yōu)化算法大抵也如此。在上一篇中,我們用同一個(gè)框架讓各類算法對(duì)號(hào)入座。可以看出,大家都是殊途同歸,只是相當(dāng)于在SGD基礎(chǔ)上增加了各類學(xué)習(xí)率的主動(dòng)控制。如果不想做精細(xì)的調(diào)優(yōu),那么Adam顯然最便于直接拿來(lái)上手。
?
但這樣的傻瓜式操作并不一定能夠適應(yīng)所有的場(chǎng)合。如果能夠深入了解數(shù)據(jù),研究員們可以更加自如地控制優(yōu)化迭代的各類參數(shù),實(shí)現(xiàn)更好的效果也并不奇怪。畢竟,精調(diào)的參數(shù)還比不過(guò)傻瓜式的Adam,無(wú)疑是在挑戰(zhàn)頂級(jí)研究員們的煉丹經(jīng)驗(yàn)!
?
最近,不少paper開懟Adam,我們簡(jiǎn)單看看都在說(shuō)什么:
?
Adam罪狀一:可能不收斂
?
這篇是正在深度學(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)遞減的。因此,這兩類算法會(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)遞減。
?
?
Adam罪狀二:可能錯(cuò)過(guò)全局最優(yōu)解
?
深度神經(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最狠的?The Marginal Value of Adaptive Gradient Methods in Machine Learning?。文中說(shuō)到,同樣的一個(gè)優(yōu)化問(wèn)題,不同的優(yōu)化算法可能會(huì)找到不同的答案,但自適應(yīng)學(xué)習(xí)率的算法往往找到非常差的答案。他們通過(guò)一個(gè)特定的數(shù)據(jù)例子說(shuō)明,自適應(yīng)學(xué)習(xí)率算法可能會(huì)對(duì)前期出現(xiàn)的特征過(guò)擬合,后期才出現(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ò)。
?
到底該用Adam還是SGD?
?
所以,談到現(xiàn)在,到底Adam好還是SGD好?這可能是很難一句話說(shuō)清楚的事情。去看學(xué)術(shù)會(huì)議中的各種paper,用SGD的很多,Adam的也不少,還有很多偏愛(ài)AdaGrad或者AdaDelta??赡苎芯繂T把每個(gè)算法都試了一遍,哪個(gè)出來(lái)的效果好就用哪個(gè)了。
?
而從這幾篇怒懟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)解。而這個(gè)時(shí)候,不論是Adam,還是SGD,于你都不重要了。
?
少年,好好煉丹吧。
?
關(guān)于優(yōu)化算法的選擇和tricks,歡迎繼續(xù)移步閱讀:
Adam那么棒,為什么還對(duì)SGD念念不忘 (3)
總結(jié)
以上是生活随笔為你收集整理的Adam那么棒,为什么还对SGD念念不忘 (2)—— Adam的两宗罪的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: python究竟要不要使用多线程
- 下一篇: 一个框架看懂优化算法之异同 SGD/Ad