是時候談?wù)剝?yōu)化算法了。不管是求解優(yōu)化目標(biāo)還是為了調(diào)參,只要問題從理論層面上升到實際操作層面,就離不開優(yōu)化算法。本節(jié)講主要圍繞梯度下降(Gradient Descent)算法展開。
動量法(Momentum)普通的梯度下降法解決常規(guī)問題就足夠了,如線性回歸,但當(dāng)問題變復(fù)雜,普通的梯度下降法就會面臨很多局限。具體來說,對于普通的梯度下降法公式 , 表示學(xué)習(xí)率,含義是每一時間步上梯度調(diào)整的步長(step-size)。當(dāng)接近最優(yōu)值時梯度會比較小,由于學(xué)習(xí)率固定,普通的梯度下降法的收斂速度會變慢,有時甚至陷入局部最優(yōu)。這時如果考慮歷史梯度,將會引導(dǎo)參數(shù)朝著最優(yōu)值更快收斂,這就是動量算法的基本思想。
陷入局部最優(yōu)或在平原部分緩步前行結(jié)合物理學(xué)上的動量思想,在梯度下降問題中引入動量項m和折扣因子 ,公式變?yōu)? , 。其中, 表示歷史梯度的影響力, 越大,歷史梯度對現(xiàn)在的影響也越大。直觀上來說,要是當(dāng)前時刻的梯度與歷史梯度方向趨近,這種趨勢會在當(dāng)前時刻加強,否則當(dāng)前時刻的梯度方向減弱。若用 表示第t輪迭代的動量, 表示第t輪迭代的更新量,當(dāng) , ,該式的含義是如果梯度保持不變,最終的更新速度會是梯度項乘以學(xué)習(xí)率的 倍。舉例來說, 時,動量算法最終的更新速度是普通梯度下降法的10倍,意味著在穿越“平原”和“平緩山谷”從而擺脫局部最小值時,動量法更有優(yōu)勢。
考慮一個二元函數(shù)的例子, ,利用動量法求最小值。
二元函數(shù)的三維可視化圖時,在等高線圖上的曲線如下:
圖(a)時,曲線如下:
圖(b)觀察比較(a)(b)時可知,當(dāng)折扣率變大時,對歷史梯度的記憶更多,下一步梯度方向會沒這么容易改變過來(從圖上直觀理解,(b)扭轉(zhuǎn)程度不如(a),即(b)的震蕩更明顯)。
牛頓動量(Nesterov)算法觀察上圖(b)可發(fā)現(xiàn),盡管算法最終找到了最優(yōu)值,但在過程中由于y方向的梯度比x方向大很多,所以軌跡在y方向存在強烈的震蕩抖動。于是Yurii Nesterov在1983年提出了牛頓動量法,改進(jìn)在于不是在 做梯度更新,而是前瞻一步,超前一個動量單位處: 。則梯度修正公式變?yōu)椋? , 。
Nesterov與普通動量更新的比較在上圖中, 表示普通動量法的梯度更新向量, 表示Nesterov梯度更新向量。直觀分析可知, 會比 超前,即牛頓動量法更新會比動量法快。另一方面,當(dāng) 項越過最優(yōu)點(optimum)時, 指向另一側(cè)梯度上升方向,而 指向梯度下降方向,故牛頓動量法能減弱震蕩。
同樣以之前的二元函數(shù)做例子,使用Nesterov法參數(shù)設(shè)置 時效果如下:
Nesterov算法更新過程錄屏https://www.zhihu.com/video/1092523728449224704自然梯度法(Natural Gradient Descent)當(dāng)優(yōu)化問題的兩個坐標(biāo)軸尺度差異較大時,動量法在更新過程中會出現(xiàn)震蕩問題,Nesterov算法給出了初步解決,但這兩種方法有一個共性,就是都是從參數(shù)的角度去優(yōu)化模型的,那有沒有可能從模型本身角度來考慮呢?——這就是自然梯度法。在強化學(xué)習(xí)的Natural Actor-Critic算法和TRPO算法中,自然梯度法是強有力的優(yōu)化工具。
自然梯度法用到Fisher信息矩陣(Fisher Information Matrix)對KL散度進(jìn)行近似表示,首先介紹一下Fisher信息矩陣。 表示以 概率計算得到的期望,F(xiàn)isher信息矩陣定義為 。以KL散度表示兩個模型之間的距離,有近似關(guān)系式 。以參數(shù)視角看待梯度下降時,可以把每一輪的優(yōu)化看作這樣一個子優(yōu)化問題:
使用自然梯度法以模型距離視角看待問題時,條件限制項變?yōu)榱?
以Fisher矩陣替代并采用拉格朗日乘子法解帶約束的優(yōu)化問題,原問題變?yōu)?/p>
對 求導(dǎo),得 ,故優(yōu)化方向可以看作 的反方向。
時隔一年,終于把代碼傳上來啦:
https://github.com/zhengsizuo/Deep-Learning-Note/blob/master/basic%20theory/optimization_algorithm.py參考:《Hands-On Machine Learning with Scikit-Learn and TensorFlow》第11章