0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

目前訓練神經(jīng)網(wǎng)絡最快的方式一種新型AdamW算法

MqC7_CAAI_1981 ? 來源:未知 ? 作者:李倩 ? 2018-07-05 16:45 ? 次閱讀

最優(yōu)化方法一直是機器學習中非常重要的部分,也是學習過程的核心算法。而 Adam 自 14 年提出以來就受到廣泛關注,目前該論文的引用量已經(jīng)達到了 10047。不過自去年以來,很多研究者發(fā)現(xiàn) Adam 優(yōu)化算法的收斂性得不到保證,ICLR 2017 的最佳論文也重點關注它的收斂性。在本文中,作者發(fā)現(xiàn)大多數(shù)深度學習庫的 Adam 實現(xiàn)都有一些問題,并在 fastai 庫中實現(xiàn)了一種新型 AdamW 算法。根據(jù)一些實驗,作者表示該算法是目前訓練神經(jīng)網(wǎng)絡最快的方式。

Adam 過山車

Adam 優(yōu)化器之旅可以說是過山車(roller-coaster)式的。該優(yōu)化器于 2014 年推出,本質(zhì)上是一個出于直覺的簡單想法:既然我們明確地知道某些參數(shù)需要移動得更快、更遠,那么為什么每個參數(shù)還要遵循相同的學習率?因為最近梯度的平方告訴我們每一個權重可以得到多少信號,所以我們可以除以這個,以確保即使是最遲鈍的權重也有機會發(fā)光。Adam 接受了這個想法,在過程中加入了標準方法,就這樣產(chǎn)生了 Adam 優(yōu)化器(稍加調(diào)整以避免早期批次出現(xiàn)偏差)!

首次發(fā)表之時,深度學習社區(qū)都為來自原論文的一些圖表(如下圖)興奮不已:

Adam 和其他優(yōu)化器的對比

訓練速度提高 200%!「總體來看,我們發(fā)現(xiàn) Adam 非常魯棒,而且廣泛適用于機器學習領域的各種非凸優(yōu)化問題」論文結(jié)尾這樣寫道。那是三年前,深度學習的黃金時期。然而,事情并沒有按照我們期望的方向發(fā)展。使用 Adam 訓練模型的研究文章少之又少,新的研究開始明顯地抑制了它的應用,并在幾個實驗中表明,SGD+momentum可能比復雜的 Adam 表現(xiàn)更好。2018 fast.ai 課程開課之際,可憐的 Adam 被從早期課程中刪除。

但是到了 2017 年末,Adam 似乎又重獲新生。Ilya Loshchilov 和 Frank Hutter 在他們的論文《Fixing Weight Decay Regularization in Adam》中指出,每個庫在 Adam 上實施的權重衰減似乎都是錯誤的,并提出了一種簡單的方法(他們稱之為 AdamW)來修復它。盡管結(jié)果略有不同,但他們確實給出了一些類似下圖的令人鼓舞的圖表:

Adam 和 AdamW 對比

我們希望人們恢復對 Adam 的熱情,因為該優(yōu)化器的一些早期結(jié)果似乎可以復現(xiàn)。但事與愿違。實際上,應用它的唯一一個深度學習框架就是使用 Sylvain 編碼的 fastai。由于缺乏可用的廣泛框架,日常實踐者就只能固守又舊又不好用的 Adam。

但這不是唯一的問題。前面還有很多阻礙。兩篇論文指出了 Adam 在收斂性證明方面的明顯問題,盡管其中一篇提出了名為 AMSGrad 的修正(并在享有盛譽的 ICLR 大會上贏得了「最佳論文」獎)。但是,如果說我們從這種最戲劇化的生活(至少按照優(yōu)化器的標準來說是戲劇化的)簡史中學到了什么,那就是,沒有什么是它表面看起來的樣子。的確,博士生 Jeremy Bernstein 指出,所謂的收斂問題其實只是選擇不當?shù)某瑓?shù)的跡象,也許 AMSGrad 也解決不了問題。另一名博士生 Filip Korzeniowski 展示了一些早期成果,似乎支持了 AMSGrad 這種令人沮喪的觀點。

啟動過山車

那么我們這些只希望快速訓練精確模型的人該做些什么呢?我們選擇用數(shù)百年來解決科學辯論的方式——科學實驗——來解決這一爭議!稍后將呈現(xiàn)所有細節(jié),但首先讓我們來看一下大致結(jié)果:

適當調(diào)參之后,Adam 真的可以用!我們在以下幾個任務中得到了訓練時間方面的最新結(jié)果:

在含有測試時間增加的僅僅 18 個 epoch 或 30 個 epoch 上訓練 CIFAR10,直到其準確率超過 94%,如 DAWNBench 競賽;

對 Resnet50 進行調(diào)參,直至其在斯坦福汽車數(shù)據(jù)集上的準確率達到 90%,只需訓練 60 個 epoch(之前達到相同的準確率需要 600 個 epoch);

從零開始訓練一個 AWD LSTM or QRNN,歷經(jīng) 90 個 epoch(或在一個 GPU 上訓練 1 個半小時),其困惑度在 Wikitext-2 上達到當前最優(yōu)水平(之前的 LSTM 需要 750 個 epoch,QRNN 需要 500 個 epoch)。

這意味著我們已經(jīng)看到使用 Adam 的超收斂!超收斂是訓練學習率高的神經(jīng)網(wǎng)絡時出現(xiàn)的一種現(xiàn)象,它表示節(jié)省了一半訓練過程。在 AdamW 之前,訓練 CIFAR10 至 94 % 的準確率需要大約 100 個 epoch。

與之前的工作相比,我們發(fā)現(xiàn)只要調(diào)整得當,Adam 在我們嘗試過的每一個 CNN 圖像問題上都可以獲得與 SGD+Momentum 一樣好的準確率,而且?guī)缀蹩偸强煲稽c。

關于 AMSGrad 是一個糟糕的「解決方案」的建議是正確的。我們一直發(fā)現(xiàn),AMSGrad 在準確率(或其他相關指標)上沒有獲得比普通 Adam / AdamW 更高的增益。

當你聽到人們說 Adam 的泛化性能不如 SGD+Momentum 時,你基本上總會發(fā)現(xiàn)他們?yōu)樽约旱哪P退x擇的超參數(shù)不咋地。通常 Adam 需要的正則化比 SGD 多,因此在從 SGD 轉(zhuǎn)向 Adam 時,確保調(diào)整正則化超參數(shù)。

文章結(jié)構:

1. AdamW

理解 AdamW

實現(xiàn) AdamW

AdamW 實驗和 AdamW-ish

2. AMSGrad

理解 AMSGrad

實現(xiàn) AMSGrad

AMSGrad 實驗的結(jié)果

3. 完整結(jié)果圖表

AdamW

理解 AdanW:權重衰減與 L2 正則化

L2 正則化是減少過擬合的經(jīng)典方法,它會向損失函數(shù)添加由模型所有權重的平方和組成的懲罰項,并乘上特定的超參數(shù)以控制懲罰力度。以下本文所有的方程式都是用 Python、NumPy 和 PyTorch 風格的表達方式:

final_loss=loss+wd*all_weights.pow(2).sum()/2

其中 wd 為我們設置的超參數(shù),用以控制懲罰力度。這也可以稱為權重衰減,因為每一次運用原版 SGD 時,它都等價于使用如下方程式更新權重:

w=w-lr*w.grad-lr*wd*w

其中 lr 表示學習率、w.grad 表示損失函數(shù)對 w 的導數(shù),而后面的 wd * w 則表示懲罰項對 w 的求導結(jié)果。在這個等式中,我們會看到每一次更新都會減去一小部分權重,這也就是「衰減」的來源。

fast.ai 查看過的所有庫都使用第一種形式。在實踐中,幾乎都是通過向梯度 wd*w 而實現(xiàn)算法,而不是真正地改變損失函數(shù)。因為我們并不希望增加額外的計算量來修正損失,尤其是還有其它簡單方法的時候。

既然它們是同一種表達,那么我們?yōu)槭裁葱枰獏^(qū)分這兩種概念呢?原因在于它們只對于原版 SGD 是等價的,而當我們添加動量或使用如 Adam 那樣復雜的最優(yōu)化方法,L2 正則化(第一個方程)和權重衰減(第二個方程)就會存在很大的不同。在本文其余的部分中,我們討論權重衰減指的都是第二個方程式,而討論 L2 正則化都是討論第一個經(jīng)典方式。

如下在帶動量的 SGD 中,L2 正則化與權重衰減是不等價的。L2 正則化會將 wd*w 添加到梯度中,但現(xiàn)在權重并不是直接減去梯度。首先我們需要計算移動均值:

moving_avg=alpha*moving_avg+(1-alpha)*(w.grad+wd*w)

然后權重才能通過減去乘上了學習率的移動均值而得到更新。所以 w 更新中涉及到的正則化為 lr* (1-alpha)*wd * w 加上已經(jīng)在 moving_avg 中前面權重的組合。

因此,權重衰減的更新方式可以表示為:

moving_avg=alpha*moving_avg+(1-alpha)*w.gradw=w-lr*moving_avg-lr*wd*w

我們可以觀察到,從 w 中減去有關正則化的部分在兩種方法中是不同的。當我們使用 Adam 優(yōu)化器時,權重衰減的部分可能相差更大。因為 Adam 中的 L2 正則化需要添加 wd*w 到梯度中,并分別計算梯度及其平方的移動均值,然后再能更新權重。然而權重衰減方法只是簡單地更新權重,并每次從權重中減去一點。

顯然這是兩種不同的方法,在進行了實驗后,Ilya Loshchilov 和 Frank Hutter 建議我們應該在 Adam 算法中使用權重衰減方法,而不是像經(jīng)典深度學習庫中實現(xiàn)的 L2 正則化。

實現(xiàn) AdamW

那么我們要如何才能實現(xiàn) AdamW 算法呢?如果你們在使用 fastai 的庫,那么在使用 fit 函數(shù)時添加參數(shù) use_wd_sched=True 就能簡單地實現(xiàn):

learn.fit(lr,1,wds=1e-4,use_wd_sched=True)

如果你更喜歡新的訓練 API,你就能在每一個訓練階段中使用參數(shù) wd_loss=False:

phases=[TrainingPhase(1,optim.Adam,lr,wds=1-e4,wd_loss=False)]learn.fit_opt_sched(phases)

以下簡要地概述了 fastai 是如何實現(xiàn) AdamW 的。在優(yōu)化器中的階梯函數(shù),我們只需要使用梯度修正參數(shù),根本不使用參數(shù)本身的值(除了權重衰減,我們將在外部處理它)。然后我們可以在最優(yōu)化器之前通簡單的實現(xiàn)權重衰減,但這仍需要在計算梯度后才能完成,否則它就會影響梯度的值。所以在訓練循環(huán)中,我們必須確定計算權重衰減的位置。

loss.backward()#Dotheweightdecayhere!optimizer.step()

當然,最優(yōu)化器應該設定 wd=0,否則它還會做一些 L2 正則化,這也是我們不希望看到的?,F(xiàn)在在權重衰減的位置中,我們可以在所有參數(shù)上寫一個循環(huán)語句,并依次采用權重衰減的更新。而我們的參數(shù)應該存儲在優(yōu)化器的字典 param_groups 中,所以這個循環(huán)應該表示為如下語句:

loss.backward()forgroupinoptimizer.param_groups():forparamingroup['params']:param.data=param.data.add(-wd*group['lr'],param.data)optimizer.step()

AdamW 實驗的結(jié)果:它真的能行嗎?

我們首先在計算機視覺問題上進行測試,效果非常好。具體來說,Adam 和 L2 正則化在 30 個 epoch 中獲得的平均準確率為 93.96%,在兩次中有一次超過 94%。我們選擇 30 個 epoch 是因為通過 1cycle 策略和 SGD 可以獲得 94% 準確率。當我們使用 Adam 與權重衰減方法,我們持續(xù)獲得 94% 到 94.25% 的準確率。為此,我們發(fā)現(xiàn)使用 1cycle 策略時的最優(yōu) beta2 值為 0.99。我們將 beta1 參數(shù)視為 SGD 中的動量,這也就意味著它學習率的增長由 0.95 降低到 0.85,然后隨學習率的降低而又增加到 0.95。

L2 正則化或權重衰減準確率

更令人印象深刻的是,使用測試時間增加(即在測試集的一個圖像和它四個增加數(shù)據(jù)的版本上取預測的平均值),我們可以在僅僅 18 個 epoch 內(nèi)達到 94 % 的準確率(平均 93.98 %)!通過簡單的 Adam 和 L2 正則化,每嘗試 20 次就會出現(xiàn)一次超過 94 % 的情況。

在這些比較中需要考慮的一點是,改變正則化方式會改變權重衰減或?qū)W習率的最佳值。在我們進行的測試中,L2 正則化的最佳學習率為 1e-6(最大學習率為 1e-3),而權重衰減的最佳值為 0.3(學習率為 3e-3)。在我們的所有測試中,數(shù)量級的差異都是非常一致的,主要是因為 L2 正則化被梯度的平均范數(shù)(相當?shù)停┯行У貏澐?,并?Adam 的學習率相當?。ㄋ詸嘀厮p的更新需要更強的系數(shù))。

那么,權重衰減總是比 Adam 的 L2 正則化更好?我們還沒有發(fā)現(xiàn)明顯更糟的情況,但無論是遷移學習問題(例如斯坦福汽車數(shù)據(jù)集上 Resnet50 的微調(diào))還是 RNNs,它都沒有給出更好的結(jié)果。

AMSGrad

理解 AMSGrad

AMSGrad 是由 Sashank J. Reddi、Satyen Kale 和 Sanjiv Kumar 在近期的一篇文章中介紹的。通過分析 Adam 優(yōu)化器收斂的證明,他們在更新規(guī)則中發(fā)現(xiàn)了一個錯誤,該錯誤可能導致算法收斂到次優(yōu)點。他們設計了理論實驗,展示 Adam 失敗的情形,并提出了一個簡單的解決方案。機器之心也曾從適應性學習率算法出發(fā)分析過這一篇最佳論文:Beyond Adam。

為了更好地理解錯誤和解決方案,讓我們來看一下 Adam 的更新規(guī)則:

avg_grads=beta1*avg_grads+(1-beta1)*w.gradavg_squared=beta2*(avg_squared)+(1-beta2)*(w.grad**2)w=w-lr*avg_grads/sqrt(avg_squared)

我們剛剛跳過了偏差校正(對訓練的開始很有用),把重心放在了主要點上。作者發(fā)現(xiàn) Adam 收斂證明中的錯誤之處在于:

lr/sqrt(avg_squared)

這是我們朝著平均梯度方向邁出的一步,在訓練中逐漸減少。由于學習率常常是恒定或遞減的,作者提出的解決方案是通過添加另一個變量來跟蹤它們的最大值,從而迫使 avg _ square 量增加。

實現(xiàn) AMSGrad

相關文章在 ICLR 2018 中獲得了一項大獎并廣受歡迎,而且它已經(jīng)在兩個主要的深度學習庫——PyTorch 和 Keras 中實現(xiàn)。所以,我們只需傳入?yún)?shù) amsgrad = True 即可。

avg_grads=beta1*avg_grads+(1-beta1)*w.gradavg_squared=beta2*(avg_squared)+(1-beta2)*(w.grad**2)max_squared=max(avg_squared,max_squared)w=w-lr*avg_grads/sqrt(max_squared)

AMSGrad 實驗結(jié)果:大量噪音都是沒用的

AMSGrad 的結(jié)果令人非常失望。在所有實驗中,我們都發(fā)現(xiàn)它沒有絲毫幫助。即使 AMSGrad 發(fā)現(xiàn)的最小值有時比 Adam 達到的最小值稍低(在損失方面),其度量(準確率、f_1 分數(shù)…)最終總是更糟(詳見引言中的表格)。

Adam 優(yōu)化器在深度學習中收斂的證明(因為它針對凸問題)和他們在其中發(fā)現(xiàn)的錯誤對于與現(xiàn)實問題無關的合成實驗很重要。實際測試表明,當這些 avg _ square 梯度想要減小時,這么做能得到最好的結(jié)果。

這表明,即使把重點放在理論上有助于獲得一些新想法,也沒有什么可以取代實驗(而且很多實驗?。┮源_保這些想法實際上有助于從業(yè)人員訓練更好的模型。

附錄:所有結(jié)果

從零開始訓練 CIFAR10(模型是 Wide-ResNet-22,以下為五個模型的平均結(jié)果):

使用 fastai 庫引入的標準頭對斯坦福汽車數(shù)據(jù)集上的 Resnet 50 進行微調(diào)(解凍前對頭訓練 20 個 epoch,并用不同的學習率訓練 40 個 epoch):

使用來自 GitHub(https://github.com/salesforce/awd-lstm-lm)的超參數(shù)訓練 AWD LSTM(結(jié)果顯示在有或沒有緩存指針(cache pointer)情況下驗證/測試集的困惑度):

使用來自 GitHub repo 的超參數(shù)訓練 QRNN(結(jié)果顯示在有或沒有緩存指針情況下驗證/測試集的困惑度):

針對這一具體任務,我們采用了 1cycle 策略的修改版本,加快了學習速度,之后長時間保持較高的恒定學習速度,然后再往下降。

Adam 和其它優(yōu)化器之間的對比

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 神經(jīng)網(wǎng)絡

    關注

    42

    文章

    4772

    瀏覽量

    100845
  • 算法
    +關注

    關注

    23

    文章

    4615

    瀏覽量

    92992
  • 機器學習
    +關注

    關注

    66

    文章

    8422

    瀏覽量

    132724

原文標題:當前訓練神經(jīng)網(wǎng)絡最快的方式:AdamW優(yōu)化算法+超級收斂

文章出處:【微信號:CAAI-1981,微信公眾號:中國人工智能學會】歡迎添加關注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關推薦

    人工神經(jīng)網(wǎng)絡原理及下載

    人工神經(jīng)網(wǎng)絡是根據(jù)人的認識過程而開發(fā)出的一種算法。假如我們現(xiàn)在只有些輸入和相應的輸出,而對如何由輸入得到輸出的機理并不清楚,那么我們可以把輸入與輸出之間的未知過程看成是
    發(fā)表于 06-19 14:40

    粒子群優(yōu)化模糊神經(jīng)網(wǎng)絡在語音識別中的應用

    定的早熟收斂問題,引入一種自適應動態(tài)改變慣性因子的PSO算法,使算法具有較強的全局搜索能力.將此算法
    發(fā)表于 05-06 09:05

    【案例分享】ART神經(jīng)網(wǎng)絡與SOM神經(jīng)網(wǎng)絡

    一種常用的無監(jiān)督學習策略,在使用改策略時,網(wǎng)絡的輸出神經(jīng)元相互競爭,每時刻只有個競爭獲勝的神經(jīng)
    發(fā)表于 07-21 04:30

    分享一種400×25×2的三層BP神經(jīng)網(wǎng)絡

    本文首先簡單的選取了少量的樣本并進行樣本歸化,這樣就得到了可供訓練訓練集和測試集。然后訓練了400×25×2的三層BP神經(jīng)網(wǎng)絡,最后對最
    發(fā)表于 07-12 06:49

    隱藏技術: 一種基于前沿神經(jīng)網(wǎng)絡理論的新型人工智能處理器

    隱藏技術: 一種基于前沿神經(jīng)網(wǎng)絡理論的新型人工智能處理器 Copy東京理工大學的研究人員開發(fā)了一種名為“ Hiddenite”的新型加速器芯
    發(fā)表于 03-17 19:15

    一種基于高效采樣算法的時序圖神經(jīng)網(wǎng)絡系統(tǒng)介紹

    成為了非常重要的問題。 基于以上問題,本文提出了一種基于高效采樣算法的時序圖神經(jīng)網(wǎng)絡系統(tǒng) 。首先我們介紹用于時序圖神經(jīng)網(wǎng)絡采樣的高效采樣方法。采樣常常被用于深度學習中以降低模型的
    發(fā)表于 09-28 10:34

    如何進行高效的時序圖神經(jīng)網(wǎng)絡訓練

    現(xiàn)有的圖數(shù)據(jù)規(guī)模極大,導致時序圖神經(jīng)網(wǎng)絡訓練需要格外長的時間,因此使用多GPU進行訓練變得成為尤為重要,如何有效地將多GPU用于時序圖神經(jīng)網(wǎng)絡訓練
    發(fā)表于 09-28 10:37

    一種BP神經(jīng)網(wǎng)絡改進算法的研究及應用

    本文首先介紹了傳統(tǒng)的神經(jīng)網(wǎng)絡BP 算法的優(yōu)缺點,并結(jié)合模擬退火算法局部搜索全局的特點,提出將模擬退火算法和傳統(tǒng)的BP 算法相結(jié)合,形成
    發(fā)表于 01-09 11:57 ?12次下載

    基于動態(tài)神經(jīng)網(wǎng)絡的交通事件檢測算法

    本文將一種新型的動態(tài) 神經(jīng)網(wǎng)絡 結(jié)構與傳統(tǒng)的基于狀態(tài)估計的故障檢測方法相結(jié)合, 提出了一種基于動態(tài)神經(jīng)網(wǎng)絡的交通事件檢測
    發(fā)表于 07-26 15:36 ?26次下載
    基于動態(tài)<b class='flag-5'>神經(jīng)網(wǎng)絡</b>的交通事件檢測<b class='flag-5'>算法</b>

    訓練神經(jīng)網(wǎng)絡的五大算法

    神經(jīng)網(wǎng)絡模型的每類學習過程通常被歸納為一種訓練算法。訓練
    發(fā)表于 11-16 15:30 ?1.3w次閱讀

    一種新型神經(jīng)網(wǎng)絡結(jié)構:膠囊網(wǎng)絡

    膠囊網(wǎng)絡是 Geoffrey Hinton 提出的一種新型神經(jīng)網(wǎng)絡結(jié)構,為了解決卷積神經(jīng)網(wǎng)絡(ConvNets)的
    的頭像 發(fā)表于 02-02 09:25 ?5883次閱讀

    神經(jīng)網(wǎng)絡反向傳播算法原理是什么

    神經(jīng)網(wǎng)絡反向傳播算法(Backpropagation Algorithm)是一種用于訓練多層前饋神經(jīng)網(wǎng)絡的監(jiān)督學習
    的頭像 發(fā)表于 07-02 14:16 ?668次閱讀

    BP神經(jīng)網(wǎng)絡算法的基本流程包括

    BP神經(jīng)網(wǎng)絡算法,即反向傳播(Backpropagation)神經(jīng)網(wǎng)絡算法,是一種多層前饋神經(jīng)網(wǎng)絡
    的頭像 發(fā)表于 07-03 09:52 ?514次閱讀

    神經(jīng)網(wǎng)絡如何用無監(jiān)督算法訓練

    神經(jīng)網(wǎng)絡作為深度學習的重要組成部分,其訓練方式多樣,其中無監(jiān)督學習是一種重要的訓練策略。無監(jiān)督學習旨在從未標記的數(shù)據(jù)中發(fā)現(xiàn)數(shù)據(jù)內(nèi)在的結(jié)構、模
    的頭像 發(fā)表于 07-09 18:06 ?826次閱讀

    怎么對神經(jīng)網(wǎng)絡重新訓練

    重新訓練神經(jīng)網(wǎng)絡個復雜的過程,涉及到多個步驟和考慮因素。 引言 神經(jīng)網(wǎng)絡一種強大的機器學習模型,廣泛應用于圖像識別、自然語言處理、語音
    的頭像 發(fā)表于 07-11 10:25 ?472次閱讀