Momentum
Momentum的公式表達
設時間步t的自變量爲xt,學習率爲ηt。在t0時刻,速度變量v0=0,在時間步t>0,Momentum關於速度變量vt=0和自變量θt的迭代方式爲:
vtθt←γvt−1+ηtgt,←θt−1−vt,
其中 γ 爲超參數,滿足0≤γ<1。
從上面的式子我們可以看出
- 速度變量vt作用等價於梯度
- 速度變量vt的大小與上一個時刻的速度變量vt−1和學習率ηt有關,且γ越大,vt−1的作用越大。
- 由於vt=γvt−1+ηtgt=γ(γvt−2+ηtgt−1)+ηtgt=......,歷史的速度變量都將影響當前速度變量的大小,且越近影響越大,相當於歷史速度變量的加權平均,越近權重越大。
Momentum可以解決什麼問題?
如上圖1所示,在黃色箭頭處,本身梯度爲零,但是由於歷史的速度變量不爲零,會繼續向右運動,而到達紫色箭頭處時,梯度應該向左,但此時歷史的速度變量如果較大且向右,有可能跳出局部最優點,當然,能不能跳出是很難保證的。
上圖是一個梯度下降的圖,如果採用momentum,則下降趨勢如下
在下降開始階段,歷史速度變量和當前梯度方向相反,則會使得下降的過程更爲平滑,避免過度震盪。
因此Momentum的主要作用在於:
- 有一定機率跳出局部最優解
- 歷史速度變量和當前梯度方向相反時,使得下降的過程更爲平滑
Adagrad
Adagrad的公式表示爲
st←st−1+gt⊙gt,
其中⊙是按元素相乘。st爲t時刻的狀態變量,爲從訓練開始直到t時刻的所有梯度的平方和,我們更新目標函數的自變量θt:
θt←θt−1−st+ϵη⊙gt,
其中η是學習率,ϵ是爲了維持數值穩定性的常數(避免數值溢出),通常非常小。
從上面的式子我們可以看出:
- Adagrad的分母是所有歷史梯度的累加(均方差),因此歷史梯度越大,當前更新越小。整體的思想是:之前更新大的參數,這次更新更新小一點,反之亦然
- Adagrad相比於之前介紹的方法,它根據不同參數具有不同的學習率(受分母影響)
- Adagrad在兩種情況下,同一次更新中的某些參數學習率變得很小:
- 1.歷史梯度存在很大的值,即參數曾經有過更新很快的記錄
- 2.參數更新頻率高,梯度爲0的次數少,在學習過程中,梯度爲0是很常見的,因此adagrad鼓勵那些沒怎麼更新過的參數多更新一點。
- 3.Adagrad中分母是採用的累積,因此到訓練後期學習率會小得令人髮指,也就是說如果經過一定的迭代次數後模型還沒有找到最優點,那就很難找到最優解了。
RMSProp
RMSProp全稱是 Root Mean Square Prop,它和adagrad類似,可以使得不同的參數具有個性化的學習率,同時可以緩解訓練後期學習率過小的問題,它的公式如下:
st←γst−1+(1−γ)gt⊙gt.
θt←θt−1−st+ϵη⊙gt,
其中0≤γ<1,可以看出與adagrad的區別在於狀態變量st的計算對於歷史的狀態變量和當前梯度都做了衰減,因此再迭代過程中梯度不一定是一直衰減,也可能增大。
Adam
Adam可以看做RMSProp和Momentum的結合,類似有:
vt←γ1vt−1+(1−γ1)gt
st←γ2st−1+(1−γ2)gt⊙gt
作者建議的 γ1=0.9,γ2=0.999 ,那麼在訓練剛開始的時候由於 vt−1,st−1都比較小導致$ v_{t},s_{t} $較小,因此需要增加一個偏置:
v^t←1−β1tvt
s^t←1−β2tst
上面兩個式子中的分母可以起到放大梯度的效果,且分母都是隨時間增大的,可以解決訓練開始階段vt,st 偏小的問題,最後的公式更新爲:
gt′←s^t+ϵηv^t
θt←θt−1−gt′
最後我們可以總結如下:
- Momentum是通過改變梯度下降的方向來改進梯度下降方法的,本質是引入了歷史的速度變量 vt−1 ,向量的加法會改變梯度的方向,作用有兩點:
- 有一定機率跳出局部最優解
- 歷史速度變量和當前梯度方向相反時,使得下降的過程更爲平滑
- Adagrad和RMSProp是通過歷史梯度平方和開根號的狀態變量 s_{t} 對於參數做衰減,由於不同參數的的狀態變量不同,可以個性化地對梯度做衰減
- Adam是RMSProp和Momentum的結合,爲了避免訓練開始時梯度過小的問題,引入了一個偏置處理。
最後我做了關於梯度下降法的一個思維導圖:
其中關於batch_size的部分可以參考我的另一篇博客機器學習深度學習】——學習率,梯度下降法,批梯度下降,歸一化