目錄
3.Nesterov動量法(Nesterov accelerated gradient (NAG))
7. Adam(Adaptive Moment Estimation)
優化器的作用就是使用一種策略利用梯度下降法,不斷的調整參數,來使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)不一致時,減少優化時路徑的曲折程度
基本動量法中梯度方向的確定是:歷史梯度的累積和當前點的梯度方向的組合。
公式
代碼:
mu = 0.9
v = mu * v
v = v - lr * dx
x = x + v
假設每個時刻的梯度dx總是0(相當於小球滾動到平地),則可得:,可見v是指數衰減,小球只要初速度足夠大,就有機會衝出當前平地到達一個更低的山谷。
3.Nesterov動量法(Nesterov accelerated gradient (NAG))
轉自:https://blog.csdn.net/tsyccnh/article/details/76673073
思想
計算梯度時,不是在當前位置,而是未來的位置上
Nesterov想到,在基本動量法中每一步都要將兩個梯度方向(歷史梯度、當前梯度)做一個合併再下降,那麼爲什麼不按照歷史梯度先往前走一步獲得“超前點”的梯度,然後將這個超前梯度和歷史梯度進行合併?小球具有了超前意識,就變的更加聰明。
具體的方法就是:小球先按照歷史梯度走一步(先暫時更新一下參數,以便得到新參數值點的梯度),然後根據超前點的梯度來修正當前點的梯度。
直觀理解如下:
Nesterov動量法中梯度方向的確定是:歷史梯度的累積和超前點的梯度方向的組合
小球在B點先根據歷史梯度向前走一步到C點,計算C點的梯度(),然後利用C點的梯度修正當前點B的梯度()
公式
對於在B點的小球,假設待更新的參數是,則有:
......................................先向前走一步到“超前點”
.................計算當前點的梯度【;其中 】
................................................更新參數
↓ 推廣公式
代表衰減率, 代表學習率, 代表參數向量(一組參數)
4. AdaGrad
Adagrad是解決不同參數應該使用不同的更新速率的問題。Adagrad自適應地爲各個參數分配不同學習率的算法。
如何實現每個參數有不同的學習率?
將每個參數每次迭代的梯度的平方累加再開方,然後用基礎習率除以這個數,實現每個參數學習率的動態更新。
公式
對於每個參數,在第t次迭代時的更新公式爲:
其中, 代表在第次迭代時參數的梯度
簡寫成向量的形式:
可以 看出隨着不斷迭代,學習率會越來越小
爲什麼隨着更新次數的增大,應該讓學習率越來越小?
因爲我們認爲在學習率的最初階段,我們是距離損失函數最優解很遠的,隨着更新的次數的增多,越來越接近最優解,學習速率也應隨之變慢。
Adagrad優缺點
優點:
- 根據迭代次數和歷史梯度,自動調整學習率
- 梯度較小的參數也能有較快的更新速率
缺點:
- 由公式可以看出,仍依賴於人工設置一個全局學習率,設置過大的話,會使正則過於敏感,對梯度的調節太大
- 中後期,分母上梯度平方的累加將會越來越大,使得訓練提前結束
- 當前點梯度dx=0時,參數無法得到更新,所以無法衝過鞍點。
5. RMSProp
爲了解決Adagrad學習率急劇下降的問題
將Adagrad中梯度的平方累加 ===》梯度的均方根(歷史梯度的平方的平均數開根號),公式如下:
-----參數的梯度的均方差
使用的是指數加權平均,旨在消除梯度下降中的擺動(路線曲折?)。當某一維的導數比較大,則指數加權平均就大,該參數的學習率就小;反之。這樣就保證了各維度的導數都在一個量級,進而減少了擺動,允許使用更大的學習率。
除了分母之外與Adagrad方法相同,克服了Adagrad學習率一直單調變小的問題,但是仍然無法衝出當前平地。
6. Adadelta
也是爲了解決Adagrad學習率急劇下降的問題
首先也是將分母換成了均方根(root mean squared,RMS),參數更新的公式簡寫如下:
其次將學習率換成了,可以不需要提前設定學習率:
7. Adam(Adaptive Moment Estimation)
這個算法是另一種計算每個參數的自適應學習率的方法。相當於 RMSprop + Momentum
除了像 Adadelta 和 RMSprop 一樣存儲了歷史梯度的平方的指數衰減平均值(二階,梯度的方差) ,也像 momentum一樣保持了歷史梯度的指數衰減平均值(一階,梯度的均值)---也就是將RMSprop更新量中的當前梯度換成了動量發法計算出的歷史梯度的累積。公式如下:
---二階:cache的計算公式(梯度的均方根)
---一階:v的計算公式(梯度的指數衰減平均值,與動量法中一致)
在初始化的時候初始化cache和v爲0,但是會存在偏差。所以要進行偏差校正:
使兩者在剛開始訓練的時候變大,但是隨着迭代次數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 | √ | √(保證有效學習率不增) |