深度學習過程中的優化算法
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−η⋅∂w∂Loss
Momentum SGD
- SGD容易陷入局部極小值,因此引入動量的方法,使得模型優化過程中有一定的速度,具體的參數更新方式如下
v:=αv−η⋅∂w∂Lossw:=w+v
相對於SGD只需要學習率,momentum SGD還需要初始速度v0,動量參數α。
AdaGrad
- AdaGrad可以自適應調整學習率,它在每次迭代時會累加梯度平方,在梯度下降時,累加和作爲分母項,相當於對於優化頻率高的樣本使用小的學習率,對於優化頻率低的樣本使用大的學習率。計算公式如下
g:=∂w∂Lossr:=r+g⊙gw:=w−δ+rη⊙g
其中,δ是爲了防止分母爲0,一般可以取10−7。
RMSProp
- AdaGrad有梯度累積的問題,在後續的優化過程中,梯度更新會越來越慢,學習率幾乎爲0,針對這個問題,RMSProp參數更新計算方式如下
g:=∂w∂Lossr:=ρr+(1−ρ)g⊙gw:=w−δ+rη⊙g
Adam
- Adam算法充分利用了之前提到的
AdaGrad
和RMSProp
算法的優點,即可以動態調整學習率,而且它利用了一階矩和二階矩,一階矩與動量SGD類似,二階矩用於減小學習率,計算公式如下:
g:=∂w∂Losss:=β1s+(1−β1)gr:=β2r+(1−β2)g⊙gs:=1−β1tsr:=1−β2trw:=w−δ+rηs
其中t是迭代的次數。一般超參數可以設置爲β1=0.9, β2=0.999, δ=10−8。
牛頓法
- 牛頓法計算量大,需要計算矩陣的二階矩,因而一般不在這種大規模數據集訓練的情況下直接使用。
總結
- 在CNN中,一般SGD還是比較常用的,可能會結合一些動態學習率的策略(因子衰減、指數衰減等)來使用,Adam也可以使用,但是超參數調節需要注意一下,最好做一些實驗驗證選取的超參數。
- 在強化學習中,一般可以使用Adam,會有更好的迭代和收斂效果。
reference