iT邦幫忙

2023 iThome 鐵人賽

DAY 13
0

動量 Momentum

動量的核心概念就是依據現實生活中物理上的慣性去更新參數,參數更新公式:

https://ithelp.ithome.com.tw/upload/images/20230928/20158157sw54XFpzXk.png

當前參數更新時除了梯度,還會考慮前一步的梯度 ( 移動方向 ) https://chart.googleapis.com/chart?cht=tx&chl=%5Cbeta%20V_t,這意味者下一步的位置不再僅取決於當前位置參數的梯度,如果我們是用傳統梯度下降 ( SGD / BGD / MBGD ) 來更新參數,通常很容易會陷入 Local Min 中無法逃脫,但 Momentum 在參數更新時加了慣性的概念 ,像下面這張圖,當紅球從很陡的地方往下移動到 Local Mina,此時會有個來自上一步的慣性 https://chart.googleapis.com/chart?cht=tx&chl=%5Cbeta%20V_%7Bt-1%7D 使紅球不會移動到 Local Min 就停止,而是藉著慣性讓紅球能夠從 Local Min 向上爬升,如果這個夠大的話,就能夠讓紅球爬出 Local Min 的坑洞繼續向前往 Global Min 處移動,但是往下移動到 Global Min 時,此時的慣性沒有大到能讓紅球爬出 Global Min,最紅球會逐漸接近 Global Min 並在其附近來回移動震盪。

undefined

Momentum 的目的就是讓參數在更新過程中能夠根據「慣性」穿越 Local Min,而不是完全停止在 Local Min,並避免落入局部最低點,解決了傳統梯度下降法的問題。

AdaGrad ( Adaptive Gradient )

AdaGrad 根據名子可以翻譯為「自我調整 ( Ada ) 梯度 ( Grad )」,秉持自適學習率的概念,對訓練過程來說,尋找最佳解時學習率大小至關重要,太小或太大都會影響結果表現,先前介紹的優化器,在訓練時學習率都為固定值,而 AdaGrad 主要特性就是在每次參數更新時,依照梯度去調整參數的學習率,意味著每個參數的學習率都是獨立的。

關於學習率的調整,用前幾天提到的 1/t 衰減 https://chart.googleapis.com/chart?cht=tx&chl=%5Ceta%5Et%3D%5Cfrac%7B%5Ceta%7D%7B%5Csqrt%7Bt%2B1%7D%7D,但這方法太過於簡單,AdaGrad 將其改良為下面公式,這邊多加一個 https://chart.googleapis.com/chart?cht=tx&chl=%5Cepsilon 是為了分母不為 0 ( 修正項 ):

https://ithelp.ithome.com.tw/upload/images/20230928/20158157Iyn1qzvf5B.png

因此參數的更新公式如下:

https://ithelp.ithome.com.tw/upload/images/20230928/201581579bxKPC5VEi.png

https://chart.googleapis.com/chart?cht=tx&chl=g%5Et 就是第 https://chart.googleapis.com/chart?cht=tx&chl=t 次參數更新時的梯度,https://chart.googleapis.com/chart?cht=tx&chl=%5Csigma%5Et 則代表第 https://chart.googleapis.com/chart?cht=tx&chl=t 次以前 ( 包括第 https://chart.googleapis.com/chart?cht=tx&chl=t 次 ) 所有梯度的平方 ( 取正數 ) 加上 https://chart.googleapis.com/chart?cht=tx&chl=%5Cepsilon 再開根號。

特點

  • AdaGrad 通過累積所有參數的梯度在對於每個參數動態調整學習率的大小
  • AdaGrad 減少了需要手動調整學習率的需求,傳統梯度下降必須要手動調整學習率以平穩模型的收斂和穩定性,但 AdaGrad 在訓練時可依據當前參數的梯度不斷適應調整學習率
  • 訓練前期時,學習率的約束項 https://chart.googleapis.com/chart?cht=tx&chl=%5Ceta%5Et%3D%5Cdisplaystyle%7B%5Cfrac%7B%5Ceta%7D%7B%5Csqrt%7B%5Csum%5Climits_%7Bn%3D1%7D%5E%7Bt%7D(%5Cdisplaystyle%7B%5Cfrac%7B%5Cpartial%20L%7D%7B%5Cpartial%20w_i%7D%7D(%5Cboldsymbol%7BW%7D%5En))%5E2%2B%5Cepsilon%7D%7D%7D 較小,使學習率較大
  • 在AdaGrad中,學習率的調整基於參數的歷史梯度平方累積 ( https://chart.googleapis.com/chart?cht=tx&chl=%5Csigma%5Et ),當一個參數的梯度較大 ( 稠密梯度 ),https://chart.googleapis.com/chart?cht=tx&chl=%5Csigma%5Et 會變大,學習率逐漸減小,而當參數的梯度較小 ( 稀疏梯度 ),https://chart.googleapis.com/chart?cht=tx&chl=%5Csigma%5Et 變小,學習率就變大,這意味著對於各種不同的梯度,AdaGrad 都能夠適應狀況保持合適的學習率大小,不會因梯度小而過於保守,因梯度大而過於激進

限制

  • 訓練後期時,AdaGrad 隨著迭代增加,所有梯度的累積會逐漸變大 ( 分母變大 ),從而使學習率衰退至趨於 0,導致參數不再更新使訓練過早結束
  • AdaGrad 對於 https://chart.googleapis.com/chart?cht=tx&chl=L 為 Non-Convex 時,仍可以遭遇陷入局部最小值 Local Min 的情況

RMSprop

RMSprop 可說是 AdaGrad 的加強版,可以發現 RMSprop 在學習率的調整上多了一個參數 https://chart.googleapis.com/chart?cht=tx&chl=%24%5Calpha%24,用來調節舊梯度和新梯度,也就是歷史梯度平方累積 https://chart.googleapis.com/chart?cht=tx&chl=(%5Csigma%5E%7Bt-1%7D)%5E2 和當前梯度平方 https://chart.googleapis.com/chart?cht=tx&chl=(g%5Et)%5E2的權重,https://chart.googleapis.com/chart?cht=tx&chl=%5Calpha 也可視為衰減率 ( 衰減係數 ),把 https://chart.googleapis.com/chart?cht=tx&chl=%5Calpha 往上調 ,參數更新過程中便較傾向舊梯度帶給我們的資訊,此時新梯度前的參數為 ( 1 - https://chart.googleapis.com/chart?cht=tx&chl=%5Calpha ),其影響力就會較小,因次 RMSprop 在每次更新參數時可對學習率放大和衰減,解決了 AdaGrad 在學習率衰退過快導致模型收斂效果不佳和訓練提早結束的問題。

參數更新公式為,一樣會加上 https://chart.googleapis.com/chart?cht=tx&chl=%5Cepsilon 修正項避免分母為 0:

https://ithelp.ithome.com.tw/upload/images/20230928/2015815758aEHJb6dD.png

RMSProp 能透過對梯度平方項權重的調配和修正项,更好地平衡與動態控制學習率大小,使得其在實踐上相對AdaGrad 表现更為出色,但仍需事先設好全局學習率 https://chart.googleapis.com/chart?cht=tx&chl=%5Ceta

Adam

Adam 可說是 Momentum 和 RMSprop 兩種優化器的結合,其實就是加了動量概念的 RMSprop,Momentum 的行為可視為一個沿著斜坡運動的球,Adam 的行為像一個有摩擦力的球,Adam 引入了動量項,用來在參數更新時考量歷史梯度,把 RMSprop 新舊梯度權重的概念帶到了動量項 https://chart.googleapis.com/chart?cht=tx&chl=m_t 和歷史梯度平方累積項 https://chart.googleapis.com/chart?cht=tx&chl=V_t ( 如下面公式 ),而 https://chart.googleapis.com/chart?cht=tx&chl=%5Cbeta_1https://chart.googleapis.com/chart?cht=tx&chl=%5Cbeta_2 可分別是為兩項的衰減率參數,兩個參數的選擇對於 Adam 性能和收斂速度至關重要。

https://ithelp.ithome.com.tw/upload/images/20230928/20158157BbnAZzHZsX.png

在訓練迭代初期,因為 https://chart.googleapis.com/chart?cht=tx&chl=m_thttps://chart.googleapis.com/chart?cht=tx&chl=v_t 的初值都為 0,當衰減率參數 ( https://chart.googleapis.com/chart?cht=tx&chl=%5Cbeta_1https://chart.googleapis.com/chart?cht=tx&chl=%5Cbeta_2 ) 接近 1 時,https://chart.googleapis.com/chart?cht=tx&chl=m_thttps://chart.googleapis.com/chart?cht=tx&chl=v_t 兩項都會接近 0,導致學習率過大,從而使估計值會產生偏差,因此分別對兩項做偏差校正以解決這個問題。

https://ithelp.ithome.com.tw/upload/images/20230928/20158157tydiSlZs2L.png

最後得到參數的更新公式:

https://ithelp.ithome.com.tw/upload/images/20230928/20158157P4F0r3TbrE.png

  • 結合 AdaGrad、RMSprop、Momemtum 優點
  • 對於所有參數都有對其新舊梯度做調節
  • 適用於各種狀況,目前較推薦也較常用

每个優化器都有其特定的優點和缺點,適用於不同的問題和情況。選擇合適的優化算法通常需要藉由不斷實驗和調整參數來確定。在實際應用中,可以根據問題的性質和資料的特性來選擇最合適的算法。

https://ithelp.ithome.com.tw/upload/images/20230928/20158157EyX7oduPht.png

以下圖片源自 Alec Radford 大神,比較各種優化器更新參數的工作過程:

undefined
undefined

小結

今天我們學到的優化器:

  • 動量 Momentum
  • AdaGrad
  • RMSprop
  • Adam

在今天我們就連同昨天把所有優化器的知識都收入囊中,梯度下降的算法主要是基於損失函數 ( Loss Function ) 做計算的,在下一篇文章中,我們就要來介紹損失函數的概念,那我們下篇文章見 ~

參考資料

https://medium.com/@kaitotally/adam-the-birthchild-of-adagrad-and-rmsprop-b5308b24b9cd

https://www.youtube.com/watch?v=xki61j7z-30

https://medium.com/雞雞與兔兔的工程世界/機器學習ml-note-sgd-momentum-adagrad-adam-optimizer-f20568c968db

https://www.youtube.com/watch?v=yKKNr-QKz2Q&list=PLJV_el3uVTsPy9oCRY30oBPNLCo89yu49&index=6

https://hackmd.io/@allen108108/H1l4zqtp4


上一篇
【Day 12】優化器 Optimizer ( 一 )
下一篇
【Day 14】損失函數 Loss Function
系列文
戀 AI ing - 我與機器學習的邂逅30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言