# Momentum, Heavy Ball method, Nesterov accelerated gradient
[TOC]
## Momentum (動量法)
 

 
 
SGD 是最單純的 gradient decent 方法之一,找出參數的梯度(利用微分的方法),往梯度的方向去更新參數(weight),即:

θ 為權重(weight)參數,f 為 loss function, α 是學習率(learning rate), df/dθ 是損失函數對參數的梯度(微分)
 
:::info
如果把梯度下降法想像成一個小球從山坡到山谷的過程,那麼SGD方法是這樣移動的:
 
1. 從初始點A開始,計算初始點的坡度,沿著坡度最大的方向走一段路,停下到B。
2. 在B點再看一看周圍坡度最大的地方,沿著這個坡度方向再走一段路,再停下。
確切地來說,這並不像一個球,更像是一個正在下山的盲人,每走一步都要停下來,用拐杖來探探四周的路,再走一步停下來,周而復始,直到走到山谷。
:::
 

 

 
 
**Heavy Ball method**
:::success
"一顆球從山上滾下來,在下坡的時候速度越來越快,遇到上坡,方向改變,速度下降"
:::
 
動量 : 物體在它運動方向上保持運動的趨勢
 

 
 

A為起始點,首先計算A點的梯度 ∇a ,然後下降到B點,

θ 為參數 , α 為學習率
到了B點需要加上A點的梯度,這裡梯度需要有一個衰減值 γ ,可自已設置(一般取0.9)。這樣的作法可以讓早期的梯度對目前梯度的影響越來越小,如果沒有衰減值,模型往往會震盪難以收斂,甚至發散。
B點的參數更新公式為

其中 $v_{t-1}$ 表示之前所有步驟所累積的動量和
實際上,$v_t$ 可以想像成「方向速度」,動量等於質量乘以速度,而在動量學習演算法中,我們假設質量的單位為1,因此速度v就可以直接當做動量了
- 如果歷史梯度跟這次同方向的話,|Vt|(速度)會越來越大(代表梯度增強),θ 參數的更新梯度便會越來越快
- 如果方向不同,|Vt|便會比上次更小(梯度減弱),θ 參數的更新梯度便會變小
 
:::warning
- 每一步都要將兩個梯度方向(歷史梯度、當前梯度)做合併後再下降
- 梯度下降時減少震盪
:::

 
 
## Nesterov accelerated gradient
 

 
:::info
動量法每下降一步都是由前面下降方向的累積和當前點的梯度方向组合而成。
Nesterov : 既然每一步都要將兩個梯度方向(歷史梯度、當前梯度)做合併後再下降,那為什麼不先按照歷史梯度往前走一小步,按照前面一小步位置的“超前梯度”來做梯度合併?
 
1. 小球可以先往前走一步,在靠前一點的位置看到梯度
2. 按照那個位置再來修正這一步的梯度方向
:::
參數更新公式 :
**$v_t$ = γ $v_{t-1}$ + α $∇_θ$f (θ− γ $v_{t-1}$)**
**$θ_{new}$ = θ − $v_t$**
− γ $v_{t-1}$ 就是圖中B到C的那一段向量
θ− γ $v_{t-1}$ 就是C點的座標
γ 代表衰減率,α 代表學習率,f 為損失函數
 
 

 
 
:::warning
- Nesterov Momentum 震盪較低,收斂速度較 Momentum 快 ?
- Nesterov Momentum 運行速度較 Momentum 慢 ?
:::
 
 
 
 
 
 
參考資料
https://blog.csdn.net/tsyccnh/article/details/76136771
https://blog.csdn.net/tsyccnh/article/details/76270707
https://blog.csdn.net/tsyccnh/article/details/76673073
https://blog.csdn.net/u012328159/article/details/80311892
https://www.itread01.com/content/1544868782.html