動量的核心概念就是依據現實生活中物理上的慣性去更新參數,參數更新公式:
當前參數更新時除了梯度,還會考慮前一步的梯度 ( 移動方向 ) ,這意味者下一步的位置不再僅取決於當前位置參數的梯度,如果我們是用傳統梯度下降 ( SGD / BGD / MBGD ) 來更新參數,通常很容易會陷入 Local Min 中無法逃脫,但 Momentum 在參數更新時加了慣性的概念 ,像下面這張圖,當紅球從很陡的地方往下移動到 Local Mina,此時會有個來自上一步的慣性 使紅球不會移動到 Local Min 就停止,而是藉著慣性讓紅球能夠從 Local Min 向上爬升,如果這個夠大的話,就能夠讓紅球爬出 Local Min 的坑洞繼續向前往 Global Min 處移動,但是往下移動到 Global Min 時,此時的慣性沒有大到能讓紅球爬出 Global Min,最紅球會逐漸接近 Global Min 並在其附近來回移動震盪。
Momentum 的目的就是讓參數在更新過程中能夠根據「慣性」穿越 Local Min,而不是完全停止在 Local Min,並避免落入局部最低點,解決了傳統梯度下降法的問題。
AdaGrad 根據名子可以翻譯為「自我調整 ( Ada ) 梯度 ( Grad )」,秉持自適學習率的概念,對訓練過程來說,尋找最佳解時學習率大小至關重要,太小或太大都會影響結果表現,先前介紹的優化器,在訓練時學習率都為固定值,而 AdaGrad 主要特性就是在每次參數更新時,依照梯度去調整參數的學習率,意味著每個參數的學習率都是獨立的。
關於學習率的調整,用前幾天提到的 1/t 衰減 ,但這方法太過於簡單,AdaGrad 將其改良為下面公式,這邊多加一個 是為了分母不為 0 ( 修正項 ):
因此參數的更新公式如下:
就是第 次參數更新時的梯度, 則代表第 次以前 ( 包括第 次 ) 所有梯度的平方 ( 取正數 ) 加上 再開根號。
RMSprop 可說是 AdaGrad 的加強版,可以發現 RMSprop 在學習率的調整上多了一個參數 ,用來調節舊梯度和新梯度,也就是歷史梯度平方累積 和當前梯度平方 的權重, 也可視為衰減率 ( 衰減係數 ),把 往上調 ,參數更新過程中便較傾向舊梯度帶給我們的資訊,此時新梯度前的參數為 ( 1 - ),其影響力就會較小,因次 RMSprop 在每次更新參數時可對學習率放大和衰減,解決了 AdaGrad 在學習率衰退過快導致模型收斂效果不佳和訓練提早結束的問題。
參數更新公式為,一樣會加上 修正項避免分母為 0:
RMSProp 能透過對梯度平方項權重的調配和修正项,更好地平衡與動態控制學習率大小,使得其在實踐上相對AdaGrad 表现更為出色,但仍需事先設好全局學習率 。
Adam 可說是 Momentum 和 RMSprop 兩種優化器的結合,其實就是加了動量概念的 RMSprop,Momentum 的行為可視為一個沿著斜坡運動的球,Adam 的行為像一個有摩擦力的球,Adam 引入了動量項,用來在參數更新時考量歷史梯度,把 RMSprop 新舊梯度權重的概念帶到了動量項 和歷史梯度平方累積項 ( 如下面公式 ),而 和 可分別是為兩項的衰減率參數,兩個參數的選擇對於 Adam 性能和收斂速度至關重要。
在訓練迭代初期,因為 和 的初值都為 0,當衰減率參數 ( 、 ) 接近 1 時,、 兩項都會接近 0,導致學習率過大,從而使估計值會產生偏差,因此分別對兩項做偏差校正以解決這個問題。
最後得到參數的更新公式:
每个優化器都有其特定的優點和缺點,適用於不同的問題和情況。選擇合適的優化算法通常需要藉由不斷實驗和調整參數來確定。在實際應用中,可以根據問題的性質和資料的特性來選擇最合適的算法。
以下圖片源自 Alec Radford 大神,比較各種優化器更新參數的工作過程:
今天我們學到的優化器:
在今天我們就連同昨天把所有優化器的知識都收入囊中,梯度下降的算法主要是基於損失函數 ( 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