深度學習過程中的優化算法

深度學習過程中的優化算法

BGD(batch gradient descent) & SGD(stochastic gradient descent) & mini-batch GD

  • BGD是每次迭代的時候,使用所有的樣本進行梯度下降,這種方法可以找到全局最優解,但是容易陷入局部最優,而且在數據量很大的時候難以進行(對內存的要求太高了,計算很慢)。
  • SGD是每次只使用一個樣本進行訓練並使用GD更新梯度參數,這種方法計算簡單,但是每次只使用一個樣本,可能會會使得優化的過程中發生震盪、收斂變慢。
  • mini-batch GD是每次使用若干個樣本進行GD,樣本個數爲batch size,在深度學習訓練過程中,一般將min-batch GD直接稱爲SGD,在訓練過程中,建議儘量設置batch size大一些(最終計算時不超過GPU顯存大小即可),可以加快收斂過程。
  • SGD的更新公式

w:=wηLossww: = w - \eta \cdot \frac{{\partial Loss}}{{\partial w}}

Momentum SGD

  • SGD容易陷入局部極小值,因此引入動量的方法,使得模型優化過程中有一定的速度,具體的參數更新方式如下

v:=αvηLossww:=w+v\begin{array}{l} v: = \alpha v - \eta \cdot \frac{{\partial Loss}}{{\partial w}}\\ w: = w + v \end{array}

相對於SGD只需要學習率,momentum SGD還需要初始速度v0v_0,動量參數α\alpha

AdaGrad

  • AdaGrad可以自適應調整學習率,它在每次迭代時會累加梯度平方,在梯度下降時,累加和作爲分母項,相當於對於優化頻率高的樣本使用小的學習率,對於優化頻率低的樣本使用大的學習率。計算公式如下

g:=Losswr:=r+ggw:=wηδ+rg\begin{array}{l} g: = \frac{{\partial Loss}}{{\partial w}}\\ r: = r + g \odot g\\ w: = w - \frac{\eta }{{\delta + \sqrt r }} \odot g \end{array}

其中,δ\delta是爲了防止分母爲0,一般可以取10710^{-7}

RMSProp

  • AdaGrad有梯度累積的問題,在後續的優化過程中,梯度更新會越來越慢,學習率幾乎爲0,針對這個問題,RMSProp參數更新計算方式如下

g:=Losswr:=ρr+(1ρ)ggw:=wηδ+rg\begin{array}{l} g: = \frac{{\partial Loss}}{{\partial w}}\\ r: = \rho r + (1 - \rho )g \odot g\\ w: = w - \frac{\eta }{\delta + {\sqrt r }} \odot g \end{array}

Adam

  • Adam算法充分利用了之前提到的AdaGradRMSProp算法的優點,即可以動態調整學習率,而且它利用了一階矩和二階矩,一階矩與動量SGD類似,二階矩用於減小學習率,計算公式如下:

g:=Lossws:=β1s+(1β1)gr:=β2r+(1β2)ggs:=s1β1tr:=r1β2tw:=wηδ+rs\begin{array}{l} g: = \frac{{\partial Loss}}{{\partial w}}\\ s: = {\beta _1}s + (1 - {\beta _1})g\\ r: = {\beta _2}r + (1 - {\beta _2})g \odot g\\ s: = \frac{s}{{1 - \beta _1^t}}\\ r: = \frac{r}{{1 - \beta _2^t}}\\ w: = w - \frac{\eta }{{\delta + \sqrt r }}s \end{array}

其中tt是迭代的次數。一般超參數可以設置爲β1=0.9\beta_1 = 0.9, β2=0.999\beta_2 = 0.999, δ=108\delta = 10^{-8}

牛頓法

  • 牛頓法計算量大,需要計算矩陣的二階矩,因而一般不在這種大規模數據集訓練的情況下直接使用。

總結

  • 在CNN中,一般SGD還是比較常用的,可能會結合一些動態學習率的策略(因子衰減、指數衰減等)來使用,Adam也可以使用,但是超參數調節需要注意一下,最好做一些實驗驗證選取的超參數。
  • 在強化學習中,一般可以使用Adam,會有更好的迭代和收斂效果。

reference

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章