1. 程式人生 > >【機器學習】梯度下降 II

【機器學習】梯度下降 II

# Gradient Descent 梯度下降 II 關於 Gradient Descent 的直觀解釋,參考上一篇部落格[【機器學習】梯度下降 I](https://www.cnblogs.com/xuruihan/p/13487979.htmlfalse) 本模組介紹幾種梯度下降模型。定義符號標記如下: - $\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. 李巨集毅. [機器學習.公開課](http://speech.ee.ntu.edu.tw/~tlkagk/courses_ML20.html) 2. 天澤 28. [深度學習中優化方法.CSDN 部落格](https://blog.csdn.net/u012328159/article/details/80