標籤:

《An overview of gradient descent optimization algorithms》

本文包含的主要內容

  1. gradient descent基本形式:BGD,SGD,MBGD。

  2. 幾種啟發式優化演算法:momentum,NAG,Adagrad等。

  3. 可視化與一些tricks。

===========================正文開始====================================

Gradient descent variants(BGD,SGD,MBGD)

BGD code:

SGD&MBGD code:

嗯,手寫公式很方便。就醬。

Q:想想看,為什麼後兩者都要shuffle?

Challenges

Q:如何設計learning rate?過大會在目標的附近波動;過小會收斂很慢。

Q:採用動態調整的方式?例如退火等方式,那有些參數也要事先define好....對吧。。。

Q:所有參數都依賴一個learning rate來更新?在什麼樣的場景下,這種缺點會放大?

Q:當是非凸函數時,追求梯度為零向量還不夠,如何避免鞍點?

  • Momentum([物]動量)

這是一種啟發式演算法。形式是這樣的:

既然是啟發式方法,那麼就試圖從啟發的角度去理解它~

即物體的動能 = 上一個時刻的動能 + 上一時刻的勢能差。由於有阻力和轉換時的損失,所以兩者都乘以一個係數。

就像一個小球從坡上向下滾,當前的速度取決於上一個時刻的速度和勢能的改變數。

這樣在更新參數時,除了考慮到梯度以外,還考慮了上一個時刻參數的歷史變更幅度。例如,參數上一次更新幅度較大,並且梯度還不小,那麼再更新時是不是得更猛烈些了~

這樣啟發式演算法,確實從邏輯感知上有它的道理。原文認為其faster convergence and reduced oscillation,前者同意,但後者持保留意見(因為最終結果是一個多維向量綜合作用的結果,還真不好下這個結論)。Accelerate SGD倒是真的。。。

  • Nesterov accelerated gradient(NAG)

還是以上面小球的例子來看,momentum方式下小球完全是一種盲目被動的方式滾下的。這樣有個缺點就是在臨近最優點附近是控制不住速度。我們希望小球很smart,它可以預判後面的"地形",要是後面地形還是很陡,那就繼續堅定不移的大膽走下去;不然的話咱就收斂點~

當然,小球自己也不知道真正要走到哪裡,這裡以

作為近似下一位置,就有:

相比於之前momentum方式是考慮上一時刻的動能和當前點的梯度,而NAG考慮的是上一時刻的動能和近似下一點的梯度。這使得它可以先看看自己的"前途",然後慎重一些。

Hinton的slides是這樣給出的:

感覺還有必要試著解釋一下:

兩個blue vectors分別理解為梯度和動能,兩個向量和即為momentum方式的作用結果。

而靠左邊的brown vector是動能,可以看出它那條blue vector是平行的,但是它預測了下一階段的梯度是red vector,因此向量和就是green vector,即NAG方式的作用結果。

  • Adagrad

"It adapts the learning rate to the parameters, performing larger updates for infrequent and smaller updates for frequent parameters."因此,Adagrad對於稀疏數據上有著良好的表現。

之前所講的方法中所有參數在更新時均使用同一個learning rate,而在Adagrad的每一個參數的每一次更新中都使用不同的learning rate。這樣的話,令第t步更新時對第i個參數的梯度為:

參數的更新的一般形式為:

如上所述,Adagrad的差異之處正是在於learning rate不同於其他,將learning rate改為如下:

這裡的Gt是一個d*d維對角矩陣,對角線上的元素(i,i)表示在第t步更新時,歷史上θi梯度平方和的積累。?只是一個值很小的防止分母為0的平滑項。

Q:若是這樣的話,為什麼在step t用對角矩陣保存中間信息呢?使用一維數組不就可以了么,是為了某些方便計算么?(哪位了解,望指點。

Q:為何帶上平方根符號?據說這樣的效果更好。

個人感覺,巨大多數自適應的learning rate都是有根據變化幅度而更改,並且具有逐漸收斂的特性。所以這種啟發式方法僅是一種可行性方式,並不是唯一的,也絕不是最好的。把握其本質即可。

可視化

Alec Radford這位大哥做了兩張動態圖(知乎上貌似目前還有bug,動態圖需要點擊一下才會動),SGD optimization on loss surface contours:

SGD optimization on saddle point:

一些tricks

  1. 為避免bias,做shuffle。但有時在某種背景下,也可刻意地事先order training examples。

  2. Batch normalization。

  3. Early stopping。若指標趨近平穩,及時終止。

  4. Gradient noise。引入一個符合高斯分布的noise項,使得在poor initialization時具有更好的魯棒性。形式如下:

同時對方差退火,因為隨著訓練進行越來越穩定,noise也隨之減弱,退火項如下:

參考:

[1] sebastianruder.com/opti

[2] cnblogs.com/maybe2030/p

[3] csdn.net/article/2016-0

[4] cs.toronto.edu/~tijmen/

歡迎關注與討論,謝謝。

推薦閱讀:

TAG:机器学习 |