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 本質是非常相似的,即在訓練過程中學習率是不斷變化的。
其中,主動退火策略(餘弦退火)與重啟計劃相結合。重啟是一個「熱」重啟,因為模型沒有像全新模型那樣重啟,而是在重新啟動學習率後,使用重啟前的引數作為模型的初始解決方案。這在實現中非常簡單,因為你不需要對模型執行任何操作,只需要即時更新學習率。
到目前為止,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,而不是當前流行框架中使用的預設權值衰減。
如果想實現超收斂,可以進一步嘗試一週期策略。
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 本質是非常相似的,即在訓練過程中學習率是不斷變化的。
其中,主動退火策略(餘弦退火)與重啟計劃相結合。重啟是一個「熱」重啟,因為模型沒有像全新模型那樣重啟,而是在重新啟動學習率後,使用重啟前的引數作為模型的初始解決方案。這在實現中非常簡單,因為你不需要對模型執行任何操作,只需要即時更新學習率。
到目前為止,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,而不是當前流行框架中使用的預設權值衰減。
如果想實現超收斂,可以進一步嘗試一週期策略。