1. 程式人生 > >深度學習中的優化器(optimizer)

深度學習中的優化器(optimizer)

今天學習tensorflow的過程中看到了tf.train.GradientDescentOptimizer 、tf.train.AdamOptimizer Adam、tf.train.MomentumOptimizer 這些,發現自己對優化器的認識還僅僅停留在隨機梯度下降的水平,遂找了幾個部落格,看了一下,現總結如下:
1.如何選擇優化器 optimizer,這篇文章介紹了9種優化器,從最基本的批量梯度下降演算法,到效果很好的Adam,建議一讀。
2.梯度下降優化演算法綜述,這篇部落格翻譯的是An overview of gradient descent optimization algorithms

,英文好的建議看英文論文,如果想快速閱讀了解建議讀中文。
3.花書中也有相關的章節,例如8.3
4.對於這些優化的一個其他的總結也有一個Adam演算法那麼好為什麼還對SGD念念不忘
5.知乎上的介紹

************************** 我是分割線 ***********************

無動量優化演算法 (固定學習率的優化演算法)

首先來看一下梯度下降最常見的三種變形 BGD,SGD,MBGD, 這三種形式的區別就是取決於我們用多少資料來計算目標函式的梯度, 這樣的話自然就涉及到一個 trade-off,即引數更新的準確率和執行時間。

幾種優化器效果圖點這裡,批量梯度下降因為需要先遍歷一遍資料才做更新,所以對於資料量較大的不合適,太慢了,對於隨機梯度下降,對於每一個數據都會進行一次引數更新,避免了剛才的那種遍歷所有的資料造成的浪費時間,但是太靈活了,容易發生震盪,那麼很容易想到,採用小批量資料進行一次引數更新,這就是mini-batch gradient descent 。

BGD 採用整個訓練集的資料來計算 cost function 對引數的梯度:
θ=θηθ J(θ)

SGD 採用整個訓練集的資料來計算 cost function 對引數的梯度:
θ=θη

θ J(θ;xi;yi)

MBGD 採用整個訓練集的資料來計算 cost function 對引數的梯度:
θ=θηθ J(θ;xi,i+n;yi,i+n)

加入一維動量(固定學習率的優化演算法)

SGD with Momentum

為了抑制SGD的震盪,SGDM認為梯度下降過程可以加入慣性。下坡的時候,如果發現是陡坡,那就利用慣性跑的快一些。SGDM全稱是SGD with momentum,在SGD基礎上引入了一階動量。

SGD with Nesterov Acceleration

SGD 還有一個問題是困在區域性最優的溝壑裡面震盪。想象一下你走到一個盆地,四周都是略高的小山,你覺得沒有下坡的方向,那就只能待在這裡了。可是如果你爬上高地,就會發現外面的世界還很廣闊。因此,我們不能停留在當前位置去觀察未來的方向,而要向前一步、多看一步、看遠一些。

加入二維動量 (自適應學習率的優化演算法)

此前我們都沒有用到二階動量。二階動量的出現,才意味著“自適應學習率”優化演算法時代的到來。SGD及其變種以同樣的學習率更新每個引數,但深度神經網路往往包含大量的引數,這些引數並不是總會用得到(想想大規模的embedding)。對於經常更新的引數,我們已經積累了大量關於它的知識,不希望被單個樣本影響太大,希望學習速率慢一些;對於偶爾更新的引數,我們瞭解的資訊太少,希望能從每個偶然出現的樣本身上多學一些,即學習速率大一些。

Adagrad

這個演算法就可以對低頻的引數做較大的更新,對高頻的做較小的更新,也因此,對於稀疏的資料它的表現很好,很好地提高了 SGD 的魯棒性,例如識別 Youtube 視訊裡面的貓,訓練 GloVe word embeddings,因為它們都是需要在低頻的特徵上有更大的更新。

Adadelta

這個演算法是對 Adagrad 的改進,和 Adagrad 相比,就是分母的 G 換成了過去的梯度平方的衰減平均值。

RMSprop

RMSprop 是 Geoff Hinton 提出的一種自適應學習率方法。RMSprop 和 Adadelta 都是為了解決 Adagrad 學習率急劇下降問題的。

Adam

這個演算法是另一種計算每個引數的自適應學習率的方法。除了像 Adadelta 和 RMSprop 一樣儲存了過去梯度的平方 vt 的指數衰減平均值 ,也像 momentum 一樣保持了過去梯度 mt 的指數衰減平均值