【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\)spa

若是想擬合一條比較平滑的曲線,怎麼作呢。可使用指數加權平均。歸納的說,就是平均前m天的數據做爲一個數據點:調試

\(b_0=0\)內存

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

好比\(\beta\)取0.9,那麼就至關因而平均了10天的數據,這會比較平滑。class

爲何叫指數加權平均?是由於,將\(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的一篇論文中,使用了不一樣時間段(迭代次數區間段)採用不一樣的學習率的方法,效果比較好。

相關文章
相關標籤/搜索