深度學習優化算法總結

 

前言

本文討論的優化問題指的是,給定目標函數f(x),咱們須要找到一組參數x(權重),使得f(x)的值最小。算法

如下內容假設讀者已經瞭解機器學習基本知識,和梯度降低的原理。機器學習

 

SGD

SGD指stochastic gradient descent,即隨機梯度降低。是梯度降低的batch版本。函數

對於訓練數據集,咱們首先將其分紅n個batch,每一個batch包含m個樣本。咱們每次更新都利用一個batch的數據,而非整個訓練集。即:性能

其中,η爲學習率,gt爲x在t時刻的梯度。 學習

這麼作的好處在於:大數據

  • 當訓練數據太多時,利用整個數據集更新每每時間上不顯示。batch的方法能夠減小機器的壓力,而且能夠更快地收斂。
  • 當訓練集有不少冗餘時(相似的樣本出現屢次),batch方法收斂更快。以一個極端狀況爲例,若訓練集前一半和後一半梯度相同。那麼若是前一半做爲一個batch,後一半做爲另外一個batch,那麼在一次遍歷訓練集時,batch的方法向最優解前進兩個step,而總體的方法只前進一個step。

 

Momentum

SGD方法的一個缺點是,其更新方向徹底依賴於當前的batch,於是其更新十分不穩定。解決這一問題的一個簡單的作法即是引入momentum。優化

momentum即動量,它模擬的是物體運動時的慣性,即更新的時候在必定程度上保留以前更新的方向,同時利用當前batch的梯度微調最終的更新方向。這樣一來,能夠在必定程度上增長穩定性,從而學習地更快,而且還有必定擺脫局部最優的能力:spa

其中,ρ 即momentum,表示要在多大程度上保留原來的更新方向,這個值在0-1之間,在訓練開始時,因爲梯度可能會很大,因此初始值通常選爲0.5;當梯度不那麼大時,改成0.9。η 是學習率,即當前batch的梯度多大程度上影響最終更新方向,跟普通的SGD含義相同。ρ 與 η 之和不必定爲1。blog

 

Nesterov Momentum

這是對傳統momentum方法的一項改進,由Ilya Sutskever(2012 unpublished)在Nesterov工做的啓發下提出的。內存

  Nesterov Momentum

首先,按照原來的更新方向更新一步(棕色線),而後在該位置計算梯度值(紅色線),而後用這個梯度值修正最終的更新方向(綠色線)。上圖中描述了兩步的更新示意圖,其中藍色線是標準momentum更新路徑。

公式描述爲:

 

Adagrad 

Adagrad實際上是對學習率進行了一個約束。即:

此處,對g_t從1到t進行一個遞推造成一個約束項regularizer,-\frac{1}{\sqrt{\sum_{r=1}^t(g_r)^2+\epsilon}},\epsilon用來保證分母非0

特色:

  • 前期g_t較小的時候, regularizer較大,可以放大梯度
  • 後期g_t較大的時候,regularizer較小,可以約束梯度
  • 適合處理稀疏梯度

缺點:

  • 由公式能夠看出,仍依賴於人工設置一個全局學習率 
  • \eta設置過大的話,會使regularizer過於敏感,對梯度的調節太大
  • 中後期,分母上梯度平方的累加將會愈來愈大,使gradient\to0,使得訓練提早結束

 

Adadelta 

Adadelta是對Adagrad的擴展,最初方案依然是對學習率進行自適應約束,可是進行了計算上的簡化。Adagrad會累加以前全部的梯度平方,而Adadelta只累加固定大小的項,而且也不直接存儲這些項,僅僅是近似計算對應的平均值。即:

n_t=\nu*n_{t-1}+(1-\nu)*g_t^2

\Delta{\theta_t} = -\frac{\eta}{\sqrt{n_t+\epsilon}}*g_t

在此處Adadelta其實仍是依賴於全局學習率的,可是做者作了必定處理,通過近似牛頓迭代法(求根點)以後:

E|g^2|_t=\rho*E|g^2|_{t-1}+(1-\rho)*g_t^2

\Delta{x_t}=-\frac{\sqrt{\sum_{r=1}^{t-1}\Delta{x_r}}}{\sqrt{E|g^2|_t+\epsilon}}

其中,E表明求指望。 

此時,能夠看出Adadelta已經不用依賴於全局學習率了。 

特色:

  • 訓練初中期,加速效果不錯,很快 
  • 訓練後期,反覆在局部最小值附近抖動

 

RMSprop 

RMSprop能夠算做Adadelta的一個特例: 

\rho=0.5時,E|g^2|_t=\rho*E|g^2|_{t-1}+(1-\rho)*g_t^2就變爲了求梯度平方和的平均數。

若是再求根的話,就變成了RMS(均方根): 

RMS|g|_t=\sqrt{E|g^2|_t+\epsilon}

此時,這個RMS就能夠做爲學習率\eta的一個約束:

\Delta{x_t}=-\frac{\eta}{RMS|g|_t}*g_t

特色:

  • 其實RMSprop依然依賴於全局學習率 
  • RMSprop算是Adagrad的一種發展,和Adadelta的變體,效果趨於兩者之間
  • 適合處理非平穩目標- 對於RNN效果很好

 

Adam 

Adam(Adaptive Moment Estimation)本質上是帶有動量項的RMSprop,它利用梯度的一階矩估計和二階矩估計動態調整每一個參數的學習率。Adam的優勢主要在於通過偏置校訂後,每一次迭代學習率都有個肯定範圍,使得參數比較平穩。公式以下:

m_t=\mu*m_{t-1}+(1-\mu)*g_t

n_t=\nu*n_{t-1}+(1-\nu)*g_t^2

\hat{m_t}=\frac{m_t}{1-\mu^t}

\hat{n_t}=\frac{n_t}{1-\nu^t}

\Delta{\theta_t}=-\frac{\hat{m_t}}{\sqrt{\hat{n_t}}+\epsilon}*\eta

其中,m_tn_t分別是對梯度的一階矩估計和二階矩估計,u和v爲衰減率,u一般爲0.9,v一般爲0.999,能夠看做對指望E|g_t|E|g_t^2|的估計;\hat{m_t}\hat{n_t}是對m_tn_t的校訂,這樣能夠近似爲對指望的無偏估計。能夠看出,直接對梯度的矩估計對內存沒有額外的要求,並且能夠根據梯度進行動態調整,而-\frac{\hat{m_t}}{\sqrt{\hat{n_t}}+\epsilon}對學習率造成一個動態約束,並且有明確的範圍。

特色:

  • 結合了Adagrad善於處理稀疏梯度和RMSprop善於處理非平穩目標的優勢 
  • 對內存需求較小 
  • 爲不一樣的參數計算不一樣的自適應學習率 
  • 也適用於大多非凸優化- 適用於大數據集和高維空間

 

性能比較

損失曲面的輪廓和不一樣優化算法的時間演化(Contours of a loss surface and time evolution of different optimization algorithms)

 

 

 

 

參考:

[1] Optimization Algorithms for Deep Learning

[2] Adam — latest trends in deep learning optimization

[3] Intro to optimization in deep learning: Momentum, RMSProp and Adam

[4] Gradient Descent based Optimization Algorithms for Deep Learning Models Training

相關文章
相關標籤/搜索