adam相關的優化器

2021-09-14 00:28:15 字數 3468 閱讀 1356

adam 自出道以來,就一直是最流行的深度學習優化器,哪怕現在其實已經有幾種可能更好用的優化器……
如果將 adam 優化出現以來產生的關於優化過程的有趣想法按時間順序排列的話,結果如下:

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

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

lr range test:不再盲目找最佳學習率

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

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 技術來確定。這背後的原理是:最優學習率將在處於這個範圍內,所以如果學習率在這歌區間變化,大多數情況下你將得到乙個接近最優學習率的學習率。

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

sgdr:效能良好的舊版熱重啟 sgd

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

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

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

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

adamw 和 sgdw:錯誤的權值衰減

**《fixing weight decay regularization in adam》的作者曾說:

雖然我們初始版本的 adam 在「熱」啟動時效能比 adam 更好,但相比於熱啟動的 sgd 沒有什麼競爭力。
這篇**指出,所有流行的深度學習框架(tensorflow,pytorch)都在錯誤的權值衰減中實現了 adam。作者在**中提出了以下意見:

imagenet 上的前 5 個測試錯誤,來自原**

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

通過新的 adamw,作者證明了 adamw(重啟 adamwr)在速度和效能方面都與 sgdwr 相當。

更多細節請參考: 

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

一週期策略和超收斂

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

在一週期策略中,最大學習率被設定為 lr range test 中可以找到的最高值,最小學習率比最大學習率小幾個數量級。

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

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

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

在 imagenet 上訓練 inception-resnet-v2 時的超收斂

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

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

更多細節請參考:

結論

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

優化器 從SGD到 Adam

所有的優化器都是可以套進這個基本框架的。這裡的e指的是單位矩陣。sgd 沒有動量概念,因為一階動量就是當前梯度,二階梯度就是單位矩陣。缺點 容易陷入區域性最優。由於sgd只考慮當前時刻的梯度,在區域性最優點的當前梯度為0。由計算公式可知,此時引數不再進行更新,故陷入區域性最優的狀態。顯而易見,引入歷...

Pytorch中adam優化器的引數問題

之前用的adam優化器一直是這樣的 alpha optim torch.optim.adam model.alphas config.alpha lr,betas 0.5,0.999 weight decay config.alpha weight decay 沒有細想內部引數的問題,但是最近的工作...

梯度優化演算法Adam

最近讀乙個 發現用了乙個梯度更新方法,剛開始還以為是什麼奇奇怪怪的梯度下降法,最後分析一下是用一階梯度及其二次冪做的梯度更新。網上搜了一下,果然就是稱為adam的梯度更新演算法,全稱是 自適應矩估計 adaptive moment estimation 國際慣例,參考博文 一文看懂各種神經網路優化演...