優(yōu)化算法的目的是為了優(yōu)化損失函數(shù)细燎,損失函數(shù)衡量的是模型與數(shù)據(jù)的偏離程度适滓,主要思想是計算損失函數(shù)關(guān)于參數(shù)的導數(shù)(多個參數(shù)時計算偏導數(shù)),然后沿導數(shù)的負方向迭代更新參數(shù)钠怯,一步步最小化損失函數(shù)佳魔。這類方法就叫做梯度下降法。
一階優(yōu)化算法
一階優(yōu)化算法只計算一階偏導呻疹,寫成矩陣就叫 Jacobian 矩陣吃引。
1.隨機梯度下降法SGD
Stochastic gradient descent
這里的隨機梯度下降法特指 minibatch SGD。這里隨機的意思就是每次隨機從訓練數(shù)據(jù)中選擇一批數(shù)據(jù)計算梯度來更新參數(shù)刽锤。具體流程如下:
Require: 學習率
Require: 初始參數(shù)
??while 未滿足停止條件 do
???從訓練集中采樣個樣本
的小批量镊尺,其中
對應目標為
。
???計算梯度: 其中
是當前批樣本的損失(誤差)
???應用更新:
??end while
典型的流程如下(計算當前參數(shù)下的梯度并思,沿負梯度方向更新參數(shù)):
但隨機梯度下降法有個缺點庐氮,由于梯度越大更新不長越大,導致在峽谷類型的函數(shù)上收斂非常慢宋彼,會一直在比較陡的方向來回振蕩弄砍。如圖:
2.使用動量的隨機梯度下降 momentum
隨機梯度下降法固然有用,但有時候?qū)е率諗克俣缺容^慢输涕,想想一下在一個底比較平的碗里音婶,由于碗底的梯度此時已很小,所以每次參數(shù)更新的幅度也特別小莱坎,導致算法需要很久才能到達極小值處衣式。不過在碗壁處由于梯度大,所以更新幅度也大檐什。所以可以很自然的想碴卧,可以保留在碗壁處的運動趨勢,這樣在碗底就有更快的速度即更大的參數(shù)更新幅度乃正。這里就很容易聯(lián)想到動量住册,動量是物體質(zhì)量和速度的乘積,是物體在運動方向上保持運動的趨勢(牛頓第一定律瓮具,慣性定律)荧飞。
由于有速度的物體都有動量凡人,所以這里我們認為每次更新的參數(shù)的位置都有速度,當前時刻的速度會影響之后時刻的速度叹阔,當然假設(shè)物體是單位質(zhì)量划栓,運動時間是單位時間,而SGD則可以看做在任何位置都沒有速度或者速度只使用一次便消失条获,各時刻互不影響忠荞。我們先看看物理問題中動量的運用。
假設(shè)從山坡上滾下來一個球(光滑無摩擦)帅掘,受重力的影響委煤,會一直加速直到到達水平面,每一時刻它都有山坡切線方向的速度修档,也就是有動量碧绞,這里我們計算在某一位置經(jīng)過單位時間后可以到達的位置
,如圖所示:
由于模型并不嚴謹吱窝,所以計算不會太考慮細節(jié)讥邻。的計算方式如下:
所以:
如果把上面的 看做
,把
看做
即負梯度院峡,就有:
這就是動量算法的基本思路兴使,也可以從簡單的角度理解,每次更新時都考慮歷史更新值照激,歷史更新值一直在累加发魄,所以如果遇到每次更新值方向一致(近似)的情況,那即是當前梯度很小俩垃,由于歷史累加也會在當前時間有較大的更新幅度励幼,也就是說在碗底運動時使用了碗壁處積攢的動能,收斂速度更快口柳,而且如果遇到峽谷類型的損失函數(shù)苹粟,也會一定程度上遏制在梯度大的方向上來回擺動,比如當前計算了梯度向左跃闹,而上一步計算的梯度是向右嵌削,兩個梯度向加就可以減小當前更新的幅度,保持穩(wěn)定辣卒,如圖所示:
在具體實現(xiàn)階段掷贾,需要考慮歷史累積梯度和當前梯度的權(quán)重睛榄,整體流程如下:
Require: 學習率 荣茫, 動量參數(shù)
Require: 初始參數(shù) ,初始速度
??while 未滿足停止條件 do
???從訓練集中采樣個樣本
的小批量场靴,其中
對應目標為
啡莉。
???計算梯度:
???計算速度:
???應用更新:
??end while
具體流程參考下圖:
由于動量算法考慮了之前的速度港准,所以它有可能沖過局部極小值,但是也有可能沖過全局最優(yōu)值咧欣,在損失函數(shù)曲面情況較復雜的情況下浅缸,可能會多次沖過極小值又折返回來,使收斂不穩(wěn)定魄咕,也會浪費時間衩椒。
3.自適應學習率算法Adagrad
前面的 SGD 和 Momentum 算法都是手動設(shè)置學習率 ,但是學習率往往難以設(shè)置卻對訓練過程影響很大,動量算法在一定程度上影響了學習率(
而不是
) 但是卻引入了新的動量參數(shù)哮兰。以上這些算法在所有參數(shù)上都使用了同一個學習率毛萌,但直觀上來說,每個參數(shù)的學習率應該是獨立的喝滞,應該在訓練階段自適應的調(diào)整每個參數(shù)的學習率阁将。Adagrad就是一種實現(xiàn)方法,基本思想是右遭,如果每個權(quán)重方向歷史梯度很大做盅,那么就該在這個方向減小學習率,以免越過極小點窘哈,同樣吹榴,如果某個權(quán)重方向歷史梯度較小,那么就可以在該方向使用大的學習率滚婉,加快收斂腊尚。Adagrad 使用所有歷史梯度的平方和的平方根,所以在設(shè)定初始學習率的情況下满哪,梯度較大的參數(shù)方向的學習率減小的很快婿斥,反之梯度較小的參數(shù)方向的學習率減小的比較慢,具體算法如下:
Require: 全局學習率
Require: 初始參數(shù)
Require: 小常數(shù) 哨鸭,為了數(shù)值穩(wěn)定使用民宿,大約設(shè)為
??初始化梯度累積變量
??while 未滿足停止條件 do
???從訓練集中采樣個樣本
的小批量,其中
對應目標為
像鸡。
???計算梯度:
???累積平方梯度: (對應元素相乘)
???計算更新: 活鹰,只看其中一個參數(shù)更新就是:
???應用更新:
??end while
Adagrad算法還可以從二階梯度分析,待續(xù)只估,主要參考李宏毅的Gradient Descent
雖然Adagrad效果不錯志群,但是從一開始就累積梯度平方會導致有效學習率過早和過量的減小。
4.自適應學習率算法RMSProp
RMSProp是Adagrad的修改版蛔钙,由于Adagrad使用了歷史所有的梯度锌云,所以很容易被歷史梯度影響難以做出快速調(diào)整,這點與Momentum比較像吁脱,但是Momentum有動量參數(shù)參數(shù)來控制歷史梯度的權(quán)重而Adagrad沒有這個機制桑涎,增加了這個機制就是RMSProp了彬向,控制歷史梯度的權(quán)重可以更快的對梯度變化做出調(diào)整。
具體算法如下:
Require: 全局學習率 攻冷,衰減速率
Require: 初始參數(shù)
Require: 小常數(shù) 娃胆,為了數(shù)值穩(wěn)定使用,通常設(shè)為
??初始化梯度累積變量
??while 未滿足停止條件 do
???從訓練集中采樣個樣本
的小批量等曼,其中
對應目標為
里烦。
???計算梯度:
???累積平方梯度: (對應元素相乘)
???計算更新: ,只看其中一個參數(shù)更新就是:
???應用更新:
??end while
5.自適應學習率算法Adam
Adam 結(jié)合了RMSProp和Momentum 禁谦, 可以參考Adam的論文
具體算法如下:
Require: 全局學習率 (建議默認為0.001)
Require: 矩估計的指數(shù)衰減速率招驴, 和
在區(qū)間 [0,1) 內(nèi)(建議默認分別為0.9和0.999)
Require: 初始參數(shù)
Require: 小常數(shù) ,為了數(shù)值穩(wěn)定使用枷畏,通常設(shè)為
??初始化一階和二階矩變量 别厘,
??初始化時間步
??while 未滿足停止條件 do
???從訓練集中采樣個樣本
的小批量,其中
對應目標為
拥诡。
???計算梯度:
???
???更新有偏一階矩估計(速度):
???更新有偏二階矩估計(累積平方梯度): (對應元素相乘)
???修正一階矩的偏差:
???修正二階矩的偏差:
???計算更新: (逐元素應用操作)
???應用更新:
??end while
Adam論文中給出的與其他優(yōu)化算法的比較:
6.各算法比較
二階優(yōu)化算法
二階優(yōu)化算法只計算二階偏導触趴,寫成矩陣就叫 Hessian 矩陣。
最簡單的二階優(yōu)化算法 牛頓法 渴肉,尋找函數(shù)的臨界點冗懦,臨界點有可能是極大極小點,也可能是鞍點仇祭,但是鞍點是不可取的披蕉,只有是極小點也就是Hessian矩陣正定時牛頓法才是適用的,不然牛頓法很可能找到鞍點而停止乌奇。
由于牛頓法這種尋找梯度為零(臨界點)的點的性質(zhì)没讲,導致無法成功運用在神經(jīng)網(wǎng)絡的訓練中。因為高維空間中有更多的鞍點礁苗。而低維空間的局部極小值更普遍爬凑。直觀上來理解:假設(shè)某個點每個二階偏導都大于零說明這個點事極小點,假設(shè)由拋硬幣決定二階導數(shù)的正負试伙,那在二維空間中某個點是極小點的概率就是 那在高維如五維空間中這個點是極小點的條件就是各個偏導都大于零嘁信,概率是
而只有其中一個偏導大于零的情況就比較常見。
高維空間中鞍點的激增或許就解釋了在神經(jīng)網(wǎng)絡訓練中為什么二階方法無法成功取代梯度下降法疏叨。(《深度學習》8.2)
參考資料
- 《深度學習》
- 李宏毅的在線課程