Momentum

Momentum的公式表達

設時間步t的自變數為 oldsymbol{	heta}_t ,學習率為 eta_t 。在 t_0 時刻,速度變數 oldsymbol{v}_0=0 ,在時間步 t>0 ,Momentum關於速度變數 oldsymbol{v}_t和自變數 oldsymbol{	heta}_t ?的迭代方式為:

 egin{aligned} oldsymbol{v}_t &leftarrow gamma oldsymbol{v}_{t-1} + eta_t oldsymbol{g}_tend{aligned}

egin{aligned}oldsymbol{	heta}_t &leftarrow oldsymbol{	heta}_{t-1} - oldsymbol{v}_t end{aligned}

其中 gamma 為超參數,滿足 0leqgamma<1

從上面的式子我們可以看出
  • 速度變數 oldsymbol{v}_t 作用等價於梯度
  • 速度變數 oldsymbol{v}_t 的大小與上一個時刻的速度變數 oldsymbol{v}_{t-1} 和學習率 eta_t 有關,且 gamma 越大, oldsymbol{v}_{t-1} 的作用越大。
  • 由於 oldsymbol{v}_{t-1} + eta_t oldsymbol{g}_t=gamma (gamma oldsymbol{v}_{t-2} + eta_t oldsymbol{g}_{t-1})+ eta_t oldsymbol{g}_t=..... ,歷史的速度變數都將影響當前速度變數的大小,且越近影響越大,相當於歷史速度變數的加權平均,越近權重越大

Momentum可以解決什麼問題?

1.跳出局部最優點

圖片來源於李宏毅老師的課程

如上圖1所示,在黃色箭頭處,本身梯度為零,但是由於歷史的速度變數不為零,會繼續向右運動,而到達紫色箭頭處時,梯度應該向左,但此時歷史的速度變數如果較大且向右,有可能跳出局部最優點,當然,能不能跳出是很難保證的。

2.使得下降的過程更為平滑

圖片來源於李沐老師《動手深度學習》

上圖是一個梯度下降的圖,如果採用momentum,則下降趨勢如下

圖片來源於李沐老師《動手深度學習》

在下降開始階段,歷史速度變數和當前梯度方向相反,則會使得下降的過程更為平滑,避免過度震蕩。

因此Momentum的主要作用在於:
  • 有一定幾率跳出局部最優解
  • 歷史速度變數和當前梯度方向相反時,使得下降的過程更為平滑

Adagrad

Adagrad的公式表示為:

oldsymbol{s}_t leftarrow oldsymbol{s}_{t-1} + oldsymbol{g}_t odot oldsymbol{g}_t

其中 odot 是按元素相乘。 oldsymbol{s}_t為t時刻的狀態變數,為從訓練開始直到t時刻的所有梯度的平方和,我們更新目標函數的自變數 oldsymbol{	heta}_t ?:

oldsymbol{	heta}_t leftarrow oldsymbol{	heta}_{t-1} - frac{eta}{sqrt{oldsymbol{s}_t + epsilon}} odot oldsymbol{g}_t

其中 eta 是學習率, epsilon是為了維持數值穩定性的常數(避免數值溢出),通常非常小。

從上面的式子我們可以看出:

  • Adagrad的分母是所有歷史梯度的累加(均方差),因此歷史梯度越大,當前更新越小。整體的思想是:之前更新大的參數,這次更新更新小一點,反之亦然
  • Adagrad相比於之前介紹的方法,它根據不同參數具有不同的學習率(受分母影響)
  • Adagrad在兩種情況下,同一次更新中的某些參數學習率變得很小:
    • 1.歷史梯度存在很大的值,即參數曾經有過更新很快的記錄
    • 2.參數更新頻率高,梯度為0的次數少,在學習過程中,梯度為0是很常見的,因此adagrad鼓勵那些沒怎麼更新過的參數多更新一點。
  • Adagrad中分母是採用的累積,因此到訓練後期學習率會小得令人髮指,也就是說如果經過一定的迭代次數後模型還沒有找到最優點,那就很難找到最優解了。

RMSProp

RMSProp全稱是 Root Mean Square Prop,它和adagrad類似,可以使得不同的參數具有個性化的學習率,同時可以緩解訓練後期學習率過小的問題,它的公式如下:

oldsymbol{s}_t leftarrow gamma oldsymbol{s}_{t-1} + (1 - gamma) oldsymbol{g}_t odot oldsymbol{g}_t

oldsymbol{	heta}_t leftarrow oldsymbol{	heta}_{t-1} - frac{eta}{sqrt{oldsymbol{s}_t + epsilon}} odot oldsymbol{g}_t

其中 0<gamma<1 ,可以看出與adagrad的區別在於狀態變數s_t的計算對於歷史的狀態變數和當前梯度都做了衰減,因此再迭代過程中梯度不一定是一直衰減,也可能增大。

Adam

Adam可以看做RMSProp和Momentum的結合,類似有:

 egin{aligned} oldsymbol{v}_t &leftarrow gamma_1 oldsymbol{v}_{t-1} + (1-gamma_1 ) oldsymbol{g}_tend{aligned}

oldsymbol{s}_t leftarrow gamma_2 oldsymbol{s}_{t-1} + (1 - gamma_2) oldsymbol{g}_t odot oldsymbol{g}_t

作者建議的 gamma_1=0.9,gamma_2=0.999 ,那麼在訓練剛開始的時候由於 v_{t-1},s_{t-1}都比較小導致 v_{t},s_{t} 較小,因此需要增加一個偏置

hat{oldsymbol{v}}_t leftarrow frac{oldsymbol{v}_t}{1 - eta_1^t}

hat{oldsymbol{s}}_t leftarrow frac{oldsymbol{s}_t}{1 - eta_2^t}

上面兩個式子中的分母可以起到放大梯度的效果,且分母都是隨時間增大的,可以解決訓練開始階段 v_{t},s_{t} 偏小的問題,最後的公式更新為:

oldsymbol{g}_t leftarrow frac{eta hat{oldsymbol{v}}_t}{sqrt{hat{oldsymbol{s}}_t} + epsilon}

oldsymbol{	heta}_t leftarrow oldsymbol{	heta}_{t-1} - oldsymbol{g}_t

最後我們可以總結如下:

  • Momentum是通過改變梯度下降的方向來改進梯度下降方法的,本質是引入了歷史的速度變數 v_{t-1} ,向量的加法會改變梯度的方向,作用有兩點:
    • 有一定幾率跳出局部最優解
    • 歷史速度變數和當前梯度方向相反時,使得下降的過程更為平滑
  • Adagrad和RMSProp是通過狀態變數 s_{t} 對於參數做衰減,由於不同參數的的狀態變數不同,可以個性化地對不同參數梯度做衰減
  • Adam是RMSProp和Momentum的結合,為了避免訓練開始時梯度過小的問題,引入了一個偏置處理。

最後我做了關於梯度下降法的一個思維導圖:

其中關於batch_size的部分可以參考我的博客

【機器學習深度學習】——學習率,梯度下降法,批梯度下降,歸一化


推薦閱讀:
相關文章