優化方法

1. 梯度下降

1.1批量梯度下降法(Batch Gradient Descent,BGD)

在每一輪的訓練過程中,BGD算法用整個訓練集的數據計算參數的梯度,並用該梯度對模型參數進行更新,其中 theta 是訓練參數, eta 是學習率, L(theta) 是損失函數: theta=theta-etafrac{partial L(theta)}{partialtheta}\

優點:

  • 損失函數若為凸函數,能夠保證收斂到全局最優值;若為非凸函數,能夠收斂到局部最優值。

缺點:

  • 由於每輪迭代都需要在整個數據集上計算一次,所以批量梯度下降可能非常慢。
  • 訓練集較大時,需要較大內存。

1.2 隨機梯度下降法(Stochastic Gradient Descent,SGD)

與BGD算法不同的一點是,SGD算法每讀入一個數據,便立刻計算損失函數的梯度來更新參數:

theta=theta-etafrac{partial L(theta;x^{(i)},y^{(i)})}{partialtheta} \

優點:

  • 算法收斂速度快。

缺點:

  • 容易收斂到局部最優。

1.3 小批量隨機梯度下降法(Mini-batch Gradient Descent,MBGD)

MBGD的方法是在BGD和SGD兩個方法中取折衷, 每次從所有訓練數據中取一個子集(mini-batch) 用於計算梯度:

theta=theta-etafrac{partial L(theta;x^{(i:i+n)},y^{(i:i+n)})}{partialtheta} \

優點:

  • 計算效率高,而且收斂較為穩定。

2. Momentum

Momentum算法借用瞭物理中的動量概念,它模擬的是物體運動時的慣性,即更新的時候在一定程度上保留之前更新的方向,同時利用當前batch的梯度微調最終的更新方向。

upsilon_{t}=beta upsilon_{t-1}-etafrac{partial L(theta)}{partial theta} \ theta=theta +upsilon_{t} \

優點:

  • 在一定程度上增加穩定性,從而學習地更快,並且還有一定擺脫局部最優的能力。

缺點:

  • 每個參數都具有同樣的學習率

3. Adagrad

上述方法中,對於每一個參數 theta_{i} 的訓練都使用瞭相同的學習率 eta 。Adagrad是平方梯度之和的平方根的倒數來控制參數的學習率。

g_{t,i} 為第t輪第i個參數的梯度,即 g_{t,i}=frac{partial L(theta)}{partialtheta_{i}} , G_{t,i}=sum_{i=1}^tg_{t,i}^2 是對應參數 theta_{i} ​從第1輪到第t輪梯度的平方和。

在每輪訓練中對每個參數的學習率進行更新,ϵ是平滑項,用於避免分母為0,一般取值1e−8。參數更新公式如下:

theta_{t+1,i}=theta_{t,i} -frac{eta}{sqrt{G_{t,i}+epsilon}} g_{t,i} \

優點:

  • 適合處理稀疏數據。
  • 在訓練中自動的對learning rate進行調整,對於出現頻率較低參數采用較大的 eta 更新;相反,對於出現頻率較高的參數采用較小的 eta 更新。

缺點:

  • 在訓練的中後期,分母上梯度平方的累加將會越來越大,從而梯度趨近於0,使得訓練提前結束。

4. RMSprop

RMSprop 是一個未發佈的優化器,其理念類似於 AdaGrad,用平方梯度的移動均值替代平方梯度的總和。RMSprop 通常與動量一起使用。

5. Adam

Adam(Adaptive Moment Estimation)是另一種自適應學習率的方法。它利用梯度的一階矩估計和二階矩估計動態調整每個參數的學習率。Adam的優點公式如下:

m_{t+1}=beta_{1}m_{t}+(1-beta_{1})g_{t} qquad (1)\ upsilon_{t+1}=beta_{2} upsilon_{t}+(1-beta_{2})g^{2}_{t} qquad (2) \ m_{t+1}=frac{m_{t+1}}{1-beta_{1}} qquad (3)\ upsilon_{t+1}=frac{upsilon_{t+1}}{1-beta_{2}} qquad (4)\ theta_{t+1}=theta_{t} -frac{eta}{sqrt{upsilon_{t+1}+epsilon}} m_{t+1} qquad (5)\

其中 g_{t} 是參數的導數, g^{2}_{t} 是導數的平方, m_{t}upsilon_{t} 分別是對梯度的一階矩估計和二階矩估計,可以看作對期望 E[g_{t}], E[g_{t}^{2}] 的近似,(越往後參數的更新,會除以它之前累積的梯度的平方根,這樣就可以使得更新幅度變小)。

公式(3)和(4) 是對 m_{t+1}upsilon_{t+1} 的校正,這樣可以近似為對期望的無偏估計。

Adam算法的提出者建議 beta_{1} 的默認值為0.9, beta_{2} 的默認值為0.999。

優點:

  • 經過偏置校正後,每一次迭代學習率都有個確定范圍,使得參數比較平穩。

缺點:

  • 缺點和adaGrad相似,訓練後期,梯度非常小,難以更新參數
  • 需要存儲多個變量,對GPU要求較高

6. adafactor

因為adam占用內存較大,所以adafactor舍棄瞭動量、同時進行低秩分解,最終變為如下公式

begin{equation}left{begin{aligned}&g_{i,j;t} = nabla_{theta} L(theta_{i,j;t})\ &hat{beta}_{2,t} =1 – t^{-c}\ &v^{(r)}_{i;t} = hat{beta}_{2,t} v^{(r)}_{t-1;i} + left(1 – hat{beta}_{2,t}right) sumlimits_{j}left(g_{i,j;t}^2+epsilon_1right)\ &v^{(c)}_{j;t} = hat{beta}_{2,t} v^{(c)}_{t-1;j} + left(1 – hat{beta}_{2,t}right) sumlimits_{i}left(g_{i,j;t}^2+epsilon_1right)\ &hat{v}_{i,j;t} = v^{(r)}_{i;t} v^{(c)}_{j;t}left/sumlimits_{j}v^{(c)}_{j;t}right.\ &u_t = g_tleft/sqrt{hat{v}_t}right.\ &hat{u}_t = u_t left/maxleft(1, left. RMS(u_t)right/dright)right.times maxleft(epsilon_2, RMS(theta_{t-1})right)\ &theta_t = theta_{t-1} – alpha_t hat{u}_t end{aligned}right.end{equation}\

由於占用存儲較小,所以對於GPU不充足的時候,設置較小的batch,然後累積梯度,到一定程度再更新,也能達到大batch的效果。

adafactor公式參考:AdaFactor優化器淺析(附開源實現) – 科學空間|Scientific Spaces

赞(0)