當前位置:
首頁 > 最新 > 學習率及其如何改善深度學習演算法

學習率及其如何改善深度學習演算法

這篇文章主要是介紹我對以下問題的理解:

(1)什麼是學習率(learning Rate)?它的意義是什麼?

(2)如何系統的達到一個好的學習率?

(3)為什麼在模型訓練過程中要改變學習率?

(4)應用已訓練的模型時,如何處理學習率問題?

本文的內容基於fast.in的工作人員撰寫的文章[1]~[3]、[5],並在其基礎上提煉了其中的主要內容。如果您想了解更多,請參考原文。

首先,什麼是學習率?

學習率是一個超參數(hyper-parameter),它根據損失梯度(Loss gradient)來控制神經網路權重的調整步長。梯度值越低,我們沿著下降斜率調整的越慢。這能確保我們不會錯失任何一個局部最小值(local minima),但也可能導致收斂速度變慢-尤其是在平穩段的時候。

new_weight = existing_weight — learning_rate * gradient

圖1 梯度下降情況:小學習率(上)、大學習率(下)

通常,學習率被簡單的設置成隨機數。當然,如果能利用過去的經驗(或者其他資料)來確定學習率的最優值是最理想的了。但光憑經驗,往往很難憑直覺獲得合適的學習率。圖2證明了不同學習率對網路訓練的影響。

圖2 不同學習率對收斂的影響

也就是說,學習率決定了我們的模型能以多快的速度收斂到最優值(也就是達到最佳精度)。因此,從開始就設置適宜的學習率能讓我們用更少的時間訓練模型。

Less training time, lesser money spent on GPU cloud compute. :)

是否有更好的方法來確定學習率?

在《Cyclical Learning Rates for Training Neural Networks》的3.3節[4],Leslie N.Smith指出可以通過在訓練開始時設置較小的學習率,然後在每步迭代中逐漸增加(線性或指數)的方法來獲得合適的學習率。

圖3 學習率在每步迭代後逐漸增加(對數形式)

可以看到,隨著學習率的增加,存在著一個確定的拐點,損失函數在該點停止下降,開始上升。在實際應用中,學習率應設置在拐點偏左一點,如圖4中,可以設為0.001至0.01。

圖4 學習率(對數坐標)

如何開始應用上述方法

如今,該方法可以作為fast.ai工具包的一個函數進行調用。使用時,只需輸入以下命令,就可以尋找最優學習率,並用於神經網路訓練。

現在,我們了解了什麼是學習率以及如何系統的確定其初始最優解。接下來,我們來學習如何應用學習率來提高模型的性能。

經典方法

通常,當我們設置好學習率,並開始訓練模型後,只需要等待學習率不斷減小,直到模型最終收斂。但是,當梯度達到一個鞍點時,模型的訓練誤差很難再進一步改進[3]。在鞍點上,誤差平面的各方向的導數均為0,但該點並不是各軸的局部極值點。

圖5 誤差平面上的鞍點(saddle point)

如何脫離鞍點

以下一些方法,可以用來脫離鞍點。比如文獻[1]中提到:

「除了採用固定的學習率然後隨時間遞減的方法,當誤差函數不再繼續優化時,可以採用根據周期函數改變學習率的方法進行迭代,每個周期根據迭代次數設置確定的步長。該方法允許學習率在合理的範圍內進行變化。該方法之所以有效,是因為在鞍點位置,適當的增大學習率可以更加快速的越過鞍點區域(saddle point plateaus)。」

在文獻[2]中,Leslie提出了「Triangluar」方法,該方法中學習率經過一定迭代步數後重新進行設置。

圖6 「Triangular」和「Triangular2」方法

「Triangular」方法中學習率的最大、最小值保持一致;「Triangular2」方法中每個周期後學習率衰減一半。

另一個比較受歡迎是Loshchilov&Hutter提出的「Stochasitc Gradient Desent with Warm Restarts(SGDR)」方法。該方法採用餘弦函數作為周期函數,並在學習率達到最大值時重新啟動。

圖7 SGDR方法

因此,我們可以利用以上方法來周期性的翻越「山峰」,從而縮減模型的訓練時間。

圖8 固定學習率和周期學習率的比較

遷移學習中的學習率問題

在fast.ai的課程中,許多的實例都是應用已經訓練好的模型去解決AI問題(遷移學習問題)。比如,在解決圖像分類問題時,學員會學習如何使用已訓練模型(如VGG或Resnet50),並將其與任一圖像數據集連接,用於解決你想預測的問題。

以下是fast.ai中建模的幾個典型步驟:

[1] 打開data augmentation,設置precompute=Ture;

[2] 使用lr_fine()命令,尋找最大的學習率;

[3] 從已定義的激活函數開始訓練上一層,訓練1~2個周期;

[4] 用增強數據來訓練上一層2~3個周期,設置cycle_len=1;

[5] 解凍所有層;

[6] 前期層的學習率應設置為後面層的3~10倍;

[7] 再次應用lr_fine();

[8] 訓練整個神經網路,設置cycle_mult=2,直至over-fitting。

以上的幾個步驟中,步驟2、5和7都是有關學習率的。步驟2其實就是我們前面講到的,如何在訓練模型前找到最佳的學習率。

下面介紹可微分編程(Differential Learning),以及如何確定其最佳學習率。

什麼是可微分編程

可微分編程是一種可以根據不同層(layer)設置不同學習率的神經網路設計方法。不同於以往的神經網路訓練方法,該方法可以更快的收斂。

為了更清晰的解釋這個概念,我們可以看下面的示意圖。圖中的神經網路被分為3組,每一組被設置逐漸增加的學習率。

該方法的意義是:最初的幾層網路包含數據的詳細信息,如線條和邊緣信息,這些信息往往是我們希望保留的。因此,沒有必要過快的改變它們的權重。而在最後的網路中(如綠色的層),往往代表的是局部的細節特徵(如眼球、嘴和鼻子等),這些信息不是我們關心的,因此沒必要保留。所以設置較大的學習率快速的進行迭代。

文獻[9]中提到fine-tuning(微調)整個神經網路的代價非常 大,因為有些網路可能高達100層。但是,通過每一次只調節一層網路,但對於小數據集又會帶來過擬合的問題。

文獻[9]中證明了可微分編程的方法對於自然語言處理任務,可以提高精度,減小誤差率。

參考文獻:

[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

善用智能之道:行業動態、技術前沿、產業服務,歡迎關注聯繫:九三智能控

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 九三分析獅 的精彩文章:

TAG:九三分析獅 |