【Interview】Optimization

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 可以做到不同參數的更新頻率不同 ,引入了二階動量:

  • 是對角矩陣
  • 二階動量 爲 參數ii初始時刻到時刻 tt梯度平方和

可以這樣理解:

  • 學習率等效爲
  • 對於此前頻繁更新過的參數,其二階動量的對應分量較大,學習率就較小
  • 這一方法在稀疏數據的場景下表現很好

缺點:

  • 二階動量持續累積導致學習率逐漸爲0的問題

Adadelta

採用指數移動平均公式計算,解決Adagrad 中二階動量持續累積導致學習率逐漸爲0的問題

不累積全部歷史梯度,而只關注過去一段時間窗口的下降梯度


RMSprop

採用指數移動平均公式計算,解決Adagrad 中二階動量持續累積導致學習率逐漸爲0的問題

在 Adagrad 中,

  • 是單調遞增的
    ( 二階動量 參數第 ii 維從初始時刻到時刻 tt 的梯度平方和 )
  • 使得學習率逐漸遞減至 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 加入 的變形

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