理解深度學習中的學習率及多種選擇策略
學習率是最影響性能的超參數之一,如果我們只能調整一個超參數,那麼最好的選擇就是它。相比於其它超參數學習率以一種更加複雜的方式控制著模型的有效容量,當學習率最優時,模型的有效容量最大。從手動選擇學習率到使用預熱機制,本文介紹了很多學習率的選擇策略。
這篇文章記錄了我對以下問題的理解:
學習速率是什麼?學習速率有什麼意義?
如何系統地獲得良好的學習速率?
我們為什麼要在訓練過程中改變學習速率?
當使用預訓練模型時,我們該如何解決學習速率的問題?
本文的大部分內容都是以 fast.ai 研究員寫的內容 [1], [2], [5] 和 [3] 為基礎的。本文是一個更為簡潔的版本,通過本文可以快速獲取這些文章的主要內容。如果您想了解更多詳情,請參閱參考資料。
首先,什麼是學習速率?
學習速率是指導我們該如何通過損失函數的梯度調整網路權重的超參數。學習率越低,損失函數的變化速度就越慢。雖然使用低學習率可以確保我們不會錯過任何局部極小值,但也意味著我們將花費更長的時間來進行收斂,特別是在被困在高原區域的情況下。
下述公式表示了上面所說的這種關係。
new_weight = existing_weight — learning_rate * gradient
採用小學習速率(頂部)和大學習速率(底部)的梯度下降。來源:Coursera 上吳恩達(Andrew Ng)的機器學習課程。
一般而言,用戶可以利用過去的經驗(或其他類型的學習資料)直觀地設定學習率的最佳值。
因此,想得到最佳學習速率是很難做到的。下圖演示了配置學習速率時可能遇到的不同情況。
不同學習速率對收斂的影響(圖片來源:cs231n)
此外,學習速率對模型收斂到局部極小值(也就是達到最好的精度)的速度也是有影響的。因此,從正確的方向做出正確的選擇意味著我們可以用更短的時間來訓練模型。
Less training time, lesser money spent on GPU cloud compute.
有更好的方法選擇學習速率嗎?
在「訓練神經網路的周期性學習速率」[4] 的 3.3 節中,Leslie N. Smith 認為,用戶可以以非常低的學習率開始訓練模型,在每一次迭代過程中逐漸提高學習率(線性提高或是指數提高都可以),用戶可以用這種方法估計出最佳學習率。
在每一個 mini-batch 後提升學習率
如果我們對每次迭代的學習進行記錄,並繪製學習率(對數尺度)與損失,我們會看到,隨著學習率的提高,從某個點開始損失會停止下降並開始提高。在實踐中,學習速率的理想情況應該是從圖的左邊到最低點(如下圖所示)。在本例中,是從 0.001 到 0.01。
上述方法看似有用,但該如何應用呢?
目前,上述方法在 fast.ai 包中作為一個函數進行使用。fast.ai 包是由 Jeremy Howard 開發的一種高級 pytorch 包(就像 Keras 之於 Tensorflow)。
在訓練神經網路之前,只需輸入以下命令即可開始找到最佳學習速率。
# learn is an instance of Learner class or one of derived classes like ConvLearnerlearn.lr_find()learn.sched.plot_lr()
使之更好
現在我們已經知道了什麼是學習速率,那麼當我們開始訓練模型時,怎樣才能系統地得到最理想的值呢。接下來,我們將介紹如何利用學習率來改善模型的性能。
傳統的方法
一般而言,當已經設定好學習速率並訓練模型時,只有等學習速率隨著時間的推移而下降,模型才能最終收斂。
然而,隨著梯度達到高原,訓練損失會更難得到改善。在 [3] 中,Dauphin 等人認為,減少損失的難度來自鞍點,而不是局部最低點。
誤差曲面中的鞍點。鞍點是函數上的導數為零但不是軸上局部極值的點。(圖片來源:safaribooksonline)
所以我們該如何解決這個問題?
我們可以採取幾種辦法。[1] 中是這麼說的:
…無需使用固定的學習速率,並隨著時間的推移而令它下降。如果訓練不會改善損失,我們可根據一些周期函數 f 來改變每次迭代的學習速率。每個 Epoch 的迭代次數都是固定的。這種方法讓學習速率在合理的邊界值之間周期變化。這是有益的,因為如果我們卡在鞍點上,提高學習速率可以更快地穿越鞍點。
在 [2] 中,Leslie 提出了一種「三角」方法,這種方法可以在每次迭代之後重新開始調整學習速率。
Leslie N. Smith 提出的「Triangular」和「Triangular2」學習率周期變化的方法。左圖中,LR 的最小值和最大值保持不變。右圖中,每個周期之後 LR 最小值和最大值之間的差減半。
另一種常用的方法是由 Loshchilov&Hutter [6] 提出的預熱重啟(Warm Restarts)隨機梯度下降。這種方法使用餘弦函數作為周期函數,並在每個周期最大值時重新開始學習速率。「預熱」是因為學習率重新開始時並不是從頭開始的,而是由模型在最後一步收斂的參數決定的 [7]。
下圖展示了伴隨這種變化的過程,該過程將每個周期設置為相同的時間段。
SGDR 圖,學習率 vs 迭代次數。
因此,我們現在可以通過周期性跳過「山脈」的辦法縮短訓練時間(下圖)。
比較固定 LR 和周期 LR(圖片來自 ruder.io)
研究表明,使用這些方法除了可以節省時間外,還可以在不調整的情況下提高分類準確性,而且可以減少迭代次數。
遷移學習中的學習速率
在 fast.ai 課程中,非常重視利用預訓練模型解決 AI 問題。例如,在解決圖像分類問題時,會教授學生如何使用 VGG 或 Resnet50 等預訓練模型,並將其連接到想要預測的圖像數據集。
我們採取下面的幾個步驟,總結了 fast.ai 是如何完成模型構建(該程序不要與 fast.ai 包混淆)的:
1. 啟用數據增強,precompute = True
2. 使用 lr_find() 找到損失仍在降低的最高學習速率
3. 從預計算激活值到最後一層訓練 1~2 個 Epoch
4. 在 cycle_len = 1 的情況下使用數據增強(precompute=False)訓練最後一層 2~3 次
5. 修改所有層為可訓練狀態
6. 將前面層的學習率設置得比下一個較高層低 3~10 倍
7. 再次使用 lr_find()
8. 在 cycle_mult=2 的情況下訓練整個網路,直到過度擬合
從上面的步驟中,我們注意到步驟 2、5 和 7 提到了學習速率。這篇文章的前半部分已經基本涵蓋了上述步驟中的第 2 項——如何在訓練模型之前得出最佳學習率。
在下文中,我們會通過 SGDR 來了解如何通過重啟學習速率來減少訓練時間和提高準確性,以避免梯度接近零。
在最後一節中,我們將重點介紹差異學習(differential learning),以及如何在訓練帶有預訓練模型中應用差異學習確定學習速率。
什麼是差異學習
差異學習(different learning)在訓練期間為網路中的不同層設置不同的學習速率。這種方法與人們常用的學習速率配置方法相反,常用的方法是訓練時在整個網路中使用相同的學習速率。
在寫這篇文章的時候,Jeremy 和 Sebastian Ruder 發表的一篇論文深入探討了這個問題。所以我估計差異學習速率現在有一個新的名字——差別性的精調。:)
為了更清楚地說明這個概念,我們可以參考下面的圖。在下圖中將一個預訓練模型分成 3 組,每個組的學習速率都是逐漸增加的。
具有差異學習速率的簡單 CNN 模型。圖片來自 [3]
這種方法的意義在於,前幾個層通常會包含非常細微的數據細節,比如線和邊,我們一般不希望改變這些細節並想保留它的信息。因此,無需大量改變權重。
相比之下,在後面的層,以綠色以上的層為例,我們可以從中獲得眼球、嘴巴或鼻子等數據的細節特徵,但我們可能不需要保留它們。
這種方法與其他微調方法相比如何?
在 [9] 中提出,微調整個模型太過昂貴,因為有些模型可能超過了 100 層。因此人們通常一次一層地對模型進行微調。
然而,這樣的調整對順序有要求,不具並行性,且因為需要通過數據集進行微調,導致模型會在小數據集上過擬合。
下表證明 [9] 中引入的方法能夠在各種 NLP 分類任務中提高準確度且降低錯誤率。
參考文獻:
[1] Improving the way we work with learning rate.
[2] The Cyclical Learning Rate technique.
[3] Transfer Learning using differential learning rates.
[4] Leslie N. Smith. Cyclical Learning Rates for Training Neural Networks.
[5] Estimating an Optimal Learning Rate for a Deep Neural Network
[6] Stochastic Gradient Descent with Warm Restarts
[7] Optimization for Deep Learning Highlights in 2017
[8] Lesson 1 Notebook, fast.ai Part 1 V2
[9] Fine-tuned Language Models for Text Classification
原文鏈接:https://towardsdatascience.com/understanding-learning-rates-and-how-it-improves-performance-in-deep-learning-d0d4059c1c10


TAG:機器之心 |