神經網路梯度下降演算法綜述
本文主要參考(大部分翻譯)自論文《An Overview of Gradient Descent Optimization Algorithm》
3.Challenge
通常來說,mini-batch gradient descent演算法在應用的時候,會有以下一些問題需要考慮:
1. 如何選擇一個合適的學習率
2. 如何在訓練的時候調整學習率
3. 所有的引數能不能不要都用相同的學習率更新
4. 如何逃避區域性最優以及鞍點
4. Gradient descent optimization algorithms
下面介紹幾種神經網路中常用的梯度下降方法,來解決之前第三節提到的challenge.對於那些不適用於神經網路的的方法,比如一些二階優化的方法(牛頓法),這裡就不做介紹了。
4.1. Momentum[1]
SGD在經過峽谷(navigating ravines)時候會碰到問題。這裡ravine的意思是說,畫出object function的等值面,那些在某些方向上的梯度很大,在其他方向上的梯度很小的地方,就叫做ravine。在這些點上,SGD演算法在收斂到區域性最優點的過程中容易產生振盪。如下圖(a)所示:
(a)圖上面靠近橢圓等值面的長軸附近的區域應該就是上面說的ravine,在這些區域短軸方向梯度比較大,長軸方向梯度比較小,在用SGD演算法的時候,容易造成振盪。雖然可能也能收斂到local optimal,但是收斂的速度會比較慢。
Momentum的方法
普通SGD的梯度更新策略如下式:
加上momentum項的梯度更新策略如下式:
也就是說,當前時刻權重的變化量和當前時刻的梯度以及前一時刻的權重的變化量相關。ituitively來說,設定momentum項的原因在於,當目標函式的surface存在一個長而狹窄的vally的時候,梯度的方向幾乎總是和長軸的方向垂直。系統因此不斷地沿著短軸的方向在震盪,沿著長軸方向的速度很慢。而momentum項能夠部分抵消當前時刻沿長軸方向的梯度分量,增大沿短軸方向的分量。這樣可以加快收斂。
4.2. Nesterov accelerated gradient[2]
Nesterov accelerated gradient(NAG)的思想是,前面momentum方法裡面,在還沒有求當前位置梯度的情況下,其實我們是已經知道一部分權重的增量
那麼我們乾脆先讓權重改變這麼多增量,然後再求改變之後位置的梯度。具體的公式如下:
權重更新的示意圖如下所示:
藍線表示momentum的更新過程,短藍線表示當前的梯度,長藍線表示前一時刻的梯度增量。紅線表示NAG的梯度更新過程,NAG首先根據前一時刻的梯度增量向前更新一大步,然後在新的位置計算梯度進行校正。這種方法在訓練RNN的時候表現比較好。
4.3. Adagad[3]
Adagrad的思想是:對於原來不怎麼更新的引數,提高它們的學習率,對於原來經常更新的引數,降低它們的學習率。我們前面介紹的梯度更新策略是對於所有的引數的學習率設定成一樣。Adagrad的策略不太一樣,假設
SGD對於每一個引數
Adagrad對於每一個引數的學習率設定取決的這個引數在t時刻之前梯度的累積量:
其中
4.4. Adadelta[4]
Adadelta的提出是為了解決Adagrad中引數學習率在不斷衰減的問題。相比於累加t時刻之前所有的梯度平方和,Adadelta限制累加的時間範圍為w。為了計算方便,Adadelta採用了decaying average的方法來計算w時長的梯度平方和。假設在t時刻梯度的平方和為
所以Adadelta的更新策略是:
注意到分母其實就是均方差RMS,因此可以把
作者在論文中提到SGD,momentum以及前面的Adagrad都存在mismatch of units。而二階導的形式才是增量值和原值match的:
為此有