深度學習中的學習率調度:循環學習率、SGDR、1cycle 等方法介紹及實踐策略研究
深度學習實踐者都知道,在訓練神經網絡時,正確設置學習率是使模型達到良好性能的關鍵因素之一。學習率通常會在訓練過程中根據某種調度策略進行動態調整。調度策略的選擇對訓練質量也有很大影響。
大多數實踐者采用一些廣泛使用的學習率調度策略,例如階梯式衰減或余弦退火。這些調度策略中的許多是為特定的基準任務量身定制的,經過多年的研究,已被證明可以最大限度地提高測試精度。然而這些策略往往無法推廣到其他實驗設置,這引出了一個重要的問題:訓練神經網絡最一致和最有效的學習率調度策略是什么?
在本文中,我們將研究各種用于訓練神經網絡的學習率調度策略。這些研究發現了許多既高效又易于使用的學習率策略,例如循環學習率或三角形學習率調度。通過研究這些方法,我們將得出幾個實用的結論,提供一些可以立即應用于改善神經網絡訓練的簡單技巧。
神經網絡訓練與學習率
在監督學習環境中,神經網絡訓練的目標是生成一個模型,在給定輸入數據的情況下,能夠準確預測與該數據相關的真實標簽。一個典型的例子是訓練一個神經網絡,根據大量標記的貓和狗的圖像數據集,正確預測一張圖像中是否包含貓或狗。
上圖所示的神經網絡訓練的基本組成部分如下:
- 神經網絡: 接受一些數據作為輸入,并根據其內部參數/權重對這些數據進行轉換,以產生輸出。
- 數據集: 大量的輸入-輸出數據對的樣本(例如,圖像及其相應的分類標簽)。
- 優化器: 用于更新神經網絡的內部參數,使其預測更加準確。
- 超參數: 由深度學習實踐者設置的外部參數,用于控制訓練過程的相關細節。
通常神經網絡在開始訓練時,其所有參數都是隨機初始化的。為了學習更有意義的參數,神經網絡會接受來自數據集的數據樣本。對于每個樣本,神經網絡嘗試預測正確的輸出,然后優化器更新神經網絡的參數以改進這個預測。
這個過程通過更新神經網絡的參數,使其能夠更好地匹配數據集中已知的輸出,這被稱為訓練。這個過程重復進行,通常直到神經網絡多次遍歷整個數據集,每次遍歷被稱為一個訓練周期(epoch)。
盡管這個神經網絡訓練的描述并不全面,但它應該提供足夠的直觀理解來完成本文的閱讀。下面我們繼續
什么是超參數?
模型參數在訓練過程中由優化器更新。相比之下,超參數是 "額外的" 參數,我們(深度學習實踐者)可以控制。但是,我們實際上可以用超參數控制什么?一個常見的超參數,就是學習率。
什么是學習率? 簡單地說,每次優化器更新神經網絡的參數時,學習率控制這個更新的大小。我們應該大幅更新參數、小幅更新參數,還是介于兩者之間? 我們通過設置學習率來做出這個選擇。
選擇一個好的學習率。 設置學習率是訓練神經網絡最重要的方面之一。如果我們選擇的值太大,訓練就會發散。另一方面,如果學習率太小,可能會導致性能不佳和訓練緩慢。我們必須選擇一個足夠大的學習率,以提供對訓練過程的正則化效果并快速收斂,同時不能太大以致于訓練過程變得不穩定。
選擇好的超參數
像學習率這樣的超參數通常使用一種簡單的方法網格搜索來選擇。基本思路是:
- 為每個超參數定義一個潛在值的范圍
- 在這個范圍內選擇一組離散的值進行測試
- 測試所有可能的超參數值組合
- 基于驗證集的性能選擇最佳超參數設置
網格搜索是尋找最佳超參數的簡單而窮盡的搜索方法。下圖是一個在潛在學習率值上進行網格搜索的示例。
通過遵循類似的方法并測試所有可能的超參數值組合,可以將類似的方法應用于多個超參數。
網格搜索在計算上是低效的,因為它需要為每個超參數設置重新訓練神經網絡。為了避免這種成本,許多深度學習實踐者采用 "猜測和檢查" 的方法,在合理的范圍內嘗試幾個超參數,看看什么有效。已經提出了選擇最佳超參數的其他方法[5],但由于其簡單性,網格搜索或猜測和檢查過程被廣泛使用。
學習率調度
在選擇了學習率之后,我們通常不應在整個訓練過程中保持同一個學習率。相反,我們應該 (i) 選擇一個初始學習率,然后 (ii) 在整個訓練過程中逐漸衰減這個學習率[1]。執行這種衰減的函數被稱為學習率調度。
人們提出了許多不同的學習率調度策略;例如,階梯式衰減(即在訓練期間將學習率衰減 10 倍幾次)或余弦退火;見下圖。在本文中,我們將探討一些最近提出的表現特別好的調度策略。
自適應優化技術。 基于隨機梯度下降(SGD)的神經網絡訓練選擇了一個全局學習率,用于更新所有模型參數。除了 SGD 之外,還提出了自適應優化技術(例如,RMSProp 或 Adam [6]),它們使用訓練統計數據來動態調整用于每個模型參數的學習率。本文中概述的大部分結果同時適用于自適應優化器和 SGD 風格的優化器。
相關論文
在這一節中,我們將看到一些學習率調度策略的例子。這些策略包括循環學習率或三角形學習率,以及不同的學習率衰減方案。最佳學習率策略高度依賴于領域和實驗設置,但我們也將看到通過研究許多不同學習率策略的實證結果,可以得出幾個高層次的結論。
用于訓練神經網絡的循環學習率[1]
https://arxiv.org/abs/1506.01186
[1]中的作者提出了一種處理神經網絡訓練中學習率的新方法:根據平滑的調度,在最小值和最大值之間循環變化學習率。在這項工作之前,大多數實踐者采用了一種流行的策略,即 (i) 將學習率設置為一個初始較大的值,然后 (ii) 隨著訓練的進行逐漸衰減學習率。
在[1]中拋棄了這個經驗法則,轉而采用循環策略。以這種方式循環學習率有點違反直覺 —— 在訓練過程中增加學習率會損害模型性能。盡管在學習率增加時暫時降低了網絡性能,但正如我們將在[1]中看到的,循環學習率調度實際上在整個訓練過程中提供了很多優于其他方法的好處。
循環學習率引入了三個新的超參數:步長、最小學習率和最大學習率。產生的調度是 "三角形" 的,這意味著學習率在相鄰的周期中交替增加和減少;步長可以設置在 2-10 個訓練周期之間,而學習率的范圍通常通過學習率范圍測試來確定(見[1]中的第 3.3 節)。
增加學習率會暫時降低模型性能。但是一旦學習率再次衰減,模型的性能就會恢復并提高。考慮到這一點,在[1]的實驗結果中看到,用循環學習率訓練的模型在性能上呈現出周期性模式。每個周期結束時(即當學習率衰減回最小值時),模型性能達到峰值,而在周期的中間階段(即當學習率增加時),模型性能則變得較差;見下圖。
[1]中的結果表明,循環學習率在訓練過程中有利于模型性能。與其他學習率策略相比,使用循環學習率訓練的模型更快地達到更高的性能水平;換句話說,使用循環學習率訓練的模型在任何時間點的性能都非常好!
在 ImageNet 上進行的更大規模實驗中,循環學習率仍然提供了好處,盡管不那么明顯。
SGDR: 帶有熱重啟的隨機梯度下降[2]
https://arxiv.org/abs/1608.03983
[2]中的作者提出了一種簡單的學習率重啟技術,稱為帶有重啟的隨機梯度下降(SGDR),其中學習率定期重置為其原始值并按計劃減小。這種技術采用以下步驟:
- 根據某個固定的調度衰減學習率
- 在衰減調度結束后將學習率重置為其原始值
- 返回步驟 #1(即再次衰減學習率)
下面是遵循這一策略的不同調度的描述。
我們可以注意到上面調度的一些特點。首先,在[2]中總是使用余弦衰減調度(圖的 y 軸是對數刻度)。此外,隨著訓練的進行,每個衰減調度的長度可能會增加。具體來說,[2]中的作者將第一個衰減周期的長度定義為 T_0,然后在每個連續的衰減周期中將這個長度乘以 T_mult;見下圖的描述。
為了遵循[1]的術語,SGDR 的步長可能在每個周期后增加。但與[1]不同的是,SGDR 不是三角形的(即每個周期只是衰減學習率)。
在 CIFAR10/100 上的實驗中可以看到,與階梯式衰減調度相比,SGDR 學習率調度可以更快地獲得良好的模型性能 —— SGDR 具有良好的任意時間性能。每個衰減周期后得到的模型表現良好,并在連續的衰減周期中繼續變得更好。
在這些初步結果之外,研究通過在每個衰減周期結束時獲取 "快照" 而形成的模型集成。具體來說可以在SGDR 調度中的每個衰減周期后保存模型狀態的副本。然后在訓練完成后,在推理時平均每個模型的預測,形成一個模型集成。
通過以這種方式形成模型集成,可以在 CIFAR10 上顯著降低測試錯誤率;見下圖。
此外,SGDR 的快照似乎提供了一組具有不同預測的模型。以這種方式形成集成實際上優于將獨立的、完全訓練的模型加入集成的常規方法。
超融合:使用大學習率非常快速地訓練神經網絡[3]
https://arxiv.org/abs/1708.07120
[3]中的作者研究了一種有趣的訓練神經網絡的方法,可以將訓練速度提高一個數量級。基本方法(最初在[8]中概述)是執行單個三角形學習率周期,其中最大學習率較大,然后在訓練結束時允許學習率衰減到該周期的最小值以下;見下圖的說明。
此外動量以與學習率相反的方向循環(通常在[0.85, 0.95]的范圍內)。這種聯合循環學習率和動量的方法被稱為 "1cycle"。[3]中的作者表明,它可以用來實現 "超融合"(即非常快速地收斂到高性能解)。
例如在 CIFAR10 上的實驗中看到,與基線學習率策略相比,1cycle 可以用少 8 倍的訓練迭代次數實現更好的性能。使用不同的 1cycle 步長可以進一步加速訓練,盡管準確率水平取決于步長。
可以在一些不同的架構和數據集上觀察到類似的結果。其中 1cycle 再次在令人驚訝的少量訓練周期中產生良好的性能。
目前還不清楚超融合是否可以在大量的實驗設置中實現,因為[3]中提供的實驗在規模和種類上都有些有限。盡管如此,我們可能都會同意,超融合現象非常有趣。事實上,這個結果是如此有趣,以至于它甚至被 fast.ai 社區推廣和深入研究。
REX:重新審視帶有改進調度的預算訓練[4]
https://arxiv.org/abs/2107.04197
在[4]中,作者考慮了在不同預算制度(即小、中、大訓練周期數)下正確調度學習率的問題。你可能會想:為什么要考慮這種設置?通常情況下,最佳訓練周期數并不是事先知道的。但我們可能正在使用一個固定的資金預算,這會限制可以執行的訓練周期數。
為了找到最佳的預算不可知學習率調度,我們必須首先定義將要考慮的可能學習率調度的空間。在[4]中,通過將學習率調度分解為兩個組成部分來實現這一點:
- 輪廓: 在整個訓練過程中學習率變化所依據的函數。
- 采樣率: 根據所選輪廓更新學習率的頻率。
這樣的分解可以用來描述幾乎所有固定結構的學習率調度。下面描述了不同輪廓和采樣率組合。采樣率越高,調度越接近基礎輪廓。
[4]中的作者考慮了具有不同采樣率和三種函數輪廓的學習率調度:指數(即產生階梯式調度)、線性和 REX(即[4]中定義的新穎輪廓)。
作者在 CIFAR10 上訓練 Resnet20/38,采用不同的采樣率和輪廓組合。在這些實驗中可以看到階梯式衰減調度(即具有低采樣率的指數輪廓)只有在低采樣率和許多訓練周期的情況下才表現良好。每次迭代采樣的 REX 調度在所有不同的周期設置中都表現良好。
之前的工作表明,線性衰減調度最適合低預算訓練設置(即用更少的周期進行訓練)[9]。在[4]中,我們可以看到 REX 實際上是一個更好的選擇,因為它避免了在訓練的早期過早地衰減學習率。
[4]中的作者還考慮了各種流行的學習率調度,如下圖所示。
在各種領域和訓練周期預算下測試了這些調度。當在所有實驗中匯總性能時,我們得到如下所示的結果。
REX 在不同的預算制度和實驗領域中實現了令人震驚的一致性能。沒有其他學習率調度在實驗中接近相同比例的前 1/3 名次,這表明 REX 是一個良好的領域/預算不可知的學習率調度。
除了 REX 的一致性之外,這些結果還告訴我們一些更普遍的東西:常用的學習率策略在不同的實驗設置中泛化能力不好。每個調度(即使是 REX,盡管程度較小)只在少數情況下表現最好,這表明為任何特定設置選擇適當的學習率策略非常重要。
總結
正確處理學習率可以說是訓練神經網絡最重要的方面。在本文中,我們了解了幾種用于訓練深度網絡的實用學習率調度策略。研究這一系列工作提供了簡單易懂、易于實施且高效的結論。其中一些基本結論如下。
選擇一個好的學習率。 正確設置學習率是訓練高性能神經網絡最重要的方面之一。選擇不當的初始學習率或使用錯誤的學習率調度會顯著惡化模型性能。
"默認"調度并非總是最好的。 許多實驗設置都有一個 "默認" 學習率調度,我們傾向于在沒有太多思考的情況下采用;例如,用于圖像分類的 CNN 訓練的階梯式衰減調度。但我們也應該意識到,隨著實驗設置的改變,這些調度的性能可能會急劇惡化;例如,對于預算設置,基于 REX 的調度明顯優于階梯式衰減。我們應該始終關注我們選擇的學習率調度,以真正最大化我們模型的性能。
循環調度非常棒。 循環或三角形學習率調度(例如,如[2]或[3]中所示)非常有用,因為:
- 它們通常達到或超過最先進的性能
- 它們具有良好的任意時間性能
使用循環學習率策略,模型在每個衰減周期結束時達到最佳性能。我們可以簡單地繼續訓練任意數量的周期,直到我們對網絡的性能感到滿意。最佳訓練量不需要事先知道,這在實踐中通常很有用。
有很多東西值得探索。 盡管學習率策略已經被廣泛研究,但似乎仍有更多的東西有待發現。例如,我們已經看到,采用替代衰減輪廓有利于預算設置[4],循環策略甚至可以在某些情況下用于實現超融合[3]。但是問題也隨之而來:還能發現什么? 似乎有一些非常有趣的策略(例如,分形學習率[7])尚未被探索。