更好的優化

更好的優化

這次介紹幾個更好的優化,回憶一下 損失函數 梯度 優化 一節我們所介紹的內容,我們介紹了最簡單的優化算法:隨機梯度下降(SGD)。然而,這個算法難以處理一些比較奇怪的情況,讓我們來看看。

引例

損失函數的梯度登高表述如下圖等高線,在這類函數上如果運行SGD,由於在豎直方向上梯度比較高,所以步長*梯度帶來的在此方向的移動距離會很大,對應的水平距離移動就很小,結果就會造成像圖中紅線這樣的又是一個zig-zag的運行軌跡。這並不是一個好現象。
在這裏插入圖片描述
再考慮一個問題,SGD是嚴格按照梯度的常數倍在某一個維度上前進,考慮其在局部最低點和鞍點的情況,該維度梯度爲0,就意味着在這個維度上不動了,然後就認定它是最小值。這顯然也是錯誤的。

因此需要考慮一個新的優化算法。

SGD+Momentum 帶動量的SGD

一個思路是:在SGD的基礎上,爲速度變化量加一個動量項,這個動量項的概念是摩擦係數與先前速度的乘積,這樣一來,需要在dx的基礎上加一個摩擦係數乘以原速度。此外,摩擦係數可以設定爲0.9或者0.99,這樣一來,就保證了下降時速度的大小和方向並不僅僅取決於當前位點的屬性。
在這裏插入圖片描述

Nesterov Momentum

接下來介紹一個新的動量——Nesterov動量,它與上述規定的動量有一個先後順序的變化。表述如下:
在這裏插入圖片描述
此外,這兩個動量也有一個比較簡單的以二維爲例子的圖解對比。如圖可見,左圖中,實際步進是原速度與出發點之間的向量和;右圖中,首先預測按原速度前進,到達新位點後的梯度,沿而後向梯度方向與原速度的向量和方向走,得到實際步進。
在這裏插入圖片描述

AdaGrad

AdaGrad的核心思路是:在運算的過程中加入一個梯度平方項,在計算步進的時候,在學習率乘以dx的基礎上,再除以一個梯度平方項的方根。
這樣帶來了什麼好處呢?首先,在不同維度上,如果某一方向上的梯度非常大,那麼它對grad_squared的貢獻就會很大,那麼對應的這一步的步進就非常小,同樣的對於梯度小的情況也是會使得步進非常大。其次,隨着時間的增大,它的等效學習率會越來越小。
在這裏插入圖片描述
再返回來,考慮一些前面沒有解決的問題。AdaGrad能夠很好的解決像這樣的凸問題,但是非凸問題情況下,比如說在局部最小值,它就又會被卡住。因此,繼續介紹下一個算法來解決這一問題。

RMSProp

爲什麼它會在局部最小值處被卡呢?因爲感覺上來講,它太受本地點的拘束了。解決它的方法,應該也是利用和動量一樣的思路,在軌跡中離本地點時間越久遠,對當前運動狀態影響越小,因此乘以一個衰減係數dacay_rate,不過從它的形式來講,叫做衰減權值好像更好一些。一般取值爲0.9或者0.99,剩下的權值再分給dx * dx項。
實驗表明,它的效果與SGD+M相似,但是路徑截然不同。代碼如下:
在這裏插入圖片描述
既然SGD+M與RMSProp都不錯,那麼我們想要試試更好的優化,就結合它們!

Adam

在這裏插入圖片描述
解釋一下,回憶SGD+Momentum,其動量的計算是vx=vx*rho+dx,我們將其改寫成了權值的形式,這就是第一動量。第二動量的公式與RMSProp相似。在此算法中,考慮一下第一步,我們將一二動量初始爲0,那麼一開始的幾步,它的步長會驚人的長,要規避這個現象,Adam算法加入了偏置校正項。
在這裏插入圖片描述
即隨着時間的推移,校正力度會逐漸減小,從而變回原值,這就很好的規避了起初幾步的步長過長的情況。此外,許多情況下,Adam算法的初始參數設定一般爲 beta1=0.9 beta2=0.999 learing_rate=1e-3 / 5e-4。

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