Reference
https://zhuanlan.zhihu.com/p/32626442
https://zhuanlan.zhihu.com/p/21360434?refer=intelligentunit
深度學習優化算法經歷了 SGD -> SGDM -> NAG ->AdaGrad -> AdaDelta -> Adam -> Nadam 這樣的發展歷程
推薦的兩個更新方法是SGD+Nesterov動量方法,或者Adam方法
-
不同算法在損失面等高線圖中的學習過程
- Adagrad、Adadelta、RMSprop 從最開始就找到了正確的方向並快速收斂
- SGD 找到了正確方向但收斂速度很慢
- SGD-M 和 NAG 最初偏離航道,最終糾正到正確方向
SGD-M 偏離的慣性比 NAG 更大。
-
不同算法在鞍點處的表現
- Adagrad、RMSprop、Adadelta 都很快找到了正確的方向並快速收斂
- SGD、SGD-M、NAG 都受到了鞍點的嚴重影響
SGD-M、NAG 最終還是逃離了鞍點
SGD 沒有逃離靶點
Gradient Descent
-
學習率
- 梯度
- 根據歷史梯度計算的一階動量
- 根據歷史梯度計算的二階動量
- 模型參數
Vanilla SGD
樸素 SGD (Stochastic Gradient Descent) 最爲簡單,沒有動量的概念
SGD 的缺點在於收斂速度慢,可能在鞍點處震盪,停留在一個局部最優點
SGDM (SGD with Momentum)
解決SGD遇到溝壑時陷入震盪問題,引入動量momentum
SGD 在遇到溝壑時容易陷入震盪。爲此,可以爲其引入動量 Momentum ,加速 SGD 在正確方向的下降並抑制震盪。
SGD-M 在原步長之上,增加了與上一時刻步長相關的 <img src="https://leanote.com/api/file/getImage?fileId=5dc0da82ab6441425d000103) ,
- 通常取 0.9 [0.5,0.9,0.95,0.99]
和學習率隨着時間退火類似,動量隨時間變化的設置有時能略微改善最優化的效果,其中動量在學習過程的後階段會上升。一個典型的設置是剛開始將動量設爲0.5而在後面的多個週期(epoch)中慢慢提升到0.99。
好處
-
參數更新方向不僅由當前的梯度決定,也與此前累積的下降方向有關。
-
使得參數中那些梯度方向變化不大的維度可以加速更新,並減少梯度方向變化較大的維度上的更新幅度。由此產生了加速收斂和減小震盪的效果。
NAG (Nesterov Accelerated Gradient">
SGD-M 基礎上改進梯度計算公式(利用未來位置計算)
算法能夠在目標函數有增高趨勢之前,減緩更新速率
SGD-M 的基礎上進一步改進了步驟 1 中的梯度計算公式:
- SGD-M 的步長計算了當前梯度(短藍向量)和動量項 (長藍向量)
- 既然已經利用了動量項來更新 ,那不妨先計算出下一時刻 的近似位置 (棕向量)
- 並根據該未來位置 計算梯度(紅向量)
- 然後使用和 SGD-M 中相同的方式計算步長(綠向量)
這種計算梯度的方式可以使算法更好的「預測未來」,提前調整更新速率。
- 既然我們知道動量將會把我們帶到綠色箭頭指向的點,我們就不要在原點(紅色點)那裏計算梯度了
- 使用Nesterov動量,我們就在這個“lookahead”的地方計算梯度。
好處
- 在理論上對於凸函數它能得到更好的收斂,在實踐中也確實比標準動量表現更好一些
Adagrad
改進 SGD、SGD-M 和 NAG ,使不同參數的更新頻率不同,引入了二階動量
SGD、SGD-M 和 NAG 均是以相同的學習率去更新 的各個分量
而深度學習模型中往往涉及大量的參數,不同參數的更新頻率往往有所區別。
Adagrad 可以做到不同參數的更新頻率不同 ,引入了二階動量:
- 是對角矩陣
- 二階動量 爲 參數第 維從初始時刻到時刻 的梯度平方和
可以這樣理解:
- 學習率等效爲
- 對於此前頻繁更新過的參數,其二階動量的對應分量較大,學習率就較小
- 這一方法在稀疏數據的場景下表現很好
缺點:
- 二階動量持續累積導致學習率逐漸爲0的問題
Adadelta
採用指數移動平均公式計算,解決Adagrad 中二階動量持續累積導致學習率逐漸爲0的問題
不累積全部歷史梯度,而只關注過去一段時間窗口的下降梯度
RMSprop
採用指數移動平均公式計算,解決Adagrad 中二階動量持續累積導致學習率逐漸爲0的問題
在 Adagrad 中,
- 是單調遞增的
( 二階動量 爲 參數第 維從初始時刻到時刻 的梯度平方和 ) - 使得學習率逐漸遞減至 0,可能導致訓練過程提前結束
(學習率等效爲 )
爲了改進這一缺點,可以考慮在計算二階動量時不累積全部歷史梯度,而只關注最近某一時間窗口內的下降梯度
-
記 爲
-
採用指數移動平均公式計算,這樣即可避免二階動量持續累積的問題
-
和 SGD-M 中的參數類似,通常取 0.9 左右
Adam
SGD-M 和 RMSprop 的結合,把一階動量和二階動量都用起來(Adaptive + SGD-M) ,一階二階動量用指數移動平均計算,並做偏置校正
-
SGD-M
-
和 RMSprop 對二階動量使用指數移動平均類似,Adam 中對一階動量也是用指數移動平均計算
優化算法裏最常見的兩個超參數 就都在這裏了,前者控制一階動量,後者控制二階動量。
- 注意到,在迭代初始階段, 和 有一個向初值的偏移(過多的偏向了 0)
因此,可以對一階和二階動量做偏置校正 (bias correction")
NAdam
在 Adam 之上融合了 NAG 的思想
- NAG
核心在於,計算梯度時使用了「未來位置」
NAdam
-
提出了一種 公式變形的思路 ,大意可以這樣理解:
- 只要能在梯度計算中考慮到「未來因素」,即能達到 Nesterov 的效果;既然如此,那麼在計算梯度時,可以仍然使用原始公式
- 但在前一次迭代計算 時,就使用了未來時刻的動量
那麼理論上所達到的效果是類似的
-
公式修改爲
理論上-
下一刻的動量爲
-
在假定連續兩次的梯度變化不大的情況下,即
有 -
此時,即可用 近似表示未來動量加入到 的迭代式中。
-
-
在 Adam 加入 的變形
- 將 展開有
- 引入
- 參數更新