作者:Less Wright
編譯:ronghuaiyang
導讀
給大家介紹一個新的深度學習優化器,Ranger,同時具備RAdam和LookAhead的優點,一行程式碼提升你的模型能力。
Ranger 優化器結合了兩個非常新的發展(RAdam + Lookahead)到一個單一的優化器中。為了證明它的有效性,我們的團隊最近使用 Ranger 優化器在 FastAI 全球排行榜上獲得了 12 個排行榜記錄。
Lookahead 是 Ranger 優化器的其中一半,是由著名的深度學習研究員 Geoffrey Hinton 在 2019 年 7 月的一篇新論文“LookAhead optimizer: k steps forward, 1 step back“中介紹的。LookAhead 的靈感來自於最近在理解神經網路損失曲面方面的進展,並提出了一種全新的穩定深度學習訓練和收斂速度的方法。基於 RAdam(Rectified Adam)在深度學習的方差管理方面取得的突破,我發現將 RAdam + LookAhead 組合在一起(Ranger)可以產生一個夢之隊,可以得到甚至比單獨的 RAdam 更好的優化器。
Ranger 優化器是一個易於使用和高效的單一程式碼庫(載入/儲存和一個迴圈處理的所有引數的更新),整合到了 FastAI 中,Ranger 的原始碼你可以直接拿來用:https://github.com/lessw2020/Ranger-Deep-Learning-Optimizer。
為什麼 RAdam 和 LookAhead 是互補的
可以說,RAdam 為優化器在開始訓練時提供了最好的基礎。RAdam 利用一個動態整流器來根據變化調整 Adam 的自適應動量,針對當前資料集,有效地提供了一個自動 warm-up,,以確保可以得到一個紮實的訓練開頭。
LookAhead 的靈感來自於最近對深度神經網路損失曲面的理解,併為在整個訓練過程中進行健壯和穩定的探索提供了突破。
引用 LookAhead 團隊的話說,LookAhead“減少了對大量超引數調優的需求”,同時“以最小的計算開銷在不同深度學習任務之間實現更快的收斂”。
因此,兩者都在深度學習優化的不同方面提供了突破,並且兩者的結合具有高度的協同性,可能為你的深度學習結果提供了兩種改進的最佳效果。因此,對更穩定和更健壯的優化方法的追求將繼續下去,通過結合兩個最新的突破(RAdam + LookAhead),Ranger 的整合有望為深度學習提供另一個進步。
Hinton 等人— “我們通過實驗證明,即使在 ImageNet、CIFAR-10/100、神經機器翻譯和 Penn Treebank 上使用預設超引數設定, LookAhead 也可以顯著提高 SGD 和 Adam 的效能。”
因此,本文在前面的 RAdam 介紹的基礎上,解釋了什麼是 LookAhead,以及如何將 RAdam 和 LookAhead 合併到一個單一的優化器 Ranger 中,從而獲得新的高精度。在我測試的前 20 個 epoch 中,我獲得了一個新的高準確率,比目前的 FastAI 排行榜高出 1%。
更重要的是,任何人都可以使用 Ranger,看看它有沒有提高你的深度學習結果的穩定性和準確性!
因此,讓我們深入研究驅動 Ranger 的兩個元件 — RAdam 和 LookAhead:
1、什麼是 RAdam (Rectified Adam):
我將你請參閱我的 前一篇文章,裡面有更多的 RAdam 細節,這裡有個簡短的總結,開發 RAdam 的研究人員調查了為什麼自適應動量優化器(Adam,RMSProp 等等),所有這些都需要 warmup,否則他們在訓練開始前就會陷入糟糕的/可疑的區域性最佳狀態。
原因是在開始訓練時,當優化器沒有看到足夠的資料來做出準確的自適應動量決策時,資料的方差就會出現非常大的情況。因此,Warmup 可以減少訓練開始時的方差……但即使是決定 Warmup 的程度,也需要根據資料集改變手動調整。
因此,Rectified Adam 是通過使用一個整流函式來確定一個“啟發式的 Warmup”,這個整流函式是基於實際遇到的方差來確定的。整流器動態的關閉和開啟自適應動量,這樣它就不會全速跳躍,直到資料的方差穩定下來。
通過這樣做,就避免了手動熱身的需要,並自動穩定了訓練。
一旦方差穩定下來,RAdam 基本上就變成了 Adam,甚至是 SGD。因此,RAdam 的貢獻是在訓練的開始。
讀者注意到,在結果部分,雖然 RAdam 超過了 Adam,但從長遠來看,SGD 最終可以趕上並超過 RAdam 和 Adam 的最終精度。
這就是我們現在要使用 LookAhead 的地方,整合一種新的探索機制,即使在 1000 個 epochs 之後也能超越 SGD。
2、 Lookahead — 用於探索損失超平面的小夥伴 =更快、更穩定的探索和收斂。
正如 Lookahead 的研究人員所指出的,目前,大多數成功的優化器都是在 SGD 的基礎上進行優化的
1 、自適應動量(Adam, AdaGrad)
2 、一種加速形式(Nesterov 動量或 Polyak Heavy Ball)
來完善探索和訓練過程,最終趨同。
然而,Lookahead 是一種新的發展,它維持兩組權重,然後在它們之間進行插值 — 實際上,它允許一組更快的權重“向前看”或探索,而較慢的權重留在後面,以提供更長期的穩定性。
結果減少了訓練過程中的方差,大大降低了對次優超引數的敏感性,並減少了對大量超引數調優的需要。這是在完成各種深度學習任務時實現更快的收斂。換句話說,這是一個令人印象深刻的突破。
通過簡單的類比,可以將 LookAhead 理解為以下內容。想象你在一個山頂,周圍有各種各樣的落差。其中一條通往成功的底部,而其他的只是倒黴的裂縫。
你自己獨自探索是困難的,因為你必須選一條路下去,並假設它是一個死衚衕,然後再找路出來。
但是,如果你有一個朋友,他呆在或接近頂部,如果你選的路是好的,就幫助你備份,這樣你可能會更好的找到最優的路徑,因為探索全地形會更快,困倒黴的裂縫的可能性會更小。
這就是 LookAhead 的基本功能。它保留一個額外的權值副本,然後讓內部化的“更快”優化器(對於 Ranger,即 RAdam)進行 5 或 6 個 batch 的搜尋。batch 間隔由 k 引數指定。
當 k 個 batch 的探索完成時,LookAhead 將它儲存的權值與 RAdam 的最新權值之間的差值乘以一個 alpha 引數(預設情況下為 0.5),r 然後更新 RAdam 的權值。
結果實際上是內部優化器(在本例中是 RAdam)的快速移動平均和通過 LookAhead 獲得的較慢的指數移動平均的綜合效應。速度快的人探索,而速度慢的人則充當拉回或穩定機制 — 通常在速度快的人探索時留在後面,但在某些情況下,當速度快的人繼續探索時,速度慢的人會把速度快的人推下一個更有希望的斜坡。
由於具有 LookAhead 的安全性,優化器可以更充分地探索前景,而不必擔心陷入困境。
這種方法與目前使用的兩種主要方法完全不同——自適應動量或“heavy ball”/Nesterov 型別動量。
因此,LookAhead 在探索和尋找“下降的方式”方面更勝一籌,因為它增強了訓練的穩定性,甚至超過了 SGD。
3、Ranger — 一個整合的程式碼庫,提供了把 RAdam 和 LookAhead 結合在一起的優化器
Lookahead 可以和任何優化器一起使用,作為“fast”權值,論文中使用的是 vanilla Adam,因為 RAdam 當時還不可用。
然而,為了便於程式碼整合,簡化用法,我合併了成一個單一的優化器,名為 Ranger。
我個人看到的ImageNette最高的20個epoch的分數 — 實際上是Ranger的第一次執行。(92%是目前的排行榜)。還要注意穩定的訓練進度。
4、現在就來用 Ranger 吧!
在 github 上有幾個 LookAhead 的實現,我從 LonePatient 的一個開始,因為我喜歡它簡潔的程式碼,然後在此基礎上構建。RAdam,當然來自官方的 RAdam github 程式碼庫。
使用步驟:
1 、 把 ranger.py 拷貝到你的資料夾中
2 、 import ranger:
3 、使用 FastAI 構建一個訓練準備使用 Ranger。
4 、開始測試!
LookAhead 引數:
k parameter :— 這個引數控制了在與 LookAhead 權值合併之前要執行多少個 batch,常見的預設值是 5 或者 6,論文中使用到了 20。
alpha = 這個引數控制了與 LookAhead 引數差異更新的百分比。Hinton 等人做了一個強有力的證明 0.5 可能是理想值,但值得做個簡短的實驗驗證一下。這篇論文提到的一個未來的想法可能是把 k 和或 alpha 放在一個基於訓練進展程度的時間表上。
總結
兩個獨立的研究團隊在實現快速、穩定的深度學習優化演算法的目標上取得了新的突破。我發現,通過結合這兩個,RAdam + LookAhead,產生了一個增強的優化器(Ranger),並在 ImageNette 驗證了執行 20 個 epoch 分數的新高。
需要進一步的測試來優化 LookAhead 的 k 引數和 RAdam 學習率 ,但 LookAhead 和 RAdam 都減少了在達到 state of the art 之前的手動超引數調優,應該可以幫助你得到最好的訓練結果。
英文原文: