作者:Philipp Wirth
編譯:ronghuaiyang
導讀
幾種流行的最佳化器的介紹以及優缺點分析,並給出了選擇最佳化器的幾點指南。
本文概述了計算機視覺、自然語言處理和機器學習中常用的最佳化器。此外,你會找到一個基於三個問題的指導方針,以幫助你的下一個機器學習專案選擇正確的最佳化器。
- 找一份相關的研究論文,開始使用相同的最佳化器。
- 參考 表1並將資料集的屬性與不同最佳化器的優缺點進行比較。
- 根據可用的資源調整你的選擇。
介紹
為你的機器學習專案選擇一個好的最佳化器是非常困難的。熱門的深度學習庫,如PyTorch或TensorFlow,提供了廣泛的最佳化器的選擇,不同的最佳化器,每個都有自己的優缺點。然而, 選擇錯誤的最佳化器可能會對你的機器學習模型的效能產生重大的負面影響,這使得最佳化器在構建、測試和部署機器學習模型的過程中成為一個關鍵的設計選擇。
根據最佳化器的不同,模型的效能可能會有很大的不同。
選擇最佳化器的問題在於,由於no-free-lunch定理,沒有一個單一的最佳化器可以在所有場景中超越其他的。事實上,最佳化器的效能高度依賴於設定。所以,中心問題是:
哪個最佳化器最適合我的專案的特點?
下面的內容給出了回答上述問題的一個指南。它由兩個主要段落組成:在第一部分,我將向你快速介紹最常用的最佳化器。在第二部分中,我將為你提供一個三步計劃來為你的專案選擇最好的最佳化器。
一些最常用的最佳化器
在深度學習中,幾乎所有流行的最佳化器都基於梯度下降。這意味著他們反覆估計給定的損失函式L的斜率,並將引數向相反的方向移動(因此向下爬升到一個 假設的全域性最小值)。這種最佳化器最簡單的例子可能是隨機梯度下降(或SGD),自20世紀50年代以來一直使用。在2010年代,自適應梯度的使用,如AdaGrad或Adam已經變得越來越流行了。然而,最近的趨勢表明,部分研究界重新使用SGD而不是自適應梯度方法。此外,當前深度學習的挑戰帶來了新的SGD變體,如LARS或LAMB。例如,谷歌研究在其最新論文中使用LARS訓練了一個強大的自監督模型。
下面的部分將介紹最流行的最佳化器。如果你已經熟悉了這些概念,請轉到“如何選擇正確的最佳化器”部分。
我們將使用以下符號:用 w表示引數,用 g表示模型的梯度, α為每個最佳化器的全域性學習率, t為時間步長。
Stochastic Gradient Descent (SGD)
在SGD中,最佳化器基於一個小batch估計最陡下降的方向,並在這個方向前進一步。由於步長是固定的,SGD會很快陷入平坦區或陷入區域性極小值。
SGD with Momentum
其中β < 1,使用了動量,SGD可以在持續的方向上進行加速(這就是為什麼也被叫做“重球方法”)。這個加速可以幫助模型擺脫平坦區,使它更不容易陷入區域性最小值。
AdaGrad
AdaGrad是首個成功的利用自適應學習率的方法之一(因此得名)。AdaGrad根據梯度的平方和的倒數的平方根來衡量每個引數的學習速率。這個過程將稀疏梯度方向上的梯度放大,從而允許在這些方向上執行更大的步驟。其結果是:AdaGrad在具有稀疏特徵的場景中收斂速度更快。
RMSprop
RMSprop是一個未釋出的最佳化器,在過去幾年中被過度使用。這個想法與AdaGrad相似,但是梯度的重新縮放不那麼激進:梯度的平方的總和被梯度平方的移動平均值所取代。RMSprop通常與動量一起使用,可以理解為Rprop對mini-batch設定的適應。
Adam
Adam將AdaGrad,RMSprop和動量法結合在一起。步長方向由梯度的移動平均值決定,步長約為全域性步長的上界。此外,梯度的每個維度都被重新縮放,類似於RMSprop。Adam和RMSprop(或AdaGrad)之間的一個關鍵區別是,矩估計 m和 v被糾正為偏向於零。Adam以透過少量的超引數調優就能獲得良好效能而聞名。
LARS
LARS是使用動量的SGD的一種擴充套件,具有適應每層學習率的能力。它最近引起了研究界的注意。原因是由於可用資料量的穩步增長,機器學習模型的分散式訓練已經流行起來。其結果是批大小開始增長。然而,這導致了訓練中的不穩定。Yang等人認為,這些不穩定性源於某些層的梯度範數和權重範數之間的不平衡。因此,他們提出了一個最佳化器,該最佳化器基於一個“trust”引數η < 1和該層的梯度的範數的倒數,對每一層的學習率進行縮放。
如何選擇正確的最佳化器?
如上所述,為你的機器學習問題選擇正確的最佳化器是困難的。更具體地說,沒有一勞永逸的解決方案,必須根據手頭的特定問題仔細選擇最佳化器。在下一節中,我將提出在決定使用某個最佳化器之前應該問自己的三個問題。
與你的資料集和任務類似的state-of-the-art的結果是什麼?使用過了哪些最佳化器,為什麼?
如果你正在使用新的機器學習方法,可能會有一篇或多篇涵蓋類似問題或處理類似資料的可靠論文。通常,論文的作者已經做了廣泛的交叉驗證,並且只報告了最成功的配置。試著理解他們選擇最佳化器的原因。
舉例: 假設你想訓練生成對抗性網路(GAN)來對一組影像執行超解析度。在一些研究之後,你偶然發現了一篇論文:”Photo-Realistic Single Image Super-Resolution Using a Generative Adversarial Network,” ,其中研究人員使用Adam最佳化器來解決完全相同的問題。Wilson等人認為,訓練GANs並不等於解決最最佳化問題,Adam可能非常適合這樣的場景。因此,在這種情況下,Adam是最佳化器的一個很好的選擇。
你的資料集是否具有某些最佳化器的優勢?如果有,是哪些,如何利用這些優勢?
表1顯示了不同最佳化器及其優缺點的概述。嘗試找到與資料集的特徵、訓練設定和目標相匹配的最佳化器。
某些最佳化器在具有稀疏特徵的資料上表現得非常好,而另一些最佳化器在將模型應用於之前未見過的資料時可能表現得更好。一些最佳化器在大batch中工作得很好,而另一些最佳化器可以收斂到很陡峭的極小值但是泛化效果不好。
表1:流行的最佳化器的總結,突出它們的優點和缺點。state memory列表示最佳化器所需的位元組數 —— 除了梯度所需的記憶體之外。其中,n為機器學習模型的引數個數。例如,沒有動量的SGD只需要記憶體來儲存梯度,而有動量的SGD也需要儲存梯度的移動平均值。
例子:對於你當前工作的專案,你必須將使用者反饋分為積極反饋和消極反饋。你考慮使用bag-of-words作為機器學習模型的輸入特徵。由於這些特徵可能非常稀疏,你決定使用自適應梯度的方法。但是你想用哪一種呢?考慮 表1,你看到看到AdaGrad具有自適應梯度方法中最少的可調引數。看到你的專案有限的時間表,你選擇了AdaGrad作為最佳化器。
你的專案所具有資源是什麼?
專案中可用的資源也會影響選擇哪個最佳化器。計算限制或記憶體約束,以及專案的時間表可以縮小可行選擇的範圍。再次檢視 表1,你可以看到不同的記憶體需求和每個最佳化器的可調引數數量。此資訊可以幫助你評估你的設定是否支援最佳化器所需的資源。
例子:你在做一個專案,在該專案中,你想在家用計算機上的影像資料集上訓練一個自監督模型(例如SimCLR)。對於SimCLR這樣的模型,效能隨著batch size大小的增加而增加。因此,你希望儘可能地節省記憶體,以便能夠進行大batch的訓練。你選擇一個簡單的不帶動量的隨機梯度下降作為你的最佳化器,因為與其他最佳化器相比,它需要最少的額外記憶體來儲存狀態。
總結
嘗試所有可能的最佳化器來為自己的專案找到最好的那一個並不總是可能的。在這篇部落格文章中,我概述了最流行的最佳化器的更新規則、優缺點和需求。此外,我列出了三個問題來指導你做出明智的決定,即機器學習專案應該使用哪個最佳化器。
作為一個經驗法則:如果你有資源找到一個好的學習率策略,帶動量的SGD是一個可靠的選擇。如果你需要快速的結果而不需要大量的超引數調優,請使用自適應梯度方法。
英文原文: