梯度下降優化算法整理:SGD、AdaGrad、RMSProp、Momentum、Adam

深度學習在執行梯度下降算法時,通常會面臨一系列的問題。如陷入local minimun、saddle point,訓練很慢或不收斂等諸多問題。因此需要對梯度下降算法進行優化,優化的考量主要有三個方面:

  1. batch的選擇問題,對訓練集進行一輪訓練,每次梯度下降更新參數時需要考慮訓練集中多少個樣本;
  2. learning rate的選擇問題,如果訓練過程中學習率是定值,顯然是不好的。因爲訓練開始階段可能較小,會導致收斂緩慢;快結束時學習率可能過大,引起震盪。所以需要動態地選擇學習率;
  3. Momentum的問題,訓練中可能有陷入saddle point或local minimum的問題,因此不能只根據當前的梯度來更新參數,而是應該考量這一點的慣性(衝量)與這一點梯度的共同作用,衝量這裏可以理解爲歷史的梯度信息。

SGD

我們假設某一個數據集的訓練集中有 10000 個樣本。

1. Batch Gradient Descent(BGD)

在BGD的一個epoch中,更新一次參數,需要用到訓練集中所有樣本(10000個),通過計算這 10000 個輸入樣本的 loss function,進行反向傳播來更新參數。即一次迭代需要用到訓練集中的 所有數據。每一個epoch只更新一次參數。

θ=θηθJ(θ)\theta = \theta - \eta \nabla_{\theta} J(\theta)

優點:由於考慮到所有的樣本,容易得到全局最優解,同時利於並行計算;

缺點:更新速度慢,佔用較多內存。

2. Stochastic Gradient Descent(SGD)

SGD與BGD恰恰相反,在SGD中,每計算一個樣本的loss function,就做一次反向傳播來更新參數。即每一次參數更新只需要一個樣本。在一個epoch中,參數更新 10000 次,訓練速度顯然快於SGD。

θ=θηθJ(θ,x(i),y(i))\theta = \theta - \eta \nabla_{\theta} J(\theta,x^{(i)},y^{(i)})

優點:訓練速度快,佔用內存少;

缺點:由於只根據一個樣本進行梯度下降,所以很難得到全局最優,不易實現並行計算。

3. Mini-batch Gradient Descent

我們看到,SGD和BGD都有各自的優缺點,那麼我們能不能做一個折衷呢?汲取各自的優點,彌補各自的缺點,Mini-batch Gradient Descent既考慮參數訓練的速度,又考慮到訓練的穩定性,以得到全局最優。Mini-batch是將訓練集數據分爲若干個數據量相同的batch,假設一個batch中有100個樣本,則整個數據集(假設10000個樣本)中就有100個batch。每更新一次參數,需要利用到一個batch的數據,這樣既不像BGD訓練得那麼慢,又不會像SGD那樣失去全局的考慮。

θ=θηθJ(θ,x(i+n),y(i+n))\theta = \theta - \eta \nabla_{\theta} J(\theta,x^{(i+n)},y^{(i+n)})

以上三種算法存在兩點共同的缺陷:

  1. 學習率的選取太困難,較高的學習率會導致訓練震盪甚至不收斂,較低的學習率會大大減緩訓練的速度。如果整個訓練過程都保持同一個學習率,那顯然是不合理的,因爲訓練過程中梯度等高線的疏密程度是不同的,最好是要針對不同的梯度施加與之相適應的學習率。
  2. 陷入saddle point或局部最小的問題。陷入鞍點比陷入局部最優問題更大,局部最優很大程度上接近全局最優。但鞍點相當於讓一個小球從高處沿着坡面下滑,在到達最低點之前,有一塊高原區域(梯度爲0,平坦但海拔很高),此時如果只按照當前梯度來更新參數,顯然就停止了。鞍點就是這些高原區域,保持着更高的loss。

AdaGrad

爲了解決上述的第一個問題,即動態確定學習率,AdaGrad給出了相當不錯的思路:在訓練中有非常多的參數,有些更新的快有些更新較慢,所以AdaGrad爲每一個參數都確定一個屬於他自身的學習率。對於某些更新較快的參數,我們已經學習到他的一些知識,所以不希望單個樣本能對其有太大的影響,因此學習率要設定的慢一些;對於更新很慢的參數,我們對其瞭解的信息太少,所以要將這個參數的學習率設定的更大一些。

假設 gt,ig_{t,i} 表示 tt 時刻第 ii 個參數的梯度,則此時梯度下降更新參數的公式爲:

θt+1,i=θt,iηj=0t(gj,i)2+ϵgt,i\theta_{t+1,i}=\theta_{t,i}-\frac{\eta}{\sqrt{\sum_{j=0}^{t}(g_{j,i})^{2}+\epsilon}}g_{t,i}

通過上式可見,AdaGrad在初始學習率 η\eta 的基礎上,對於參數 ii 除以該參數歷史梯度的均方根,ϵ\epsilon 是防止分母爲0的平滑項。這種做法消除了學習率恆定的弊端,使得頻繁更新的參數學習率更小,更新緩慢的參數擁有較大的學習率。

但是AdaGrad存在一個問題,就是在訓練的中後期,由於分母上梯度的不斷累加,會導致學習率變得非常緩慢,在達到最優結果之前提前結束訓練過程。

RMSProp

RMSProp將當前的梯度 gt,ig_{t,i} 與歷史梯度分開討論。設定一個0-1之間的參數 α\alpha,每次算梯度時計算:

E[g2]t,i=αE[g2]t1,i+(1α)gt,i2E[g^{2}]_{t,i}=\alpha E[g^{2}]_{t-1,i}+(1-\alpha)g_{t,i}^{2}

所以此時梯度更新的公式如下:

θt+1,i=θt,iηE[g2]t,i+ϵgt,i\theta_{t+1,i}=\theta_{t,i}-\frac{\eta}{\sqrt{E[g^{2}]_{t,i}+\epsilon}}g_{t,i}

通過第一個公式可以發現,當 α\alpha 的值接近於 0 時,當前的梯度 gt,i2g_{t,i}^{2} 對學習率的確定起到更大的影響;當 α\alpha 的值接近於 1 時,歷史梯度的加權 E[g2]t1,iE[g^{2}]_{t-1,i} 對學習率的影響佔更大比重。

這個做法一定程度上解決了AdaGrad的缺點,在訓練的中後期,萬一出現梯度變稀疏的情況,我們希望學習率變大一些,而AdaGrad的單調性無法實現這一願望。而RMSProp可根據當前的梯度和歷史的梯度期望,做一個加權的考量。

Momentum

在不引入Momentum之前,訓練中很容易困在saddle point。即這個點loss很高,但是周圍是平坦的,梯度爲0,對應地理中的高原地形。此時需要引入類似於物理學中的衝量概念,即不能單單考慮這個點的梯度信息,同時要考慮上一個時刻的運動狀態(類似於慣性)。有了這個考量,參數就有可能衝出鞍點的範圍,繼續尋找最優解。
在這裏插入圖片描述

上圖摘自臺大李宏毅老師的機器學習PPT。我們看到,在上圖中紅色箭頭表示梯度方向;藍色箭頭代表參數更新的方向;綠色虛線代表上一次的參數更新方向。在第一次參數更新時,由於沒有歷史信息,所以參數更新方向就是梯度的反方向。在第二次及以後的參數更新時,參數的更新方向爲上一次更新方向與此時梯度的反方向的加權向量和,即藍色向量等於綠色向量與紅色向量的加權和。

此時參數的更新形式如下:

θ=θvt\theta = \theta - v_{t}

而這裏的 vtv_{t} 是當前梯度與前一個狀態參數更新方向的向量加權和,可表示爲:

vt=γvt1+(αgt)v_{t} = \gamma v_{t-1}+(-\alpha g_{t})

可見每一次參數更新時會考慮到上一個時刻的參數更新方向 vt1v_{t-1}。試想一下,假設將一個小球從坡面高處拋下,在下滑的過程中,如果遇到鞍點,這時參數更新方向也會參照之前的方向,繼續向前向下,擺脫鞍點。所以這個衝量的引入使得參數擺脫鞍點或局部最優成爲可能。

Adam

Adam算法可以看作RMSProp和Momentum的集大成者,兼顧了自適應學習率和衝量這兩個因素,可以說是現在最穩定、效果最理想的訓練參數方法之一。

首先其更新參數的公式如下:

θt+1=θtηvt^+ϵmt^\theta_{t+1}=\theta_{t}-\frac{\eta}{\sqrt{\hat{v_{t}}+\epsilon}}\hat{m_{t}}

mtm_{t}vtv_{t} 看作是對梯度的一階矩估計和二階矩估計,近似等於期望 E[gt]E[g_{t}]E[gt2]E[g_{t}^{2}],所以 mtm_{t}vtv_{t} 的表達形式如下:

mt=β1mt1+(1β1)gtm_{t}=\beta_{1}m_{t-1}+(1-\beta_{1})g_{t}

vt=β2vt1+(1β2)gt2v_{t}=\beta_{2}v_{t-1}+(1-\beta_{2})g_{t}^{2}

而在迭代開始的階段,mtm_{t}vtv_{t} 有一個向初始值0的偏移,因此第一個式子裏的 mt^\hat{m_{t}}vt^\hat{v_{t}} 分別是 mtm_{t}vtv_{t} 的無偏估計,可以表達爲:

mt^=mt1β1t\hat{m_{t}}=\frac{m_{t}}{1-\beta_{1}^{t}}

vt^=vt1β2t\hat{v_{t}}=\frac{v_{t}}{1-\beta_{2}^{t}}

將上面兩個式子帶入第一個公式即可。

參考:

李宏毅老師機器學習課程

https://blog.csdn.net/u010089444/article/details/76725843

https://zhuanlan.zhihu.com/p/32626442

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