各種優化方法總結比較(sgd/momentum/Nesterov/adagrad/adadelta)


前言

這里討論的優化問題指的是,給定目標函數f(x),我們需要找到一組參數x,使得f(x)的值最小。

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

Batch gradient descent

梯度更新規則:
BGD 采用整個訓練集的數據來計算 cost function 對參數的梯度:

 
 

缺點:
由於這種方法是在一次更新中,就對整個數據集計算梯度,所以計算起來非常慢,遇到很大量的數據集也會非常棘手,而且不能投入新數據實時更新模型。

我們會事先定義一個迭代次數 epoch,首先計算梯度向量 params_grad,然后沿着梯度的方向更新參數 params,learning rate 決定了我們每一步邁多大。

Batch gradient descent 對於凸函數可以收斂到全局極小值,對於非凸函數可以收斂到局部極小值。

SGD(Stochastic gradient descent)

梯度更新規則:
和 BGD 的一次用所有數據計算梯度相比,SGD 每次更新時對每個樣本進行梯度更新,
對於很大的數據集來說,可能會有相似的樣本,這樣 BGD 在計算梯度時會出現冗余,
而 SGD 一次只進行一次更新,就沒有冗余,而且比較快,並且可以新增樣本。

 
缺點:
但是 SGD 因為更新比較頻繁,會造成 cost function 有嚴重的震盪。

BGD 可以收斂到局部極小值,當然 SGD 的震盪可能會跳到更好的局部極小值處。

當我們稍微減小 learning rate,SGD 和 BGD 的收斂性是一樣的。

Mini-batch gradient descent

梯度更新規則:
MBGD 每一次利用一小批樣本,即 n 個樣本進行計算,
這樣它可以降低參數更新時的方差,收斂更穩定,
另一方面可以充分地利用深度學習庫中高度優化的矩陣操作來進行更有效的梯度計算。

 
 

和 SGD 的區別是每一次循環不是作用於每個樣本,而是具有 n 個樣本的批次

超參數設定值:
n 一般取值在 50~256

缺點:
Mini-batch gradient descent 不能保證很好的收斂性,

  1. learning rate 如果選擇的太小,收斂速度會很慢,如果太大,loss function 就會在極小值處不停地震盪甚至偏離。

有一種措施是先設定大一點的學習率,當兩次迭代之間的變化低於某個閾值后,就減小 learning rate,不過這個閾值的設定需要提前寫好,這樣的話就不能夠適應數據集的特點。

  1. 此外,這種方法是對所有參數更新時應用同樣的 learning rate,如果我們的數據是稀疏的,我們更希望對出現頻率低的特征進行大一點的更新。

  2. 另外,對於非凸函數,還要避免陷於局部極小值處,或者鞍點處,因為鞍點周圍的error 是一樣的,所有維度的梯度都接近於0,SGD 很容易被困在這里。

鞍點就是:一個光滑函數的鞍點鄰域的曲線,曲面,或超曲面,都位於這點的切線的不同邊。
例如這個二維圖形,像個馬鞍:在x-軸方向往上曲,在y-軸方向往下曲,鞍點就是(0,0)

 
         

 

Momentum

SGD方法的一個缺點是,其更新方向完全依賴於當前的batch,因而其更新十分不穩定。解決這一問題的一個簡單的做法便是引入momentum。

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

Δxt=ρΔxt1ηgt

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

Nesterov Momentum

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

其基本思路如下圖:

 

Nesterov Momentum

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

公式描述為: 

Δxt=ρΔxt1ηΔf(xt+ρΔxt1)

Adagrad

上面提到的方法對於所有參數都使用了同一個更新速率。但是同一個更新速率不一定適合所有參數。比如有的參數可能已經到了僅需要微調的階段,但又有些參數由於對應樣本少等原因,還需要較大幅度的調動。

Adagrad就是針對這一問題提出的,自適應地為各個參數分配不同學習率的算法。

 

其中gt 同樣是當前的梯度,連加和開根號都是元素級別的運算。eta 是初始學習率,由於之后會自動調整學習率,所以初始值就不像之前的算法那樣重要了。而ϵ是一個比較小的數,用來保證分母非0。

其含義是,對於每個參數,隨着其更新的總距離增多,其學習速率也隨之變慢。

Adadelta

Adagrad算法存在三個問題

  • 其學習率是單調遞減的,訓練后期學習率非常小
  • 其需要手工設置一個全局的初始學習率
  • 更新xt時,左右兩邊的單位不統一

Adadelta針對上述三個問題提出了比較漂亮的解決方案。

首先,針對第一個問題,我們可以只使用adagrad的分母中的累計項離當前時間點比較近的項。

這里ρ是衰減系數,通過這個衰減系數,我們令每一個時刻的gt隨之時間按照ρ指數衰減,這樣就相當於我們僅使用離當前時刻比較近的gt信息,從而使得還很長時間之后,參數仍然可以得到更新。

RMSprop

RMSprop 是 Geoff Hinton 提出的一種自適應學習率方法。

RMSprop 和 Adadelta 都是為了解決 Adagrad 學習率急劇下降問題的,

梯度更新規則:
RMSprop 與 Adadelta 的第一種形式相同:

 
 

超參數設定值:
Hinton 建議設定 γ 為 0.9, 學習率 η 為 0.001。

Adam

這個算法是另一種計算每個參數的自適應學習率的方法。

除了像 Adadelta 和 RMSprop 一樣存儲了過去梯度的平方 vt 的指數衰減平均值 ,也像 momentum 一樣保持了過去梯度 mt 的指數衰減平均值:

 
 

如果 mt 和 vt 被初始化為 0 向量,那它們就會向 0 偏置,所以做了偏差校正,
通過計算偏差校正后的 mt 和 vt 來抵消這些偏差:

 
 

梯度更新規則:

 
 

超參數設定值:
建議 β1 = 0.9,β2 = 0.999,ϵ = 10e−8

實踐表明,Adam 比其他適應性學習方法效果要好。

如何選擇?

如果數據是稀疏的,就用自適用方法,即 Adagrad, Adadelta, RMSprop, Adam。

RMSprop, Adadelta, Adam 在很多情況下的效果是相似的。

Adam 就是在 RMSprop 的基礎上加了 bias-correction 和 momentum,

隨着梯度變的稀疏,Adam 比 RMSprop 效果會好。

整體來講,Adam 是最好的選擇。

很多論文里都會用 SGD,沒有 momentum 等。SGD 雖然能達到極小值,但是比其它算法用的時間長,而且可能會被困在鞍點。

如果需要更快的收斂,或者是訓練更深更復雜的神經網絡,需要用一種自適應的算法。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM