優化算法
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的一篇論文中,使用了不同時間段(迭代次數區間段)采用不同的學習率的方法,效果比較好。