【DeepLearning】優化算法:SGD、GD、mini-batch GD、Moment、RMSprob、Adam


優化算法

1 GD/SGD/mini-batch GD

GD:Gradient Descent,就是傳統意義上的梯度下降,也叫batch GD。

SGD:隨機梯度下降。一次只隨機選擇一個樣本進行訓練和梯度更新。

mini-batch GD:小批量梯度下降。GD訓練的每次迭代一定是向着最優方向前進,但SGD和mini-batch GD不一定,可能會”震盪“。把所有樣本一次放進網絡,占用太多內存,甚至內存容納不下如此大的數據量,因此可以分批次訓練。可見,SGD是mini-batch GD的特例。

2 動量梯度下降

一個有用的方法:指數加權平均

假如有N天的數據,\(a_1,a_2,a_3,...,a_N\)

如果想擬合一條比較平滑的曲線,怎么做呢。可以使用指數加權平均。概括的說,就是平均前m天的數據作為一個數據點:

\(b_0=0\)

\(b_t = \beta*b_{t-1} + (1-\beta)*a_t\)

比如\(\beta\)取0.9,那么就相當於是平均了10天的數據,這會比較平滑。

為什么叫指數加權平均?是因為,將\(b_t\)計算公式中的\(b_{t-1}\)展開,依次展開下去,會發現:

\(b_t = \beta*(\beta*b_{t-2}+(1-\beta)*a_{t-1})+(1-\beta)*a_t\)

合並一下,前面的數據乘以\(\beta\)的m次方的平均值。因此叫做指數加權平均。

指數加權平均的偏差修正:

很顯然,上面公式匯總,假如\(\beta=0.9\),是要平均前10天的數據,則前9天的數據,做加權平均,並沒有足夠的數據,這會導致前九天數據偏小。舉例來說,第一天\(b_1\)僅僅是\(a_1\)的十分之一。可以做偏差修正:

\(b_0=0\)

\(b_t = \beta*b_{t-1} + (1-\beta)*a_t\)

\(b_t = \frac{b_t}{1-\beta ^t}\)

有了指數加權平均的基本知識,就可以講Moment Gradient Descent。

帶動量的梯度下降,他是為了加快學習速度的優化算法。假如參數W方向希望學的快一點,b方向學的慢一點。普通的梯度下降的結果可能恰恰相反,使得b方向學的比較快,從而引發震盪。所以想要讓b方向學的慢一點,這時可以用動量梯度下降。算法如下:

For each epco \(t\):

​ cal \(dW,dB\) for each mini-batch.

\(V_{dW}=\beta*V_{d_W}+(1-\beta)*dW\)

\(V_{db}=\beta*V_{d_b}+(1-\beta)*db\)

\(W = W-\alpha*V_{dW}\)

\(b=b-\alpha*V_{db}\)

可見,就是將梯度做了指數加權平均。至於為什么叫動量梯度下降,可能是因為\(V_{dW}\)的計算式中,把\(dW\)看作加速度,把\(V_{dW}\)看作速度。

3 RMSprob

Root Mean Square prob。

這是另一種加快學習的方法。其基本思想也是讓b學的慢一點,讓W學的快一點,從而更快更准的趨向於最優點。

For each epco \(t\):

​ cal \(dW,dB\) for each mini-batch.

\(S_{dW}=\beta*S_{dW}+(1-\beta)*(dW)^2\)

\(S_{db}=\beta*S_{db}+(1-\beta)*(db)^2\)

\(W = W-\alpha*\frac{dW}{\sqrt{S_{dW}}}\)

\(b = b-\alpha*\frac{db}{\sqrt{S_{db}}}\)

可見,當梯度較大,則會使得\(S\)較大,從而使得更新變緩慢。

4 Adam

Adaptive Moment Estimation

這是比較普遍的適用於各種網絡的一種方法。稱作自適應的動量梯度下降。這是上面動量梯度下降和RMSprob的結合版本,效果比較好。兩者做加權指數平均的時候,都做了修正。

For each epco \(t\):

​ cal \(dW,dB\) for each mini-batch.

\(V_{dW}=\beta_1*V_{d_W}+(1-\beta_1)*dW\)

\(V_{db}=\beta_1*V_{d_b}+(1-\beta_1)*db\)

\(S_{dW}=\beta_2*S_{dW}+(1-\beta_2)*(dW)^2\)

\(S_{db}=\beta_2*S_{db}+(1-\beta_2)*(db)^2\)

\(V_{dW}^{correction} = \frac{V_{dW}}{1-\beta_1^t}\)

\(V_{db}^{correction} = \frac{V_{db}}{1-\beta1^t}\)

\(S_{dW}^{correction} = \frac{S_{dW}}{1-\beta_2^t}\)

\(S_{db}^{correction} = \frac{S_{db}}{1-\beta_2^t}\)

\(W = W-\alpha*\frac{V_{dW}^{correction}}{\sqrt{S_{dW}^{correcti}}+\varepsilon}\)

\(b = b-\alpha*\frac{V_{db}^{correction}}{\sqrt{S_{db}^{correcti}}+\varepsilon}\)

可見,就是在RMSprob中,用動量梯度下降中的梯度指數加權代替梯度,同時所有指數加權項都做了偏差修正。另外,分母加了\(\varepsilon\),這是為了防止除以很小的數造成不穩定。公式中共有4個超參數,他們的取值經驗是:

\(\alpha\):學習率,需要調試

\(\beta_1\):取0.9

\(\beta_2\):Adam的作者建議取0.999

\(\varepsilon\):取\(10^{-8}\),並不影響學習效果。

另外,值得注意的是,學習過程中可能有兩種窘境,一是困在局部最優,另一個是遇平緩區學習的過慢。采用mini-batch下前者出現的概率很小,即使困在最優也能跳出來,前提是數據量足夠。但后者比較棘手,Adam是個比較好的優化算法,一定程度上解決了這個問題。

5 學習率衰減

訓練過程中,隨着迭代次數,學習率相應減少。

在FB的一篇論文中,使用了不同時間段(迭代次數區間段)采用不同的學習率的方法,效果比較好。


免責聲明!

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



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