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}\),因為可以證明
\(\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 會對後面很長一段時間產生影響。因此加入了一個修正項使得:
- 在前幾項使得\(v_{t+1}\)儘量接近\(\theta_t\)
- 之後使得\(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}\)
特點:
- 解決了 Adagrad 梯度消失的問題
- 解決了 Adagrad 需要人工選取學習率的問題
- 解決了量綱不統一的問題
缺點: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 不能收斂到一個比較好的結果。於是出現了幾種的改進的思路:
- 讓 Adam 收斂的效果好一點。如 AMSGrad,AdaBound
- 讓 SGDM 收斂的速度快一點。如 Cyclical LR,SGDR,One-cycle LR
- 結合 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 太大的情況。
缺點:
- 沒有解決 gradient 大的時候 learning rate 太小的情況
- 和 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}\)
說明:
- \(\rho_\infty\)是有效記憶長度的一個估計。之前我們使用的有效記憶長度為\(\frac{1}{1-\beta}\),這裡作者使用了兩倍的這個值,那麼衰減的大小就是 \(\frac{1}{e^2}\approx 0.135\)。
- \(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\) 就比較大。
- 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] 之間任意值,只要不是非常接近端點,效果就不會太差。
- Lookahead 可以非常穩定。因為在比較崎嶇的地方,Lookahead 很容易登上一個比較高的位置然後重新下降,因此很容易從這裡逃離。另外如果有走向崎嶇地方的趨勢,Lookahead 也會及時退出。
- Lookahead 泛化效能非常好。原因同上。
關於 momentum 的一點說明
Q:對於包含正則化的 Loss,momentum 裡面是不是應該包含正則化項的動量呢?
A:不要。正則化項的梯度直接更新 \(\theta_t\),不計入 momentum。同時改名為 Weight Decay,不再稱作 Regularization。對應的優化器為 SGDWM 和 AdamW。
總結
-
優化器小結
Team SGD Team Adam SGD Adagrad SGDM RMSProp Learning rate scheduling Adadelta NAG Adam SGDWM AMSGrad AdaBound Learning rate scheduling RAdam Nadam AdamW -
使用建議
SGDM Adam Computer vision NLP Speech synthesis GAN Reinforcement learning
Reference:
- 李宏毅. 機器學習.公開課
- 天澤 28. 深度學習中優化方法.CSDN 部落格