1. 程式人生 > >優化方法總結:SGD,Momentum,AdaGrad,RMSProp,Adam

優化方法總結:SGD,Momentum,AdaGrad,RMSProp,Adam

1.SGD

Batch Gradient Descent

在每一輪的訓練過程中,Batch Gradient Descent演算法用整個訓練集的資料計算cost fuction的梯度,並用該梯度對模型引數進行更新:

Θ=ΘαΘJ(Θ)Θ=Θ−α⋅▽ΘJ(Θ)

優點:

  • cost fuction若為凸函式,能夠保證收斂到全域性最優值;若為非凸函式,能夠收斂到區域性最優值

缺點:

  • 由於每輪迭代都需要在整個資料集上計算一次,所以批量梯度下降可能非常慢
  • 訓練數較多時,需要較大記憶體
  • 批量梯度下降不允許線上更新模型,例如新增例項。

Stochastic Gradient Descent

和批梯度下降演算法相反,Stochastic gradient descent 演算法每讀入一個數據,便立刻計算cost fuction的梯度來更新引數:

Θ=ΘαΘJ(Θ;x(i),y(i))Θ=Θ−α⋅▽ΘJ(Θ;x(i),y(i))

優點:

  • 演算法收斂速度快(在Batch Gradient Descent演算法中, 每輪會計算很多相似樣本的梯度, 這部分是冗餘的)
  • 可以線上更新
  • 有機率跳出一個比較差的區域性最優而收斂到一個更好的區域性最優甚至是全域性最優

缺點:

  • 容易收斂到區域性最優,並且容易被困在鞍點

Mini-batch Gradient Descent

mini-batch Gradient Descent的方法是在上述兩個方法中取折衷, 每次從所有訓練資料中取一個子集(mini-batch) 用於計算梯度:

Θ=Θ
αΘJ(Θ;x(i:i+n),y(i:i+n))
Θ=Θ−α⋅▽ΘJ(Θ;x(i:i+n),y(i:i+n))

Mini-batch Gradient Descent在每輪迭代中僅僅計算一個mini-batch的梯度,不僅計算效率高,而且收斂較為穩定。該方法是目前深度學訓練中的主流方法

上述三個方法面臨的主要挑戰如下:

  • 選擇適當的學習率αα 較為困難。太小的學習率會導致收斂緩慢,而學習速度太塊會造成較大波動,妨礙收斂。
  • 目前可採用的方法是在訓練過程中調整學習率大小,例如模擬退火演算法:預先定義一個迭代次數m,每執行完m次訓練便減小學習率,或者當cost function的值低於一個閾值時減小學習率。然而迭代次數和閾值必須事先定義,因此無法適應資料集的特點。
  • 上述方法中, 每個引數的 learning rate 都是相同的,這種做法是不合理的:如果訓練資料是稀疏的,並且不同特徵的出現頻率差異較大,那麼比較合理的做法是對於出現頻率低的特徵設定較大的學習速率,對於出現頻率較大的特徵資料設定較小的學習速率。
  • 近期的的研究表明,深層神經網路之所以比較難訓練,並不是因為容易進入local minimum。相反,由於網路結構非常複雜,在絕大多數情況下即使是 local minimum 也可以得到非常好的結果。而之所以難訓練是因為學習過程容易陷入到馬鞍面中,即在坡面上,一部分點是上升的,一部分點是下降的。而這種情況比較容易出現在平坦區域,在這種區域中,所有方向的梯度值都幾乎是 0。

2. Momentum

SGD方法的一個缺點是其更新方向完全依賴於當前batch計算出的梯度,因而十分不穩定。Momentum演算法借用了物理中的動量概念,它模擬的是物體運動時的慣性,即更新的時候在一定程度上保留之前更新的方向,同時利用當前batch的梯度微調最終的更新方向。這樣一來,可以在一定程度上增加穩定性,從而學習地更快,並且還有一定擺脫區域性最優的能力:

vt=γvt1+αΘJ(Θ)vt=γ⋅vt−1+α⋅▽ΘJ(Θ)

Momentum演算法會觀察歷史梯度vt1vt−1,若當前梯度的方向與歷史梯度一致(表明當前樣本不太可能為異常點),則會增強這個方向的梯度,若當前梯度與歷史梯方向不一致,則梯度會衰減。一種形象的解釋是:我們把一個球推下山,球在下坡時積聚動量,在途中變得越來越快,γ可視為空氣阻力,若球的方向發生變化,則動量會衰減。

3. Nesterov Momentum

在小球向下滾動的過程中,我們希望小球能夠提前知道在哪些地方坡面會上升,這樣在遇到上升坡面之前,小球就開始減速。這方法就是Nesterov Momentum,其在凸優化中有較強的理論保證收斂。並且,在實踐中Nesterov Momentum也比單純的 Momentum 的效果好:

vt=γvt1+αΘJ(Θγvt1)vt=γ⋅vt−1+α⋅▽ΘJ(Θ−γvt−1)

其核心思想是:注意到 momentum 方法,如果只看 γ * v 項,那麼當前的 θ經過 momentum 的作用會變成 θ+γ * v。因此可以把 θ+γ * v這個位置看做是當前優化的一個”展望”位置。所以,可以在 θ+γ * v求導, 而不是原始的θ。

這裡寫圖片描述

4. Adagrad

上述方法中,對於每一個引數θiθi 的訓練都使用了相同的學習率α。Adagrad演算法能夠在訓練中自動的對learning rate進行調整,對於出現頻率較低引數採用較大的α更新;相反,對於出現頻率較高的引數採用較小的α更新。因此,Adagrad非常適合處理稀疏資料。

我們設gt,igt,i。因此,SGD中引數更新的過程可寫為:

Θt+1,i=Θt,iαgt,iΘt+1,i=Θt,i−α⋅gt,i

Adagrad在每輪訓練中對每個引數θiθi的學習率進行更新,引數更新公式如下:

Θt+1,i=Θt,iαGt,ii+ϵgt,iΘt+1,i=Θt,i−αGt,ii+ϵ⋅gt,i

其中,GtRd×dGt∈Rd×d從第1輪到第t輪梯度的平方和。ϵ是平滑項,用於避免分母為0,一般取值1e−8。Adagrad的缺點是在訓練的中後期,分母上梯度平方的累加將會越來越大,從而梯度趨近於0,使得訓練提前結束。

5. RMSprop

RMSprop是Geoff Hinton提出的一種自適應學習率方法。Adagrad會累加之前所有的梯度平方,而RMSprop僅僅是計算對應的平均值,因此可緩解Adagrad演算法學習率下降較快的問題。

E[g2]t=0.9E[g2]t1+0.1g2tE[g2]t=0.9E[g2]t−1+0.1gt2

6. Adam

Adam(Adaptive Moment Estimation)是另一種自適應學習率的方法。它利用梯度的一階矩估計和二階矩估計動態調整每個引數的學習率。Adam的優點主要在於經過偏置校正後,每一次迭代學習率都有個確定範圍,使得引數比較平穩。公式如下:

mt=β1mt1+(1β1)gtmt=β1mt−1+(1−β1)gt

其中,mtmt。 另外,在資料比較稀疏的時候,adaptive的方法能得到更好的效果,例如Adagrad,RMSprop, Adam 等。Adam 方法也會比 RMSprop方法收斂的結果要好一些, 所以在實際應用中 ,Adam為最常用的方法,可以比較快地得到一個預估結果。

最後兩張動圖從直觀上展現了演算法的優化過程。第一張圖為不同演算法在損失平面等高線上隨時間的變化情況,第二張圖為不同演算法在鞍點處的行為比較。

這裡寫圖片描述
這裡寫圖片描述

7. 參考資料