深度學習最全優化方法---來源於知乎

ycszen ycszen
1 年前

前言

(標題不能再中二了)本文僅對一些常見的優化方法進行直觀介紹和簡單的比較,各類優化方法的詳細內容及公式只好去認真啃論文了,在此我就不贅述了。react

SGD

此處的SGD指mini-batch gradient descent,關於batch gradient descent, stochastic gradient descent, 以及 mini-batch gradient descent的具體區別就不細說了。如今的SGD通常都指mini-batch gradient descent。算法

SGD就是每一次迭代計算mini-batch的梯度,而後對參數進行更新,是最多見的優化方法了。即:網絡

g_t=\nabla_{\theta_{t-1}}{f(\theta_{t-1})}

\Delta{\theta_t}=-\eta*g_t

其中,\eta是學習率,g_t是梯度 SGD徹底依賴於當前batch的梯度,因此\eta可理解爲容許當前batch的梯度多大程度影響參數更新app

缺點:(正由於有這些缺點才讓這麼多大神發展出了後續的各類算法)ide

  • 選擇合適的learning rate比較困難 - 對全部的參數更新使用一樣的learning rate。對於稀疏數據或者特徵,有時咱們可能想更新快一些對於不常常出現的特徵,對於常出現的特徵更新慢一些,這時候SGD就不太能知足要求了
  • SGD容易收斂到局部最優,而且在某些狀況下可能被困在鞍點【原來寫的是「容易困於鞍點」,經查閱論文發現,其實在合適的初始化和step size的狀況下,鞍點的影響並沒這麼大。感謝@冰橙的指正】

Momentum

momentum是模擬物理裏動量的概念,積累以前的動量來替代真正的梯度。公式以下:學習

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

\Delta{\theta_t}=-\eta*m_t

其中,\mu是動量因子大數據

特色:優化

  • 降低初期時,使用上一次參數更新,降低方向一致,乘上較大的\mu可以進行很好的加速
  • 降低中後期時,在局部最小值來回震盪的時候,gradient\to0\mu使得更新幅度增大,跳出陷阱
  • 在梯度改變方向的時候,\mu可以減小更新 總而言之,momentum項可以在相關方向加速SGD,抑制振盪,從而加快收斂

Nesterov

nesterov項在梯度更新時作一個校訂,避免前進太快,同時提升靈敏度。 將上一節中的公式展開可得:ui

\Delta{\theta_t}=-\eta*\mu*m_{t-1}-\eta*g_t

能夠看出,m_{t-1}
並無直接改變當前梯度g_t,因此Nesterov的改進就是讓以前的動量直接影響當前的動量。即:this

g_t=\nabla_{\theta_{t-1}}{f(\theta_{t-1}-\eta*\mu*m_{t-1})}

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

\Delta{\theta_t}=-\eta*m_t

因此,加上nesterov項後,梯度在大的跳躍後,進行計算對當前梯度進行校訂。以下圖:

momentum首先計算一個梯度(短的藍色向量),而後在加速更新梯度的方向進行一個大的跳躍(長的藍色向量),nesterov項首先在以前加速的梯度方向進行一個大的跳躍(棕色向量),計算梯度而後進行校訂(綠色梯向量)

其實,momentum項和nesterov項都是爲了使梯度更新更加靈活,對不一樣狀況有針對性。可是,人工設置一些學習率總仍是有些生硬,接下來介紹幾種自適應學習率的方法

Adagrad

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

n_t=n_{t-1}+g_t^2

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

此處,對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分別是對梯度的一階矩估計和二階矩估計,能夠看做對指望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善於處理非平穩目標的優勢
  • 對內存需求較小
  • 爲不一樣的參數計算不一樣的自適應學習率
  • 也適用於大多非凸優化 - 適用於大數據集和高維空間

Adamax

Adamax是Adam的一種變體,此方法對學習率的上限提供了一個更簡單的範圍。公式上的變化以下:

n_t=max(\nu*n_{t-1},|g_t|)

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

能夠看出,Adamax學習率的邊界範圍更簡單

Nadam

Nadam相似於帶有Nesterov動量項的Adam。公式以下:

\hat{g_t}=\frac{g_t}{1-\Pi_{i=1}^t\mu_i}

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

\hat{m_t}=\frac{m_t}{1-\Pi_{i=1}^{t+1}\mu_i}

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

\hat{n_t}=\frac{n_t}{1-\nu^t} \bar{m_t}=(1-\mu_t)*\hat{g_t}+\mu_{t+1}*\hat{m_t}

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

能夠看出,Nadam對學習率有了更強的約束,同時對梯度的更新也有更直接的影響。通常而言,在想使用帶動量的RMSprop,或者Adam的地方,大多可使用Nadam取得更好的效果。

經驗之談

  • 對於稀疏數據,儘可能使用學習率可自適應的優化方法,不用手動調節,並且最好採用默認值
  • SGD一般訓練時間更長,可是在好的初始化和學習率調度方案的狀況下,結果更可靠
  • 若是在乎更快的收斂,而且須要訓練較深較複雜的網絡時,推薦使用學習率自適應的優化方法。
  • Adadelta,RMSprop,Adam是比較相近的算法,在類似的狀況下表現差很少。
  • 在想使用帶動量的RMSprop,或者Adam的地方,大多可使用Nadam取得更好的效果
最後展現兩張可厲害的圖,一切盡在圖中啊,上面的都沒啥用了... ...

損失平面等高線

在鞍點處的比較

 

 

一、各類優化方法

梯度降低方法爲何可以達到最優勢

 

sgd:震動可以跳出局部最小(還有一種模擬退火方法)

batch sgd :速度要慢

monument :

Momentum is a method that helps accelerate SGD in the relevant direction and dampens oscillations

The momentum term increases for dimensions whose gradients point in the same directions and reduces updates for dimensions whose gradients change directions. As a result, we gain faster convergence and reduced oscillation

若是梯度方向相同就會increase,不一樣就會decrease,加快收斂,同時可以抑制震盪

 

adagrad:

It adapts the learning rate to the parameters, performing larger updates for infrequent and smaller updates for frequent parameters. For this reason, it is well-suited for dealing with sparse data

對罕見的參數更新快(學習率大),不罕見的參數更新慢(學習率小),很是適合稀疏數據

One of Adagrad's main benefits is that it eliminates the need to manually tune the learning rate. Most implementations use a default value of 0.01 and leave it at that.

優勢是:不須要手工去調整學習率

Adagrad's main weakness is its accumulation of the squared gradients in the denominator: Since every added term is positive, the accumulated sum keeps growing during training. This in turn causes the learning rate to shrink and eventually become infinitesimally small, at which point the algorithm is no longer able to acquire additional knowledge. The following algorithms aim to resolve this flaw.

缺點是:分母上面的梯度均方的累加,致使學習率縮小,變得無限小

 

 

adadelta:

Adadelta is an extension of Adagrad that seeks to reduce its aggressive, monotonically decreasing learning rate. Instead of accumulating all past squared gradients, Adadelta restricts the window of accumulated past gradients to some fixed size 

限制過去梯度的累加值在一個固定的大小

 

adam:

既可以自動調整學習率像adagrad,又結合了monument的優勢

 
相關文章
相關標籤/搜索