一文告诉你Adam、AdamW、Amsgrad区别和联系 重点
**序言:**Adam自2014年出現(xiàn)之后,一直是受人追捧的參數(shù)訓(xùn)練神器,但最近越來(lái)越多的文章指出:Adam存在很多問(wèn)題,效果甚至沒(méi)有簡(jiǎn)單的SGD + Momentum好。因此,出現(xiàn)了很多改進(jìn)的版本,比如AdamW,以及最近的ICLR-2018年最佳論文提出的Adam改進(jìn)版Amsgrad。那么,Adam究竟是否有效?改進(jìn)版AdamW、Amsgrad與Adam之間存在什么聯(lián)系與區(qū)別?改進(jìn)版是否真的比Adam更好呢?相信這篇文章將會(huì)給你一個(gè)清晰的答案。
(內(nèi)容翻譯整理自網(wǎng)絡(luò))
Adam Roller-Coaster
Adamoptimizer的發(fā)展歷程就像坐過(guò)山車一樣。Adam最先于2014年提出,其核心是一個(gè)簡(jiǎn)單而直觀的想法:當(dāng)我們知道某些參數(shù)確實(shí)需要比其他參數(shù)移動(dòng)地更快時(shí),為什么要對(duì)每個(gè)參數(shù)都使用相同的學(xué)習(xí)速率呢?由于最近的梯度的平方告訴我們可以從每個(gè)權(quán)重得到多少信息,我們可以除以這一點(diǎn),以確保即使變化最緩慢的權(quán)重也能獲得發(fā)光的機(jī)會(huì)。Adam借鑒了這個(gè)思路,在標(biāo)準(zhǔn)方法里面加入了動(dòng)量,并且(通過(guò)一些調(diào)整來(lái)保持早期Bathes不被biased)就是這樣!
Adam首次發(fā)布后,深度學(xué)習(xí)社區(qū)在看到原始論文中的效果圖(下圖)之后,非常的興奮:
?
v2-6320a0a2426753426bc50a536e740920_b.jpg600x589 77.6 KB?
Adam和其他optimizer之間的比較
訓(xùn)練速度加快了200%!“總的來(lái)說(shuō),我們發(fā)現(xiàn)Adam非常強(qiáng)大,非常適合解決機(jī)器學(xué)習(xí)的各種非凸優(yōu)化問(wèn)題” 論文總結(jié)道。但是,那是三年前了,是一個(gè)深度學(xué)習(xí)發(fā)展的一個(gè)黃金epochs。但也漸漸逐漸清晰,這一切并不如我們所希望的那樣。實(shí)際情況是,很少有研究論文使用Adam來(lái)訓(xùn)練他們的模型,一些新的研究,如《The Marginal Value of Adaptive Gradient Methods in Machine Learning》建議不要使用Adam,并通過(guò)多個(gè)實(shí)驗(yàn)中表明,傳統(tǒng)的SGD+momentum的方法得到的結(jié)果更好。
但是在2017年底,Adam似乎獲得了新生。Ilya Loshchilov和Frank Hutter在他們的論文《Fixing Weight Decay Regularization in Adam》中指出,所有的深度學(xué)習(xí)庫(kù)中的Adam optimizer中實(shí)現(xiàn)的weight decay方法似乎都是錯(cuò)誤的,并提出了一種簡(jiǎn)單的方法(他們稱之為AdamW)來(lái)解決它。盡管他們的結(jié)果略有不同,但從下圖的效果對(duì)比圖中可以發(fā)現(xiàn),結(jié)果令人振奮,:
Adam和AdamW的對(duì)比
我們當(dāng)然期待看到Adam的回歸,因?yàn)樗坪踝畛醯慕Y(jié)果可能會(huì)再次被發(fā)現(xiàn)。但事情并非如此。實(shí)際上,所有深度學(xué)習(xí)框架中,只有fastai,由Sylvain編寫的代碼中的的算法實(shí)現(xiàn)修復(fù)了這一bug。如果沒(méi)有廣泛的框架可用性,大多數(shù)人仍舊會(huì)被old、“broken”adam所困擾。
但這不是唯一的問(wèn)題。未來(lái)會(huì)遇到更多的問(wèn)題。兩篇相互獨(dú)立的論文都明確指出并證明了Adam中存在的收斂性問(wèn)題,盡管其中一人聲稱修復(fù)了這一問(wèn)題(并獲得了ICLR-2018年的“最佳論文”獎(jiǎng)),他們的算法稱為Amsgrad。但是,如果我們是否從這個(gè)最具戲劇性的歷史生活中學(xué)到了任何東西(至少在optimizer standards上是戲劇性的)呢?看起來(lái)似乎并沒(méi)有。事實(shí)上,博士生Jeremy Bernstein 已經(jīng)指出,聲稱的收斂問(wèn)題實(shí)際上只是因?yàn)槌瑓?shù)的選擇不當(dāng)導(dǎo)致的,而且無(wú)論如何,Amsgrad也許無(wú)法解決這一問(wèn)題。另一名博士生Filip Korzeniowski展示了一些早期的結(jié)果,這些結(jié)果似乎也支持這種關(guān)于Amsgrad的,令人沮喪的觀點(diǎn)。
脫離Roller-coaster
那么對(duì)于我們這些只想快速且準(zhǔn)確訓(xùn)練模型的人來(lái)說(shuō),我們?cè)撛趺崔k呢?讓我們用經(jīng)歷數(shù)百年時(shí)間的,科學(xué)的方式來(lái)解決這場(chǎng)爭(zhēng)論:通過(guò)實(shí)驗(yàn)!我們會(huì)在短時(shí)間內(nèi)告訴你所有細(xì)節(jié),首先,給出一個(gè)結(jié)果概述:
· 適當(dāng)調(diào)整,Adam是真的有效!我們?cè)诟鞣N任務(wù)上都獲得了最新的成績(jī)(就訓(xùn)練時(shí)間而言)
o 在DAWNBench競(jìng)賽中,通訓(xùn)練CIFAR10達(dá)到> 94%的準(zhǔn)確度,評(píng)測(cè)當(dāng)采用Augmentation時(shí),只需要18個(gè)epoch;或不采用Augmentation時(shí),只需要30個(gè)epochs;
o 采用Cars Stanford Dataset數(shù)據(jù)集,訓(xùn)練60個(gè)epochs,fine-tuning Resnet50達(dá)到90%的精確度(之前達(dá)到相同的結(jié)果需要600 epochs);
o 從頭開(kāi)始訓(xùn)練AWD LSTM或QRNN,需要90個(gè)epochs(或單個(gè)GPU上需要1個(gè)半小時(shí)),在Wikitext-2數(shù)據(jù)集上的達(dá)到state-of-the-art的perplexity(之前的report的對(duì)于LSTM需要750個(gè)epochs,對(duì)于QRNN需要500個(gè)epochs)。
· 這意味著我們已經(jīng)看到(我們第一次意識(shí)到)在論文《Super-Convergence: Very Fast Training of Neural Networks Using Large Learning Rates》使用Adam所獲得的超級(jí)收斂效果(Super-Convergence)!超級(jí)收斂是在采用較大的學(xué)習(xí)率訓(xùn)練神經(jīng)網(wǎng)絡(luò)時(shí)發(fā)生的一種現(xiàn)象,使訓(xùn)練速度加快一倍。在了解這一現(xiàn)象之前,將CIFAR10訓(xùn)練達(dá)到94%的準(zhǔn)確度大約需要100個(gè)epochs。
· 與之前的工作相比,我們看到Adam在我們嘗試過(guò)的每個(gè)CNN圖像問(wèn)題上獲得與SGD + Momentum一樣的精確度,只要它經(jīng)過(guò)適當(dāng)調(diào)整,并且它幾乎總是更快一點(diǎn)。
· Amsgrad是一個(gè)糟糕的“fix”的這一suggestion是正確的。我們一直發(fā)現(xiàn),與普通的Adam / AdamW相比,Amsgrad在準(zhǔn)確度(或其他相關(guān)指標(biāo))方面沒(méi)有獲得任何提升。
當(dāng)你聽(tīng)到有人們說(shuō)Adam沒(méi)有像SGD + Momentum那樣generalize的時(shí)候,你幾乎總會(huì)發(fā)現(xiàn),根本原因使他們?yōu)樗麄兊哪P瓦x擇了較差的超參數(shù)。Adam通常需要比SGD更多的regularization,因此在從SGD切換到Adam時(shí),請(qǐng)務(wù)必調(diào)整正則化超參數(shù)。
以下是本文其余部分的概述:
1 AdamW
1.1 了解AdamW
1.2 實(shí)現(xiàn)AdamW
1.3 AdamW實(shí)驗(yàn)的結(jié)果
2 Amsgrad
2.1 了解Amsgrad
2.2 實(shí)現(xiàn)Amsgrad
2.3 Amsgrad實(shí)驗(yàn)的結(jié)果
3 完整結(jié)果表
1 AdamW
1.1 了解AdamW:weight decay or L2正規(guī)?
L2正則是一種減少過(guò)擬合的一種經(jīng)典方法,它在損失函數(shù)中加入對(duì)模型所有權(quán)重的平方和,乘以給定的超參數(shù)(本文中的所有方程都使用python,numpy,和pytorch表示):
final_loss = loss + wd * all_weights.pow(2).sum() / 2
…其中wd是要設(shè)置的l2正則的超參數(shù)。這也稱為weight decay,因?yàn)樵趹?yīng)用普通的SGD時(shí),它相當(dāng)于采用如下所示來(lái)更新權(quán)重:
w = w - lr * w.grad - lr * wd * w
(注意,w 2相對(duì)于w的導(dǎo)數(shù)是2w。)在這個(gè)等式中,我們看到我們?nèi)绾卧诿恳徊街袦p去一小部分權(quán)重,因此成為衰減。
我們查看過(guò)的所有深度學(xué)習(xí)庫(kù),都使用了第一種形式。(實(shí)際上,它幾乎總是通過(guò)向gradients中添加wd * w來(lái)實(shí)現(xiàn),而不是去改變損失函數(shù):我們不希望在有更簡(jiǎn)單的方法時(shí),通過(guò)修改損失來(lái)增加更多計(jì)算量。)
那么為什么要區(qū)分這兩個(gè)概念,它們是否起到了相同的作用呢?答案是,它們對(duì)于vanilla SGD來(lái)說(shuō)是一樣的東西,但只要我們?cè)诠街性黾觿?dòng)量項(xiàng),或者使用像Adam這樣更復(fù)雜的一階或二階的optimizer,L2正則化(第一個(gè)等式)和權(quán)重衰減(第二個(gè)等式)就會(huì)變得不同。在本文的其余部分,當(dāng)我們談?wù)搘eight decay時(shí),我們將始終參考第二個(gè)公式(梯度更新時(shí),稍微減輕權(quán)重)并談?wù)凩2正則化,如果我們想提一下經(jīng)典的方法。
以SGD + momentum為例。使用L2正則化,并添加wd * w衰減項(xiàng)到公式中(如前所述),但不直接從權(quán)重中減去梯度。首先我們計(jì)算移動(dòng)平均值(moving average):
moving_avg = alpha * moving_avg + (1-alpha) * (w.grad + wd*w)
…這個(gè)移動(dòng)平均值將乘以學(xué)習(xí)率并從w中減去。因此,與將從w取得的正則化相關(guān)聯(lián)的部分是lr?(1-alpha)?wd * w加上前一步的moving_avg值。
另一方面,weight decay的梯度更新如下式:
moving_avg = alpha * moving_avg + (1-alpha) * w.grad w = w - lr * moving_avg - lr * wd * w
我們可以看到,從與正則化相關(guān)聯(lián)的w中減去的部分在兩種方法中是不同的。當(dāng)使用Adam optimizer時(shí),它會(huì)變得更加不同:在L2正則化的情況下,我們將這個(gè)wd * w添加到gradients,然后計(jì)算gradients及其平方值的移動(dòng)平均值,然后再使用它們進(jìn)行梯度更新。而weight decay的方法只是在進(jìn)行更新,然后減去每個(gè)權(quán)重。
顯然,這是兩種不同的方法。在嘗試了這個(gè)之后,Ilya Loshchilov和Frank Hutter在他們的文章中建議我們應(yīng)該使用Adam的權(quán)重衰減,而不是經(jīng)典深度學(xué)習(xí)庫(kù)實(shí)現(xiàn)的L2正則化方法。
1.2 實(shí)現(xiàn)AdamW
我們應(yīng)該怎么做?基于fastai庫(kù)為例,具體來(lái)說(shuō),如果使用fit函數(shù),只需添加參數(shù) use_wd_sched = True:
learn.fit(lr, 1, wds=1e-4, use_wd_sched=
True)
如果您更喜歡新的API,則可以在每個(gè)訓(xùn)練階段使用參數(shù)wd_loss = False(計(jì)算損失函數(shù)時(shí),不使用weight decay):
phases = [TrainingPhase(1, optim.Adam, lr, wds=1-e4, wd_loss=False)]
learn.fit_opt_sched(phases)
以下給出基于fast庫(kù)的一個(gè)簡(jiǎn)單實(shí)現(xiàn)。在optimizer的step函數(shù)的內(nèi)部,只使用gradients來(lái)更新參數(shù),根本不使用參數(shù)本身的值(除了weight decay,但我們將在外圍處理)。然后我們可以在optimizer處理之前,簡(jiǎn)單地執(zhí)行權(quán)重衰減。在計(jì)算梯度之后仍然必須進(jìn)行相同操作(否則會(huì)影響gradients值),所以在訓(xùn)練循環(huán)中,你必須找到這個(gè)位置。
loss.backward()
#Do?the weight decay here!
optimizer.step()
當(dāng)然,optimizer應(yīng)該設(shè)置為wd = 0,否則它會(huì)進(jìn)行L2正則化,這正是我們現(xiàn)在不想要的。現(xiàn)在,在那個(gè)位置,我們必須循環(huán)所有參數(shù),并做weight decay更新。你的參數(shù)應(yīng)該都在optimizer的字典param_groups中,因此循環(huán)看起來(lái)像這樣:
loss.backward()
for group in optimizer.param_groups():
for param in group[‘params’]:
param.data = param.data.add(-wd * group[‘lr’], param.data)
optimizer.step()
1.3 AdamW實(shí)驗(yàn)的結(jié)果:它有效嗎?
我們?cè)谟?jì)算機(jī)視覺(jué)問(wèn)題上第一次進(jìn)行測(cè)試得到的結(jié)果非常令人驚訝。具體來(lái)說(shuō),我們采用Adam+L2正規(guī)化在30個(gè)epochs內(nèi)獲得的準(zhǔn)確率(這是SGD通過(guò)去1 cycle policy達(dá)到94%準(zhǔn)確度所需要的必要時(shí)間)的平均為93.96%,其中一半超過(guò)了94%。使用Adam + weight decay則達(dá)到94%和94.25%之間。為此,我們發(fā)現(xiàn)使用1 cycle policy時(shí),beta2的最佳值為0.99。我們將beta1參數(shù)視為SGD的動(dòng)量(意味著它隨著學(xué)習(xí)率的增長(zhǎng)從0.95變?yōu)?.85,然后當(dāng)學(xué)習(xí)率變低時(shí)再回到0.95)。
L2正則化或權(quán)重衰減的準(zhǔn)確性
更令人印象深刻的是,使用Test Time Augmentation(即對(duì)測(cè)試集上的一個(gè)圖像,取四個(gè)和他相同data-augmented版本的預(yù)測(cè)的平均值作為最終預(yù)測(cè)結(jié)果),我們可以在18個(gè)epochs內(nèi)達(dá)到94%的準(zhǔn)確率(平均預(yù)測(cè)值為93.98%) )!通過(guò)簡(jiǎn)單的Adam和L2正規(guī),超過(guò)20個(gè)epochs時(shí),達(dá)到94%。
在這些比較中要考慮的一件事是,改變我們正則的方式會(huì)改變weight decay或?qū)W習(xí)率的最佳值。在我們進(jìn)行的測(cè)試中,L2正則化的最佳學(xué)習(xí)率是1e-6(最大學(xué)習(xí)率為1e-3),而0.3是weight decay的最佳值(學(xué)習(xí)率為3e-3)。在我們的所有測(cè)試中,數(shù)量級(jí)的差異非常一致,主要原因是,L2正則于梯度的平均范數(shù)(相當(dāng)小)相除后,變得非常有效,且Adam使用的學(xué)習(xí)速率非常小(因此,weight decay的更新需要更強(qiáng)的系數(shù))。
那么,**使用Adam時(shí),權(quán)重衰減總是比L2正規(guī)化更好嗎?**我們還沒(méi)有發(fā)現(xiàn)一個(gè)明顯更糟的情況,但對(duì)于遷移學(xué)習(xí)問(wèn)題或RNN而言(例如在Stanford cars數(shù)據(jù)集上對(duì)Resnet50進(jìn)行微調(diào)),它沒(méi)有獲得更好的結(jié)果。
2 Amsgrad
2.1 了解Amsgrad
最近 Sashank J. Reddi,Satyen Kale和Sanjiv Kumar 在ICLR-2018的最佳論文《On the Convergence of Adam and Beyond》了中提出了Amsgrad。通過(guò)分析Adam optimizer的收斂證明,他們發(fā)現(xiàn)更新規(guī)則中的存在錯(cuò)誤,且可能導(dǎo)致算法收斂到sub-optimal point。他們?cè)O(shè)計(jì)了理論實(shí)驗(yàn),展示了Adam失敗的場(chǎng)景,并提出了一個(gè)簡(jiǎn)單的解決方案。
為了理解錯(cuò)誤和修復(fù),讓我們先看看Adam的更新公式:
avg_grads = beta1 * avg_grads + (1-beta1) * w.grad
avg_squared = beta2 * (avg_squared) +
(1-beta2) * (w.grad ** 2)
w = w - lr * avg_grads / sqrt(avg_squ
ared)
我們剛剛忽略了bias項(xiàng)(對(duì)訓(xùn)練開(kāi)始時(shí)很有用),專注于重點(diǎn)。作者發(fā)現(xiàn)的Adam的proof中的存在的錯(cuò)誤是它需要值(quantity)
lr / sqrt(avg_squared)
…這是我們?cè)谄骄荻确较蛏喜扇〉膕tep,隨著訓(xùn)練過(guò)程減少。由于學(xué)習(xí)率通常是恒定的或降低的(除了像我們這樣,試圖獲得超收斂的瘋狂的人),作者提出的修正是通過(guò)添加另一個(gè)變量來(lái)跟蹤他們的最大值來(lái)強(qiáng)制avg_squared值增加。
2.2 實(shí)現(xiàn)Amsgrad
相關(guān)文章獲得了ICLR 2018的最佳論文獎(jiǎng),并非常受歡迎,以至于它已經(jīng)在兩個(gè)主要的深度學(xué)習(xí)庫(kù)都實(shí)現(xiàn)了,pytorch和Keras。除了使用Amsgrad = True打開(kāi)選項(xiàng)外,幾乎沒(méi)有什么可做的。
這將上一節(jié)中的權(quán)重更新代碼更改為以下內(nèi)容:
avg_grads = beta1 * avg_grads + (1-beta1) * w.grad
avg_squared = beta2 * (avg_squared) +
(1-beta2) * (w.grad ** 2)
max_squared = max(avg_squared,
max_squared)
w = w - lr * avg_grads / sqrt(max_squ
ared)
2.3 Amsgrad實(shí)驗(yàn)的結(jié)果:除了很多噪音意外什么也沒(méi)有
事實(shí)證明,Amsgrad結(jié)果令人失望。在我們的實(shí)驗(yàn)中,沒(méi)有一個(gè)實(shí)驗(yàn)證明它是有點(diǎn)幫助的,即使確實(shí)Amsgrad發(fā)現(xiàn)的最小值有時(shí)略低于(在損失方面)Adam達(dá)到的指標(biāo)(精度,f1得分) …)最終結(jié)果總是惡化(參見(jiàn)我們的introduction,或更多的例子:https://fdlm.github.io/post/amsgrad/)
Adam optimizer在深度學(xué)習(xí)中的收斂性證明(proof of convergence)(因?yàn)樗轻槍?duì)凸問(wèn)題的)以及它們?cè)谄渲邪l(fā)現(xiàn)的錯(cuò)誤對(duì)于與現(xiàn)實(shí)生活中的實(shí)際問(wèn)題無(wú)關(guān)的合成實(shí)驗(yàn)來(lái)說(shuō)是至關(guān)重要的。實(shí)際測(cè)試表明,當(dāng)avg_squared gradients想要減少時(shí),最好的結(jié)果是這樣做。
這表明,即使關(guān)注理論可以獲得一些新想法,但它也不能取代實(shí)驗(yàn)(以及很多實(shí)驗(yàn)!)來(lái)確保這些想法能真正幫助從業(yè)者訓(xùn)練出更好的模型。
附錄:完整結(jié)果
從頭開(kāi)始訓(xùn)練CIFAR10(模型是一個(gè)比較寬的resnet 22,最終的結(jié)果是五個(gè)測(cè)試集上測(cè)平均錯(cuò)誤率):
在Stanford Cars數(shù)據(jù)集上,對(duì)Resnet50進(jìn)行微調(diào)(前20個(gè)epochs不改變學(xué)習(xí)率,后40個(gè)epochs采用不同的學(xué)習(xí)率學(xué)習(xí)):
使用github repo中的超參數(shù)訓(xùn)練AWD LSTM (結(jié)果顯示驗(yàn)證/測(cè)試集的perplexity,有或沒(méi)有緩存指針(cache pointer)):
QRNN相同,不采用LSTM:
對(duì)于這項(xiàng)特定任務(wù),我們使用了1cycle policy的修改版本,更快地增加學(xué)習(xí)速率,然后在再次下降之前具有更長(zhǎng)時(shí)間的高恒定學(xué)習(xí)速率。
Adam和其他optimizer之間的比較
https://github.com/sgugger/Adam-experime
nts提供了所有相關(guān)超參數(shù)的值以及用于得到這些結(jié)果的代碼。
往期精彩內(nèi)容推薦
COLING 2018-最新論文最全分類-整理分享
AI教父-深度學(xué)習(xí)之父-Geffery Hinton個(gè)人簡(jiǎn)介
(精品干貨)ACL 2018最新論文歸類(最全最細(xì))分享
朋友,千萬(wàn)不能錯(cuò)過(guò)!13個(gè)自然語(yǔ)言處理的深度學(xué)習(xí)框架
最前沿的深度學(xué)習(xí)論文、架構(gòu)及資源分享
麻省理工學(xué)院(MIT)-2018年最新自動(dòng)駕駛視頻課程分享
精品推薦-2018年Google官方Tensorflow峰會(huì)視頻教程完整版分享
模型匯總24 - 深度學(xué)習(xí)中Attention Mechanism詳細(xì)介紹:原理、分類及應(yīng)用
深度學(xué)習(xí)中如何選擇一款合適的GPU卡的一些經(jīng)驗(yàn)和建議分享
TensorFlow Dev Summit 2018視頻分享
《模型匯總-20》深度學(xué)習(xí)背后的秘密:初學(xué)者指南-深度學(xué)習(xí)激活函數(shù)大全
總結(jié)
以上是生活随笔為你收集整理的一文告诉你Adam、AdamW、Amsgrad区别和联系 重点的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 神经网络为什么需要多次epoch
- 下一篇: pytorch 动态调整学习率 重点