1. 程式人生 > >幾種常見的梯度演算法總結

幾種常見的梯度演算法總結

   在深度學習專案裡常常用到一些梯度學習演算法,最常見的我們使用的SGD,Adagrad,Adam,RMSProp和momentum,這裡參考網上別人寫的教程簡要理解一下這些梯度下降演算法。

SGD

   說SGD,就必須先說一下批量梯度下降BGD,其訓練的是整個訓練集的梯度,即:

θ=θηθJ(θ)
其中η是學習率,下同,用來控制更新引數的力度。優點是對於凸目標函式,其可以保證全域性最優,對於非凸目標函式,可以保證一個區域性最優。但是存在一個明顯的缺點,就是在資料量較大時更新會非常慢,無法處理動態產生的新樣本,在這種情況下,就需要考慮SGD。一般的SGD只利用單獨的資料,雖然優化速度快,但是可能會導致收斂更復雜,出現更多的動盪。所以我們一般使用的SGD實際上是MSGD。
   MSGD不同於原始的SGD只利用單個數據,這個梯度下降演算法是將整個資料分成n個batch,每個batch分成m個樣本,每次更新引數利用一個batch的資料(xi,yi)而不是整個訓練集的資料,其更新引數如下所示:
θ=θηθJ(θ;x(i,i+m);y(i,i+m))

通過這種批量的梯度下降,減少了原始SGD引數更新中的動盪;同時利用先進深度學習庫中常見的高度優化矩陣操作來高效地計算小批量的梯度。
當然MSGD也存在許多困難,主要表現如下:
1.學習率選擇較為困難,太小的學習率收斂太慢,過大的學習率會偏離最優點。
2.目前可採用的方法是在訓練過程中調整學習率大小,例如模擬退火演算法:預先定義一個迭代次數m,每執行完m次訓練便減小學習率,或者當損失值低於一個閾值時減小學習率。然而迭代次數和閾值必須事先定義,因此無法適應資料集的特點。
3.一般情況下神經網路面臨的是非凸的優化函式,這也意味著優化容易陷入到區域性最優,也就是陷入到馬鞍面中,即在坡面上,一部分點是上升的,一部分點是下降的。而這種情況比較容易出現在平坦區域,在這種區域中,所有方向的梯度值都幾乎是0,此時SGD很難發揮作用。
介於此,可以使用一些優化演算法對SGD做進一步的優化,常見的有;

Momentum

   SGD的問題是其依賴於當前batch的梯度,因此導致下降不穩定,出現來回波動的情況,如下圖所示:



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

vt=γvt1+ηθJ(θ)
θ=θvt
根據上式,可以更直觀理解動量的含義,當前梯度和上次梯度加權,當方向一致時,累加導致更新步長變大;如果方向不同,則相互抵消導致更新趨向於平衡。

Adagrad

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

θt+1,i=θt,iηGt,ii+ϵθJ(θt,i)
   其中Gt是對角矩陣,每個對角線位置i,i為對應的引數θi從第一輪到第t輪的平方和,ϵ是平滑項,防止除0。通過該式,還可以看出,隨著訓練次數的增加,分母變大,學習率會自動下降。但是訓練的中後期,分母上梯度平方的累加將會越來越大,從而梯度趨近於0,使得訓練提前結束。

RMSprop

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

E[g2]t=γE[g2]t1+(1γ)gt2
θt+1=θtηE[g2]t+ϵgt

Adam

   Adam(Adaptive Moment Estimation)是另一種自適應學習率的方法。與RMSprop相比,其在梯度平方估計(二階矩)的基礎上增加了對梯度(一階矩)的估計,Adam的優點主要在於經過偏置校正後,每一次迭代學習率都有個確定範圍,使得引數比較平穩。公式表達如下:

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