優化器

目錄

1. 隨機梯度下降法 SGD

2. 基本動量法

梯度下降法的直觀理解?

爲什麼加入動量可以改善優化路線的曲折程度?

爲什麼動量法可以加快網絡的收斂?

公式

3.Nesterov動量法(Nesterov accelerated gradient (NAG))

思想

公式

4. AdaGrad

如何實現每個參數有不同的學習率?

公式

Adagrad優缺點

5. RMSProp

6. Adadelta

7. Adam(Adaptive Moment Estimation)

8.AmsGrad

效果比較

總結


優化器的作用就是使用一種策略利用梯度下降法,不斷的調整參數,來使loss越來越小,最終令預測儘可能接近真實值。

1. 隨機梯度下降法 SGD

小批量

從訓練集中隨機抽取小批量的樣本,計算他們的平均loss,來實行一次參數更新。使用小批量樣本的平均loss代替全體樣本的平均loss進行參數更新可以加快參數更新頻率,加速收斂。小批量樣本的平均loss是全體樣本平均loss的無偏估計。

如果小批量樣本中只有一個樣本,那麼稱爲隨機梯度下降法,由於矩陣的向量化操作(數據量是2的指數運算效率更高)使得一次計算128個樣本的loss比128次計算一個樣本要高效的多,所以我們經常使用SGD來指代小批量梯度下降。

爲什麼小批量樣本的平均loss是全體樣本平均loss的無偏估計?

因爲訓練集中的同類樣本是相關的,同類樣本中不同個體的loss是相似的,所以隨機抽取的一個樣本loss可以作爲該類所有樣本平均loss的無偏估計

 

2. 基本動量法

梯度下降法的直觀理解?

如果把梯度下降法想象成一個小球從山坡到山谷的過程,那麼前面幾篇文章的小球是這樣移動的:從A點開始,計算當前A點的坡度,沿着坡度最大的方向走一段路,停下到B。在B點再看一看周圍坡度最大的地方,沿着這個坡度方向走一段路,再停下。確切的來說,這並不像一個球,更像是一個正在下山的盲人,每走一步都要停下來,用柺杖來來探探四周的路,再走一步停下來,周而復始,直到走到山谷
 

爲什麼加入動量可以改善優化路線的曲折程度?

一個真正的小球要比上述過程聰明多了,從A點滾動到B點的時候,小球帶有一定的初速度,在當前初速度下繼續加速下降,小球會越滾越快,更快的奔向谷底。momentum 動量法就是模擬這一過程來加速神經網絡的優化的。

 

爲什麼動量法可以加快網絡的收斂?

動量法累積了歷史梯度信息,使小球具有慣性:

(1)當累積的歷史梯度與當前梯度方向一致時,加速收斂

(2)不一致時,減少優化時路徑的曲折程度

基本動量法中梯度方向的確定是:歷史梯度的累積和當前點的梯度方向的組合。

è¿éåå¾çæè¿°

公式

v_t=\gamma \cdot v_{t-1}+\eta\cdot\nabla_{\theta}J(\theta)

\theta_{new}=\theta - v_t

代碼:

mu = 0.9
v = mu * v
v = v - lr * dx
x = x + v

假設每個時刻的梯度dx總是0(相當於小球滾動到平地),則可得:v = mu ^n\cdot v_0,可見v是指數衰減,小球只要初速度足夠大,就有機會衝出當前平地到達一個更低的山谷。

 

3.Nesterov動量法(Nesterov accelerated gradient (NAG))

轉自:https://blog.csdn.net/tsyccnh/article/details/76673073

思想

計算梯度時,不是在當前位置,而是未來的位置上

Nesterov想到,在基本動量法中每一步都要將兩個梯度方向(歷史梯度、當前梯度)做一個合併再下降,那麼爲什麼不按照歷史梯度先往前走一步獲得“超前點”的梯度,然後將這個超前梯度和歷史梯度進行合併?小球具有了超前意識,就變的更加聰明。

具體的方法就是:小球先按照歷史梯度走一步(先暫時更新一下參數,以便得到新參數值點的梯度),然後根據超前點的梯度來修正當前點的梯度。

直觀理解如下:

Nesterov動量法中梯度方向的確定是:歷史梯度的累積和超前點的梯度方向的組合

è¿éåå¾çæè¿°

小球在B點先根據歷史梯度向前走一步到C點,計算C點的梯度(\overrightarrow{CD}),然後利用C點的梯度修正當前點B的梯度(\overrightarrow{BC}

 

公式

對於在B點的小球,假設待更新的參數是\theta,則有:

\theta_{tmp}=\theta - \gamma\cdot v_{pre}......................................先向前走一步到“超前點”

v_B=\gamma \cdot v_{pre}+\eta\cdot\nabla_{\theta}J(\theta_{tmp}).................計算當前點的梯度【v_B=\gamma \cdot v_{pre}+v_C;其中v_C=\eta\cdot\nabla_{\theta}J(\theta_{tmp}) 】

\theta=\theta- v_B................................................更新參數\theta

↓ 推廣公式

v_t=\gamma \cdot v_{t-1}+\eta\cdot\nabla_{\theta}J(\theta-\gamma\cdot v_{t-1})

\theta_{new}=\theta - v_t

\gamma 代表衰減率,\eta 代表學習率,\theta 代表參數向量(一組參數)

 

4. AdaGrad

Adagrad是解決不同參數應該使用不同的更新速率的問題。Adagrad自適應地爲各個參數分配不同學習率的算法。

如何實現每個參數有不同的學習率?

將每個參數每次迭代的梯度的平方累加再開方,然後用基礎習率除以這個數,實現每個參數學習率的動態更新。

公式

對於每個參數\theta_i,在第t次迭代時的更新公式爲:

\theta_i^{t+1}=\theta_i^{t}-\frac{lr}{\sqrt{\sum_{j=0}^{t}(g^j)^2}}\cdot g^t

其中,g^j=\nabla_{\theta_i^j}J(\theta) 代表在第j次迭代時參數\theta_i的梯度

簡寫成向量的形式:

\theta^{t+1}=\theta^{t}-\frac{lr}{\sqrt{\sum_{j=0}^{t}(g^j)^2}}\cdot g^t

可以 看出隨着不斷迭代,學習率會越來越小

爲什麼隨着更新次數的增大,應該讓學習率越來越小?

因爲我們認爲在學習率的最初階段,我們是距離損失函數最優解很遠的,隨着更新的次數的增多,越來越接近最優解,學習速率也應隨之變慢。

Adagrad優缺點

優點:

  • 根據迭代次數和歷史梯度,自動調整學習率
  • 梯度較小的參數也能有較快的更新速率

缺點:

  • 由公式可以看出,仍依賴於人工設置一個全局學習率\ ETA,設置過大的話,會使正則過於敏感,對梯度的調節太大
  • 中後期,分母上梯度平方的累加將會越來越大,使得訓練提前結束 梯度\ TO0
  • 當前點梯度dx=0時,參數無法得到更新,所以無法衝過鞍點

 

5. RMSProp

爲了解決Adagrad學習率急劇下降的問題

將Adagrad中梯度的平方累加 ===》梯度的均方根(歷史梯度的平方的平均數開根號),公式如下:

E(g^2)_t=\gamma \cdot E(g^2)_{t-1}+(1-\gamma)\cdot g_t^2    -----參數的梯度的均方差

\theta^{t+1}=\theta^{t}-\frac{lr}{\sqrt{{E(g^2)_t}}} \cdot g^t

使用的是指數加權平均,旨在消除梯度下降中的擺動(路線曲折?)。當某一維的導數比較大,則指數加權平均就大,該參數的學習率就小;反之。這樣就保證了各維度的導數都在一個量級,進而減少了擺動,允許使用更大的學習率。

除了分母之外與Adagrad方法相同,克服了Adagrad學習率一直單調變小的問題,但是仍然無法衝出當前平地

 

6. Adadelta

也是爲了解決Adagrad學習率急劇下降的問題

首先也是將分母換成了均方根(root mean squared,RMS),參數更新的公式簡寫如下:

\theta^{t+1}=\theta^{t}-\frac{lr}{RMS(g)_t} \cdot g^t

其次將學習率換成了RMS(\Delta \theta),可以不需要提前設定學習率:

\theta^{t+1}=\theta^{t}-\frac{RMS(\Delta \theta)_{t-1}}{RMS(g)_t} \cdot g^t

 

7. Adam(Adaptive Moment Estimation)

這個算法是另一種計算每個參數的自適應學習率的方法。相當於 RMSprop + Momentum
除了像 Adadelta 和 RMSprop 一樣存儲了歷史梯度的平方指數衰減平均值(二階,梯度的方差) ,也像 momentum一樣保持了歷史梯度的指數衰減平均值(一階,梯度的均值---也就是將RMSprop更新量中的當前梯度g^t換成了動量發法計算出的歷史梯度的累積。公式如下:

E(g^2)_t=\gamma \cdot E(g^2)_{t-1}+(1-\gamma)\cdot g_t^2   ---二階:cache的計算公式(梯度的均方根)

E(g)_t=\beta \cdot E(g)_{t-1}+(1-\beta)\cdot g_t      ---一階:v的計算公式(梯度的指數衰減平均值,與動量法中一致)

\theta^{t+1}=\theta^{t}-\frac{lr}{\sqrt{{E(g^2)_t}}} \cdot E(g)_t

在初始化的時候初始化cache和v爲0,但是會存在偏差。所以要進行偏差校正:

E(g^2)_t= \frac{E(g^2)_t}{1-\gamma ^t}

E(g)_t= \frac{E(g)_t}{1-\beta ^t}

使兩者在剛開始訓練的時候變大,但是隨着迭代次數t的增加,\gamma^t 和 \beta^t 趨近於0,所以偏差校正只在前期進行。

 

當dx爲0的時候(小球滾動到平地),如同動量法,小球有可能憑藉歷史梯度的累積衝出平地。

 

8.AmsGrad

Adam、RMSProp、Adadelta方法可能存在不收斂的問題,因爲這三種算法的有效學習率的分母是採用梯度的均方根,其值主要受最近的梯度歷史信息的影響(由於衰減係數的存在,久遠的歷史梯度會逐漸遺忘),故其值波動較大。當它取值較小的時候會使有效學習率很大,使網絡不能收斂。

改進方法就是使有效學習率不能增加:

cache = np.max(cache, (decay_rate*cache + (1-decay_rate)*(dx**2)))

所以讓cache隨着迭代次數的增加而變化時,一定不會減小,則有效學習率不會增加,保證了收斂

 

 

效果比較

幾種算法在鞍點和等高線上的表現

鞍點:

等高線:

上面兩種情況都可以看出,Adagrad, Adadelta, RMSprop 幾乎很快就找到了正確的方向並前進,收斂速度也相當快,而其它方法要麼很慢,要麼走了很多彎路才找到。
由圖可知自適應學習率方法即 Adagrad, Adadelta, RMSprop, Adam 在這種情景下會更合適而且收斂性更好。

 

總結

 

動量

(一階,梯度的均值)

超前點的梯度

梯度的平方和開根號

(遞增)

梯度的均方根

(二階,梯度的方差,主要受最近歷史梯度的影響)

動態學習率
SGD          
動量法        
Neverov動量法      
Adagrad        
RMSProp        
Adadelt      
Adam      
AmsGrad     (保證有效學習率不增)  

 

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