【機器學習】梯度下降 II

許瑞晗發表於2020-09-20

Gradient Descent 梯度下降 II

關於 Gradient Descent 的直觀解釋,參考上一篇部落格【機器學習】梯度下降 I

本模組介紹幾種梯度下降模型。定義符號標記如下:

  • \(\theta_t\):第 t 步的引數
  • \(\nabla L(\theta_t)\) or \(g_t\)\(\theta_t\)的梯度
  • \(m_{t+1}\):從 0 時刻開始累積的動量

SGD

\(\theta_{t+1} = \theta_t - \eta\nabla L(\theta_t)\)

  • 特點:最簡單、比較快的梯度下降方法。

  • 缺點:更新方向完全依賴於當前 batch,更新十分不穩定並且非常容易陷入區域性極小值。如果使用過就會發現只需幾次迭代就收斂到了一個比較差的點。如果損失函式是凸函式那麼 SGD 無疑是非常合適的方法。

SGD with Momentum (SGDM)

\(v_{t+1} = \lambda v_t - \eta\nabla L(\theta_t)\)

\(\theta_{t+1} = \theta_t + v_{t+1}\)

或者

\(v_{t+1} = \lambda v_t + \eta\nabla L(\theta_t)\)

\(\theta_{t+1} = \theta_t - v_{t+1}\)

特點:使用動量模擬運動的慣性。更穩定,更快,有一定擺脫區域性最優的能力。

缺點:會很快衝過最小值點。最後收斂的時候比較慢。但是在一些應用場景中,SGDM 可以收斂到一個比較好的值。

Nesterov accelerated gradient (NAG)

\(v_{t+1} = \lambda v_t - \eta\nabla L(\theta_t+\lambda v_t)\)

\(\theta_{t+1} = \theta_t + v_{t+1}\)

特點:和標準動量方法相比,唯一的不同是計算動量時使用的是下一時刻的梯度。那麼如果下一時刻走到了一個不太好的地方就會及時止損,而如果走到了一個比較好的地方就會加速下降。

缺點:相當於多了一整個 forward 和 backward 過程,計算非常慢。實際中用的都是該方法的變形

\(v_{t+1} = \lambda v_t - \eta\nabla L(\theta_t)\)

\(\theta_{t+1} = \theta_t + \lambda v_{t+1} - \eta\nabla L(\theta_t)\)

可以證明這兩種方法是完全等價的(令\(\theta_t^*=\theta_t+\lambda v_t\),帶入第一組式子即可)。

預備知識

在介紹接下來的優化器時,需要先了解指數加權平均。

指數加權平均 (Exponentially weighted average)

\(v_{t+1}=\beta v_t + (1-\beta)\theta_t\)

這是一種保持記憶的方式。記憶項本質是指數衰減的,記憶視窗的長度可視作\(\frac{1}{1-\beta}\),因為可以證明

\[\lim_{\beta\rightarrow 1-0}\beta^\frac{1}{1-\beta}=\frac{1}{e}\approx 0.368 \]

\(\beta\)越大,記憶視窗的長度越大,越平滑。

帶偏差修正的指數加權平均 (bias correction / debiased in exponentially weighted average)

\(v_{t+1}=\beta v_t + (1 - \beta)\theta_t\)

\(\tilde v_t = \frac{v_t}{1-\beta^t}\)

簡單的指數加權平均在前幾項時,會有很大的誤差。因為前幾項沒有填滿滑動視窗,而缺失的值都預設為 0,這些 0 會對後面很長一段時間產生影響。因此加入了一個修正項使得:

  1. 在前幾項使得\(v_{t+1}\)儘量接近\(\theta_t\)
  2. 之後使得\(v_{t+1}\)儘量接近\(\beta v_t + (1-\beta)\theta_t\)

這個修正項就是\(\tilde v_t = \frac{v_t}{1-\beta^t}\)

Adagrad

\(G_t = G_{t-1} + g_t^2\)

\(\theta_{t+1} = \theta_t - \frac{\eta}{\sqrt{G_t}+\epsilon}g_t\)

特點:之前的方法針對每一個引數使用相同的學習率,而 Adagrad 使得之前梯度較大的引數更新較慢,之前梯度較小的引數更新較慢。這樣可以使得在平緩的方向上也能得到較快得下降,有一定擺脫區域性最優的能力。

缺點:懲罰項累積太快,導致梯度很快消失。

RMSprop

\(v_{t+1}=\rho v_t + (1 - \rho)g_t^2\)

\(\theta_{t+1} = \theta_t - \frac{\eta}{\sqrt{v_{t+1}}}g_t\)

特點:解決了 Adagrad 梯度消失的問題

Adadelta

\(G_t = \rho G_{t-1} + (1-\rho)g_t^2\)

\(v_t = -\frac{\sqrt{V_t}}{\sqrt{G_t}}g_t\)

\(V_{t+1} = \rho V_t + (1 - \rho) v_t^2\)

\(\theta_{t+1} = \theta_t + v_{t+1}\)

特點:

  1. 解決了 Adagrad 梯度消失的問題
  2. 解決了 Adagrad 需要人工選取學習率的問題
  3. 解決了量綱不統一的問題

缺點:RMSprop 是 Adadelta 的特殊情況,效果差不多,而 Adadelta 記憶體和計算量都會大一些,並且沒有 RMSprop 使用廣泛。

Adam

\(m_{t+1} = \beta_1m_t + (1 - \beta_1)g_t\)

\(v_{t+1} = \beta_2v_t + (1 - \beta_2)g_t^2\)

\(\tilde m_t = \frac{m_t}{1-\beta_1^t}\)

\(\tilde v_t = \frac{v_t}{1-\beta_2^t}\)

\(\theta_{t+1} = \theta_t - \frac{\eta}{\sqrt{\tilde v_{t+1}}+\epsilon}\tilde m_{t+1}\)

Nadam (Nesterov Adam)

\(\tilde m_t = \frac{\beta_1m_t}{1 - \beta_1^{t+1}}+\frac{(1-\beta_1)g_{t-1}}{1-\beta_1^t}\)

\(\theta_{t+1} = \theta_t - \frac{\eta}{\sqrt{\tilde v_{t+1}}+\epsilon}\tilde m_{t+1}\)

特點:Adam 是一種結合了 momentum 和 RMSprop 的優化器。非常快,幾乎最快。

關於\(\tilde m_t\)\(\tilde v_t\)的解釋,參考帶偏差修正的指數加權平均 (bias-correction)。

Adam 缺點:最後收斂位置的泛化效果可能會低於 SGDM 等其他方法。一種可能的解釋是 SGDM 更可能在一個比較平坦的極小值處 (Flat Minimum) 停下來,而 Adam 可能停在一個比較尖銳的極小值處 (Sharp Minimum)。

在訓練末期,由於動量的記憶可以維持 \(\frac{1}{1-\beta_2}\) 這麼多步,在這些步中有很大一部分都是亂走,只有幾步是有效的更新,而有效的更新會被亂走(無效更新)的效果抵消。所以 Adam 不能收斂到一個比較好的結果。於是出現了幾種的改進的思路:

  1. 讓 Adam 收斂的效果好一點。如 AMSGrad,AdaBound
  2. 讓 SGDM 收斂的速度快一點。如 Cyclical LR,SGDR,One-cycle LR
  3. 結合 Adam 和 SGDM。如 SWATS

前兩種思路的主要方法都是調整自適應的學習率。

SWATS

先用 Adam 訓練,再用 SGDM finetune。關鍵在於切換的時間和銜接的方法。

特點:簡單粗暴。

缺點:簡單粗暴。

AMSGrad

\(\theta_{t+1} = \theta_t - \frac{\eta}{\sqrt{\tilde v_{t+1}}+\epsilon}\tilde m_{t+1}\)

\(\tilde v_t=\max(\tilde v_{t-1}, v_t)\)

特點:希望 Adam 在訓練末期的有效更新不會被無效更新的效果抵消。解決了 gradient 小的時候 learning rate 太大的情況。

缺點:

  1. 沒有解決 gradient 大的時候 learning rate 太小的情況
  2. 和 Adagrad 一樣,懲罰項可能太大。

AdaBound

\(\theta_{t+1} = \theta_t - Clip(\frac{\eta}{\sqrt{\tilde v_{t+1}}+\epsilon})\tilde m_{t+1}\)

\(Clip(x) = Clip(x, 0.1-\frac{0.1}{(1-\beta_2)t+1}, 0.1+\frac{0.1}{(1-\beta_2)t})\)

特點:經驗性的學習率裁剪

缺點:經驗性的裁剪

Cyclical LR

直線上升,直線下降。形如三角波

特點:針對 SGDM 的學習率調整。大學習率用於快速訓練,小學習率用於 fine tune。其他基於 SGD 的改進都是類似的學習率調整。

SGDR

瞬間上升,餘弦下降。

One-cycle LR

只有一個 cycle 的學習率調整

關於 warm-up 的討論

Q1:什麼是 warm-up?

A1:warm-up 是在訓練開始使用小學習率的一種技術。其可以使得在訓練的初始階段,梯度的變化更加平滑。

Q2:Adam 使用了偏差修正,還需要使用 warm-up 嗎?

A2:需要。warm-up 可以使得前幾個 epoch 的梯度變化比較平滑,這樣後面自適應的學習率也會保持在一個比較平穩的水平。如果不使用 warm-up,梯度變化很大,會導致 RMS 懲罰項很大,訓練速度會顯著下降。

RAdam

\(\rho_t = \rho_\infty - \frac{2t\beta_2^t}{1 - \beta_2^t}\)

\(\rho_\infty = \frac{2}{1 - \beta_2} - 1\)

\(r_t = \sqrt{\frac{(\rho_t-4)(\rho_t-2)\rho_\infty}{(\rho_\infty-4)(\rho_\infty-2)\rho_t}}\)

When \(\rho_t \le 4\) (first few steps of training):

\(\theta_{t+1} = \theta_t - \eta\tilde m_{t+1}\)

When \(\rho_t > 4\):

\(\theta_{t+1} = \theta_t - \frac{\eta r_{t+1}}{\sqrt{\tilde v_{t+1}} + \epsilon}\tilde m_{t+1}\)

說明:

  1. \(\rho_\infty\)是有效記憶長度的一個估計。之前我們使用的有效記憶長度為\(\frac{1}{1-\beta}\),這裡作者使用了兩倍的這個值,那麼衰減的大小就是 \(\frac{1}{e^2}\approx 0.135\)
  2. \(r_t\)是近似\(\frac{Var(\frac{1}{v_\infty})}{Var(\frac{1}{v_t})}\),當 \(v_t\) 的方差很大時,說明走得很不穩定,所以要減小步長,此時 \(Var(\frac{1}{v_t})\) 也很大,\(r_t\) 就比較小;當 \(v_t\) 的方差很小時,說明走得很穩定,所以要增大步長,此時 \(Var(\frac{1}{v_t})\) 也很小,\(r_t\) 就比較大。
  3. 4 是 warm-up 的步數。這個結果不是 ad-hoc 的,而是因為 \(r_t\) 的近似結果中出現了 \(\rho_t-4\),說明這個估計在前幾步是 invalid。所以乾脆把這幾步做成一個簡單的 warm-up。

Lookahead

FOR t = 1, 2, ... (outer loop)

\(\theta_{t,0} = \phi_{t-1}\)

​ FOR i = 1, 2, ..., k (inner loop)

\(\theta_{t,i}=\theta_{t,i-1}+Optim(Loss, data, \theta_{t, i-1})\)

\(\phi_t = \phi_{t-1} + \alpha(\theta_{t,k}-\phi_{t-1})\)

說明:

Lookahead 是一個包裝器,可以使用在任意優化器上面。本質就是,每走 k 步就往初始位置退回一點。\(\alpha\) 可以取 [0, 1] 之間任意值,只要不是非常接近端點,效果就不會太差。

  1. Lookahead 可以非常穩定。因為在比較崎嶇的地方,Lookahead 很容易登上一個比較高的位置然後重新下降,因此很容易從這裡逃離。另外如果有走向崎嶇地方的趨勢,Lookahead 也會及時退出。
  2. Lookahead 泛化效能非常好。原因同上。

關於 momentum 的一點說明

Q:對於包含正則化的 Loss,momentum 裡面是不是應該包含正則化項的動量呢?

A:不要。正則化項的梯度直接更新 \(\theta_t\),不計入 momentum。同時改名為 Weight Decay,不再稱作 Regularization。對應的優化器為 SGDWM 和 AdamW。

總結

  1. 優化器小結

    Team SGD Team Adam
    SGD Adagrad
    SGDM RMSProp
    Learning rate scheduling Adadelta
    NAG Adam
    SGDWM AMSGrad
    AdaBound
    Learning rate scheduling
    RAdam
    Nadam
    AdamW
  2. 使用建議

    SGDM Adam
    Computer vision NLP
    Speech synthesis
    GAN
    Reinforcement learning

Reference:

  1. 李宏毅. 機器學習.公開課
  2. 天澤 28. 深度學習中優化方法.CSDN 部落格

相關文章