自Adam之後,深度學習優化器還有什麼新進展嗎?

riogarfield


Adam 自出道以來,就一直是最流行的深度學習優化器,哪怕現在其實已經有幾種可能更好用的優化器……

如果將 Adam 優化出現以來產生的關於優化過程的有趣想法按時間順序排列的話,結果如下:

  • LR Range test + Cyclical LR(《Cyclical Learning Rates for Training Neural Networks》)

  • SGDR(《SGDR: Stochastic Gradient Descent with Warm Restarts》)

  • SGDW(R) and AdamW(R)(《Fixing Weight Decay Regularization in Adam》)

  • 1-cycle policy and super-convergence(《Super-Convergence: Very Fast Training of Neural Networks Using Large Learning Rates》)

這個來自 Andrej Karpathy 的笑話或多或少是我深度學習項目的一套流程。除非把具有學習率硬編碼的代碼直接從 GitHub 裡複製到所選優化器中,否則我可能只會把 3e-4 放到 Adam 優化器中,然後讓模型訓練。如果損失減少,今天就可以收工大吉。

但是,那些美好的日子已經一去不復返了。所以在這篇博客中,我將概述一些人們想出來推翻 Adam 的方法。

LR Range Test:不再盲目找最佳學習率

在這之前,如果 3e-4 在我的數據集上無法作用於模型,我會採取兩個辦法:

  • 如果看不到損失值移動的明確方向,我會降低學習率。

  • 如果在小數點後 5 或 6 位才能看到損失減少,我會提高學習率。

  • 如有必要,我會再重複上面的過程。

2015 年,Leslie N. Smith 將上述的反覆試驗法形式化為一種名為 LR Range Test 的技術。這個方法很簡單,你只需將模型和數據迭代幾次,把學習率初始值設置得比較小,然後在每次迭代後增加。你需要記錄學習率的每次損失並將它畫出。

LR Range Test 圖示。LR 的初始值僅為 1e-7,然後增加到 10。

LR Range Test 圖應該包括三個區域,第一個區域中學習率太小以至於損失幾乎沒有減少,第二個區域裡損失收斂很快,最後一個區域中學習率太大以至於損失開始發散。

除了確保你正在選擇最佳學習率之外,該技術還可以作為一種「保險」檢查。如果 LR Range Test 沒有顯示上述 3 個區域,或者圖中有斷層(損失中有 NaN 值),則表示模型中有缺陷或者數據中有錯誤。在運行模型之前,最好獲取一個理想的 LR range 圖。

不好的 LR Range 測試結果。斷層處也是損失具有 NaN 值的地方。

Cyclical LR :誰說 LR 需要下降

以往的常識是逐步降低學習率或使用指數函數,從而使模型收斂更穩定。

Leslie Smith 在同一篇論文中挑戰了這一觀點,他認為,與其單調地降低學習率,不如讓學習率在合理範圍內進行週期性變化,這樣實際上能以更少的步驟提高模型的準確率。

在 lr 和 max_lr 範圍內循環學習率。

lr 和 max_lr 的範圍可以通過上述的 LR Range test 技術來確定。這背後的原理是:最優學習率將在處於這個範圍內,所以如果學習率在這歌區間變化,大多數情況下你將得到一個接近最優學習率的學習率。

作者討論的另一個優點是能夠在損失情況下避開鞍點。鞍點位置的梯度較小,因此小的學習率使模型在訓練後期遍歷這些鞍點時會很慢。通過在後期提高學習率,可以幫助模型更有效地擺脫鞍點。

  • Keras:https://github.com/bckenstler/CLR

  • Pytorch:https://github.com/anandsaha/pytorch.cyclic.learning.rate/blob/master/cls.py

SGDR:性能良好的舊版熱重啟 SGD

原則上,SGDR 與 CLR 本質是非常相似的,即在訓練過程中學習率是不斷變化的。

可重啟和餘弦退火的 SGD。圖片來源:https://www.jeremyjordan.me/nn-learning-rate/

其中,主動退火策略(餘弦退火)與重啟計劃相結合。重啟是一個「熱」重啟,因為模型沒有像全新模型那樣重啟,而是在重新啟動學習率後,使用重啟前的參數作為模型的初始解決方案。這在實現中非常簡單,因為你不需要對模型執行任何操作,只需要即時更新學習率。

到目前為止,Adam 等自適應優化方法仍然是訓練深度神經網絡的最快方法。然而,各種基準測試的許多最優解決方案或在 Kaggle 中獲勝的解決方案仍然選用 SGD,因為他們認為,Adam 獲得的局部最小值會導致不良的泛化。

SGDR 將兩者結合在一起,迅速「熱」重啟到較大的學習率,然後利用積極的退火策略幫助模型與 Adam 一樣快速(甚至更快)學習,同時保留普通 SGD 的泛化能力。

  • Keras:https://gist.github.com/jeremyjordan/5a222e04bb78c242f5763ad40626c452

  • 關於 Pytorch 的 PR: https://github.com/pytorch/pytorch/pull/7821/files

AdamW 和 SGDW:錯誤的權值衰減

「熱」啟動策略非常好,並且在訓練期間改變學習率似乎是可行的。但為什麼上一篇論文沒有擴展到 AdamR 呢?

論文《Fixing Weight Decay Regularization in Adam》的作者曾說:

雖然我們初始版本的 Adam 在「熱」啟動時性能比 Adam 更好,但相比於熱啟動的 SGD 沒有什麼競爭力。

這篇論文指出,所有流行的深度學習框架(Tensorflow,Pytorch)都在錯誤的權值衰減中實現了 Adam。作者在論文中提出了以下意見:

  • L2 正則化和權值衰減不同。

  • L2 正則化在 Adam 中無效。

  • 權值衰減在 Adam 和 SGD 中同樣有效。

  • 在 SGD 中,再參數化可以使 L2 正則化和權值衰減等效。

  • 主流的庫將權值衰減作為 SGD 和 Adam 的 L2 正則化。

ImageNet 上的前 5 個測試錯誤,圖片來自原論文。

→他們提出了 AdamW 和 SGDW,這兩種方法可以將權值衰減和 L2 正則化的步驟分離開來。

通過新的 AdamW,作者證明了 AdamW(重啟 AdamWR)在速度和性能方面都與 SGDWR 相當。

更多細節請參考: https://www.fast.ai/2018/07/02/adam-weight-decay/

在 Pytorch 和 Keras 中有一些針對此修復的請求,所以你應該很快就可以直接從庫中使用這個。

一週期策略和超收斂

在 2018 年的近期工作中,LR Range test 和 CLR 的作者將自己的想法推向了極致,其中循環學習率策略僅包含 1 個週期,因此稱作「一週期」策略。

在一週期策略中,最大學習率被設置為 LR Range test 中可以找到的最高值,最小學習率比最大學習率小几個數量級。

整個週期(向上和向下)的長度被設置為略小於訓練週期的總數,這樣循環結束後有殘餘時間降低學習率,從而幫助模型穩定下來。

我們可以將這種策略看作是一種探索-開發的權衡,其中週期的前半部分更有可能從某一局部最優跳到另一局部最優,從而有望在最平坦、最廣泛的局部最優區域達到穩定。以較大的學習率開始循環的後半部分有助於模型更快地收斂到最優。

一週期策略本身就是一種正則化技術,因此需要對其它正則化方法進行調優才能與此策略配合使用。

在 Imagenet 上訓練 Inception-Resnet-v2 時的超收斂。

通過這一策略,作者演示了「超收斂」,它達到相同的驗證準確率只需要 1/5 的迭代。

這種現象特別值得注意,因為隨著可用的標記訓練數據受限,收斂效果會增加。

更多細節請參考:https://sgugger.github.io/the-1cycle-policy.html

結論

所以在 2018 年,你應該做什麼來代替 3e-4 Adam 工作流程呢?有很多東西需要考慮,如批量大小、動量等。但是,更好的工作流程將是:

  • 使用 LR Range Test 找到最佳學習率,並完整地檢查當前模型和數據。

  • 始終使用學習率調度器,該調度器會改變上一步中找到的學習率,可以是 CLR 或 Restart。

  • 如果需要 Adam,請使用具有適當權值衰減的 AdamW,而不是當前流行框架中使用的默認權值衰減。

  • 如果想實現超收斂,可以進一步嘗試一週期策略。


分享到:


相關文章: