【李宏毅老師2021系列】類神經網路訓練不起來怎麼辦 (四):自動調整學習速率 (Learning Rate)

追客 Fredrick Hong
12 min readMay 19, 2022

--

這個系列是在觀看李宏毅老師2021系列的筆記,希望能用更濃縮的方式將內容整理下來。

此篇主要會延續類神經網路訓練不起來怎麼辦( 一)、(二)的課程內容,介紹過去到現在常見的 Optimizer。

此篇筆記來自此課程:【機器學習2021】類神經網路訓練不起來怎麼辦 (三):自動調整學習速率 (Learning Rate) — YouTube

前情提要

在(一)的課程中,老師介紹了在訓練神經網路的過程中,當 loss 不再下降,參數不再更新時,稱之為 critical point。

Critical point 又可以區分成 local minima 以及 saddle point。
Local minima:局部 loss 最小值。
Saddle point:非 local minima 也非 local maxima。

當我們處於 local minima 時,或許能夠接受訓練結果。但當我們處於 saddle point 時,代表我們的 loss 還有很多優化空間。

而 Hessian 是一種能夠判斷我們所在的 critical point 是屬於 local minima 還是 saddle point 的方式,並且也能夠作為逃離 saddle point 的方式,可是計算 Hessian 的運算量太大,因此並不是最好的方式。

在(二)的課程中,老師介紹了 Momentum 這種 optimizer,它是另一種能夠逃離 saddle point 的方式。

這堂課則是要來介紹除了 Momentum 以外的其他 optimizer,接著就開始進入課程筆記吧!

Error Surface is rugged …

前言:Critical Point 不一定是實際在訓練 network 時,會遇到的最大的障礙。
今天要介紹的 Adaptive Learning Rate,是要給予每一個參數不同的 learning rate 的更新方式。

Training Stuck = Small Gradient ?

  • loss 不再下降的時候,我們會以為走到了 critical point,然而去確認 gradient 卻發現 gradient 並沒有等於0。(norm of gradient = g 向量的長度)
  • 當我們卡在下圖左方的山谷中,而我們的 learning rate 沒辦法讓我們逃離山谷,gradient 就會在山谷中不斷地震盪,loss 則不會再下降,因此這種情況就不是走到了 critical point(critical point 的 gradient = 0)。
圖1 — 截圖自李宏毅老師課程

Wait a minute …

  • 前幾堂課在介紹 critical point 時,有用下圖作為介紹,但其實這張圖的 network 並不是用 gradient descent 的優化方式去更新參數的,因為通常用 gradient descent 會遇到的問題,並不是 critical point。
圖2 — 截圖自李宏毅老師課程

Training can be difficult even without critical points

  • 接著用只有兩個參數(w, b)的 model training 的 error surface 來舉例,黃色叉叉是 loss 的最低點,黑點是參數的起始位置。
  • 當 learning rate = 10的-2次方,gradient 會在山谷中間不斷震盪,gradient 實際上還是有在更新,但 loss 這時候不會再下降了。
  • learning rate 決定更新參數時的步伐有多大,因此再將 learning rate 調小。
  • 當 learning rate = 10的-7次方,gradient 終於不再震盪,但卻永遠也走不到 loss 最低點的位置,因為 learning rate 已經太小了。

因此我們需要更好的 gradient descent 的版本:客製化 learning rate。

圖3— 截圖自李宏毅老師課程

客製化:Different parameters needs different learning rate

怎麼客製化?

  • 從 error surface 可以知道,當我們往某個方向,處在在平坦的區域,會希望 learning rate 設定得大一點,往另一個方向,處在在陡峭的區域,會希望 learning rate 設定得小一點。
  • 公式 (以時間點 t、第 i 個 iteration 的參數 θ 為例)
  • 原本的在時間點 t+1 的參數等於下方圖片的公式
  • 為了要客製化,我們讓 η 除以另一個參數 σ(下圖最下方紅框的參數),這個參數會依賴於 i,也會依賴於 t。

而後續的 optimizer 也是調整計算 σ 的方式而有所不同。

圖4— 截圖自李宏毅老師課程

σ 常見的計算方式

Root Mean Square (RMS)

  • 先上參數更新的公式
  • 在這種方式底下, σ = gi⁰ 的絕對值,因此第一次參數的更新其實是看 learning rate 是多少。
計算第一個 iteration 後的參數更新
  • 重點在於,第二次的參數更新,是加總過去 gradient 的平方再開根號。
計算第二個 iteration 後的參數更新
  • 以此類推。
圖5— 截圖自李宏毅老師課程

Adagrad

RMS 計算 learning rate 的方式,被用在 Adagrad 這種 optimizer 上。

  • 當我們遇到平坦的區域,gradient 會比較小,也因此 σ 就會比較小,而因此 σ 在分母,因此整體 learning rate 就會變大。
  • 當我們遇到陡峭的區域,gradient 大,σ 大,learning rate就會變小。

但是!

我們有時候還是會希望,即使參數是往同樣的方向更新,learning rate 也是能夠動態地調整,因此 RMSProp 就出現了。

RMSProp

參數更新方式與 Adagrad 類似,不同的是 σ 的計算方式。

  • 第一步與 RMS 相同,如下圖。
第一個 iteration 更新參數
  • 第二步 σ 公式,如下圖
第二個 iteration 更新參數
* 第二步,我們可以自行決定 gradient 有多重要,α 是一個 hyperparameter,如果覺得第二次的 gradient 比第一次重要,那麼 α 就設定得小一點 (0 < alpha < 1)。* 第二步 σ 公式:α 先乘上上一次的 σ 的平方,再加上 1 — α 乘以這次 gradient 的平方,再開根號。* 以此類推。* 因此就像給予上一次 gradient 和這一次 gradient 權重一樣,σ 設定得越小,這次 gradient 的權重就越大。
  • 完整公式可參考下圖
圖6 — 截圖自李宏毅老師課程

RMSProp 的優勢

  • 以 error surface 來解釋的話,我們會沿著下圖黑線(error surface)更新參數。
  • 處在下坡前,這時候的 gradient 很小,而計算出來的 σi 也會很小, 因此下一步要更新的步伐就會很大( σi 是分母)。
  • 在下坡中,如果以 Adagrad 來更新參數的話,它的反應會比較慢,但如果我們用 RMSProp,把 α 設定得小一點,也就是讓剛看到的 gradient 權重較重,就可以很快地讓 σ 的值變大,讓更新的步伐變小,才不會導致更新步伐太大,整個噴出去。
  • 沒有 α 的話(Adagrad),更新的步伐就是一個值很大的 σ 乘上一個值很大的 gradient,更新的步伐就飛出去了。

RMSProp 在下坡時的優勢,在於可以透過調整 α 來踩煞車,讓更新的步伐不至於噴出去。

圖7— 截圖自李宏毅老師課程

Adam: RMSProp + Momentum

對於現在最常用的 Adam,老師先是說明它是 RMSProp 和 Momentum 的綜合版,以及通常用預設的 hyperparameter 效果通常會比較好,其他並沒有再多做介紹。

圖8— 截圖自李宏毅老師課程

比較有沒有使用 Adaptive Learning Rate 的差異

  • 下圖的上面兩張圖是純粹用 gradient descent 來優化參數,且 learning rate 分別是 10的-2次方跟10的-7次方。
  • 下圖的最下面那張圖則是用 Adagrad 作為 optimizer 來更新參數。
  • 當參數更新到右上角的黑色點時,因為這時候左右兩旁的 gradient 很小,因此 Adagrad 會自動調大 learning rate,讓參數可以繼續往右更新。
  • 但當我們繼續往左邊更新參數,會發現 gradient 一直都很小,而 α 就是根據過去的 gradient 加總的平方再開根號,而 α 又是位在分母,因此累積到一定的程度後,learning rate 就會變得很大,導致參數更新的幅度太大,黑色點才會劇烈地上下晃動。
  • 同樣道理,當參數噴出去之後,又會修正回來,然後再累積一陣子,又會再噴出去一次,然後再修正,直到走到 local minima。
圖9— 截圖自李宏毅老師課程

如何解決參數噴來噴去的問題:Learning Rate Scheduling

下一步要更新的 θ 公式如下圖。

剛剛介紹的 optimizer 都是變換 σ 的計算方式,來解決更新參數會遇到的問題。

但在這邊,我們則是讓原本是一個固定的數值 η ,變成一個會隨著時間而改變的參數。

Learning Rate Decay

  • 是 Learning Rate Scheduling 最常見的方式,顧名思義是一種隨著時間減少 learning rate 的方式。
  • 這種方式是合理的,因為隨著我們越接近想要的終點,讓更新參數的速度慢下來,踩一個煞車。
  • 套用到剛剛的例子中,就不會有 loss 亂噴的情況了,訓練過程也就更加穩定。
圖10 — 截圖自李宏毅老師課程

Warm Up

  • Learning Rate 先變大再變小。(訓練 Bert 會被拿來用,但並不是有 Bert 之後才有 Warm Up,其實在2015年的 Residual Network 中就出現過了)
  • 黑科技:會在一些 network 中發現 optimizer 會加入 warm up 來訓練,但論文並沒有解釋為什麼,包含知名的 Transformer。至於為麼麼在某些 network 中需要使用這種技術,老師認為還沒有被完全地解釋清楚。
圖11— 截圖自李宏毅老師課程

為什麼 warm up 要這樣設計的一種解釋

  • 在使用 Adam, RMSProp, Adagrad 的時候,公式中的 σ 是一個統計的結果,這個參數告訴我們某個方向有多陡峭或多平滑,但它看得資料要夠多,這個統計才會足夠精準。
參數更新公式
  • 因此剛開始更新參數時,統計是不精準的,所以我們不能讓我們的參數走的離初始的地方太遠,因此 η 才會先從小變大,讓前期的優化比較像是在探索或蒐集 error surface 的情報,等到 σ 資料看得夠多,足夠精準後,我們再將 η 調大。
  • 關於 warm up 的更多解釋,可以參考 RAdam 這個 optimizer。
圖12— 截圖自李宏毅老師課程

Summary of Optimization

  • (Vanilla) Gradient Descent (一般版本)
  • 這一步的參數減去 gradient 乘上 learning rate,就會得到下一步的參數。
Vanilla Gradient Descent
  • Various Improvements
Various Improvements
  • m (Momentum):就是加上 m 這個參數,m 是將過去的 gradient 加總起來,因此有考慮到參數更新的方向性。
  • σ (Adagrad):除了 m 之外,還會加上 σ 這個參數, σ 同樣會考慮過去所有的 gradient,但因為它使用 RMS (Root Mean Square) 的方式去計算,因此只考慮 gradient 的大小,但沒有考慮方向性(會先將過去所有的 gradient 乘以二次方,也就是平方和,除以 gradient 的數量)。
  • η :最後是將調整 η 這個參數,讓它隨著時間而改變。

現今最常用的 optimizer 是 Adam,但其實也有很多變形,而變形的方式,就是去調整 m, σ, η,這三個參數的計算方式。

結語

這堂課程的影片雖然時間很短,但把常見的 optimizer 都仔細地介紹完畢,內容非常地充實。

以上就是這堂課的筆記了,如果喜歡我的筆記,歡迎給個clap或留下留言!

--

--

追客 Fredrick Hong

畢業後就到在數位廣告業打滾,之前是廣告優化師,目前則是在數據團隊任職。