Batch gradient descent
每次更新我們需要計(jì)算整個(gè)數(shù)據(jù)集的梯度,因此使用批量梯度下降進(jìn)行優(yōu)化時(shí)禾乘,計(jì)算速度很慢澎埠,而且對于不適合內(nèi)存計(jì)算的數(shù)據(jù)將會(huì)非常棘手。批量梯度下降算法不允許我們實(shí)時(shí)更新模型始藕。
但是批量梯度下降算法能確保收斂到凸平面的全局最優(yōu)和非凸平面的局部最優(yōu)蒲稳。
SGD(Stochastic gradient descent)
隨機(jī)梯度下降算法參數(shù)更新針對每一個(gè)樣本集x(i) 和y(i) 。批量梯度下降算法在大數(shù)據(jù)量時(shí)會(huì)產(chǎn)生大量的冗余計(jì)算伍派,比如:每次針對相似樣本都會(huì)重新計(jì)算江耀。這種情況時(shí),SGD算法每次則只更新一次诉植。因此SGD算法通過更快祥国,并且適合online。
但是SGD以高方差進(jìn)行快速更新晾腔,這會(huì)導(dǎo)致目標(biāo)函數(shù)出現(xiàn)嚴(yán)重抖動(dòng)的情況舌稀。一方面,正是因?yàn)橛?jì)算的抖動(dòng)可以讓梯度計(jì)算跳出局部最優(yōu)灼擂,最終到達(dá)一個(gè)更好的最優(yōu)點(diǎn)壁查;另一方面,SGD算法也會(huì)因此產(chǎn)生過調(diào)缤至。
Min-batch gradient descent
該算法有兩個(gè)好處潮罪,1):減少了參數(shù)更新的變化,這可以帶來更加穩(wěn)定的收斂领斥。2:可以充分利用矩陣優(yōu)化漏麦,最終計(jì)算更加高效兽赁。但是Min-batch梯度下降不保證好的收斂性。
Batch gradient descent、SGD缩搅、min-batch gradient descent算法都需要預(yù)先設(shè)置學(xué)習(xí)率逮光,并且整個(gè)模型計(jì)算過程中都采用相同的學(xué)習(xí)率進(jìn)行計(jì)算盖呼。這將會(huì)帶來一些問題瓣颅,比如
1):選擇一個(gè)合適的學(xué)習(xí)率是非常困難的事情。學(xué)習(xí)率較小唬涧,收斂速度將會(huì)非常慢疫赎;而學(xué)習(xí)率較大時(shí),收斂過程將會(huì)變得非常抖動(dòng)碎节,而且有可能不能收斂到最優(yōu)捧搞。
2):預(yù)先制定學(xué)習(xí)率變化規(guī)則。比如,計(jì)算30輪之后胎撇,學(xué)習(xí)率減半介粘。但是這種方式需要預(yù)先定義學(xué)習(xí)率變化的規(guī)則,而規(guī)則的準(zhǔn)確率在訓(xùn)練過程中并不能保證晚树。
3):上述三種算法針對所有數(shù)據(jù)采用相同的學(xué)習(xí)速率姻采,但是當(dāng)我們的數(shù)據(jù)非常稀疏的時(shí)候,我們可能不希望所有數(shù)據(jù)都以相同的方式進(jìn)行梯度更新爵憎,而是對這種極少的特征進(jìn)行一次大的更新慨亲。
4):高度非凸函數(shù)普遍出現(xiàn)在神經(jīng)網(wǎng)絡(luò)中,在優(yōu)化這類函數(shù)時(shí)纲堵,另一個(gè)關(guān)鍵的挑戰(zhàn)是使函數(shù)避免陷入無數(shù)次優(yōu)的局部最小值巡雨。
Momentum
動(dòng)量可以加速SGD算法的收斂速度,并且降低SGD算法收斂時(shí)的震蕩席函。
通過添加一個(gè)衰減因子到歷史更新向量,并加上當(dāng)前的更新向量冈涧。當(dāng)梯度保持相同方向時(shí)茂附,動(dòng)量因子加速參數(shù)更新;而梯度方向改變時(shí)督弓,動(dòng)量因子能降低梯度的更新速度营曼。
NAG(Nesterov accelerated gradient)
滾雪球游戲中,我們希望有一個(gè)智能的雪球愚隧,它能夠預(yù)知運(yùn)動(dòng)的方向蒂阱,以至于當(dāng)它再次遇到斜坡的時(shí)候會(huì)減慢速度。我們可以通過計(jì)算來漸進(jìn)估計(jì)下一個(gè)位置的參數(shù)(梯度并不是完全更新)狂塘,即為
Adagrad
Adagrad優(yōu)化算法是一種自適應(yīng)優(yōu)化算法录煤,針對高頻特征更新步長較小,而低頻特征更新較大荞胡。因此該算法適合應(yīng)用在特征稀疏的場景妈踊。
先前的算法對每一次參數(shù)更新都是采用同一個(gè)學(xué)習(xí)率,而adagrad算法每一步采用不同的學(xué)習(xí)率進(jìn)行更新泪漂。我們計(jì)算梯度的公式如下:
SGD算法進(jìn)行參數(shù)更新的公式為:
Adagrad算法在每一步的計(jì)算的時(shí)候廊营,根據(jù)歷史梯度對學(xué)習(xí)率進(jìn)行修改
這里G是一個(gè)對角矩陣,對角線元素是截止當(dāng)前時(shí)刻的歷史梯度的平方和萝勤,eta是一個(gè)平方項(xiàng)露筒。如果不執(zhí)行均方根操作,算法的性能將會(huì)變得很差敌卓。
G包含了針對所有歷史梯度的平方和慎式,因此我們可以用矩陣元素乘的形式來表達(dá)上式:
Adagrad算法的主要優(yōu)點(diǎn)是它避免了手動(dòng)調(diào)整學(xué)習(xí)率的麻煩,大部分的實(shí)現(xiàn)都采用默認(rèn)值0.01。
Adagrad算法主要的缺點(diǎn)在于瞬捕,其分母梯度平方的累加和鞍历。因?yàn)槊看渭尤氲亩际且粋€(gè)正數(shù),隨著訓(xùn)練的進(jìn)行肪虎,學(xué)習(xí)率將會(huì)變得無限小劣砍,此時(shí)算法將不能進(jìn)行參數(shù)的迭代更新。
Adadelta
Adadelta算法是adagrad算法的改進(jìn)版扇救,它主要解決了adagrad算法單調(diào)遞減學(xué)習(xí)率的問題刑枝。通過約束歷史梯度累加來替代累加所有歷史梯度平方。這里通過在歷史梯度上添加衰減因子迅腔,并通過迭代的方式來對當(dāng)前的梯度進(jìn)行計(jì)算装畅,最終距離較遠(yuǎn)的梯度對當(dāng)前的影響較小,而距離當(dāng)前時(shí)刻較近的梯度對當(dāng)前梯度的計(jì)算影響較大沧烈。
通常掠兄,我們設(shè)置lambda參數(shù)為0.9。為了清楚的表達(dá)锌雀,這里我們再次列出SGD算法的計(jì)算公式:
而adagrad算法的計(jì)算公式為:
這里我們簡單的替換對角矩陣G為E(帶衰減的歷史梯度累加)
上式分母正好是均方誤差根(RMS)蚂夕,這里我們用簡寫來表達(dá):
作者提到參數(shù)更新應(yīng)該有相同的假設(shè),因此我們定義另一個(gè)指數(shù)衰減平均腋逆,這里采用的是參數(shù)更新的平方
因?yàn)閠時(shí)刻婿牍,RMS[]項(xiàng)未知,因此我們采用先前的參數(shù)RMS對當(dāng)前時(shí)刻進(jìn)行漸進(jìn)表示惩歉。最終我們有如下表達(dá)式:
采用Adadelta算法作為模型優(yōu)化器算法時(shí)等脂,我們已經(jīng)不需要設(shè)置默認(rèn)學(xué)習(xí)率。
RMSprop
RMSPprop算法和adadelta算法都是adagrad算法的優(yōu)化版撑蚌,用于解決adagrad算法學(xué)習(xí)率消失的問題上遥,從最終的計(jì)算公式來看,RMSProp算法和Adadelta算法有相似的計(jì)算表達(dá)式
Adam
Adam算法是另一種自適應(yīng)參數(shù)更新算法锨并。和Adadelta露该、RMSProp算法一樣,對歷史平方梯度v(t)乘上一個(gè)衰減因子第煮,adam算法還存儲(chǔ)了一個(gè)歷史梯度m(t)解幼。
mt和vt分別是梯度一階矩(均值)和二階矩(方差)。當(dāng)mt和vt初始化為0向量時(shí)包警,adam的作者發(fā)現(xiàn)他們都偏向于0撵摆,尤其是在初始化的時(shí)候和衰減率很小的時(shí)候(例如,beta1和beta2趨近于1時(shí))害晦。
通過計(jì)算偏差校正的一階矩和二階矩估計(jì)來抵消偏差:
利用上述的公式更新參數(shù)特铝,得到adam的更新公式:
AdaMax
Adam算法對歷史梯度的二范數(shù)進(jìn)行計(jì)算
這里我們可以改為計(jì)算歷史梯度的p范數(shù)
較大的p暑中,將會(huì)使數(shù)值計(jì)算不穩(wěn)定,這也是實(shí)際中大量使用1范數(shù)和2范數(shù)的原因鲫剿。然而鳄逾,無窮范數(shù)則是穩(wěn)定的。鑒于此灵莲,作者提出Adamax算法雕凹,通過計(jì)算無窮范數(shù),使矩估計(jì)收斂到穩(wěn)定政冻。為了和adam算法區(qū)分開枚抵,這里用u(t)表示:
替換adam算法參數(shù)更新公式分母,可得:
Nadam
Adam算法可以看作是RMSProp算法和Momentum的結(jié)合版明场。RMSProp算法通過對歷史梯度平方乘上衰減因子來計(jì)算v(t)汽摹,動(dòng)量則計(jì)算歷史梯度。我們知道NAG算法優(yōu)于momentum算法苦锨。這里nadam結(jié)合了adam算法和NAG算法逼泣,為了使用NAG算法,我們需要修改動(dòng)量表達(dá)式m(t)逆屡。
首先圾旨,回憶動(dòng)量更新表達(dá)式
將第二項(xiàng)代入第三項(xiàng)中有
從上述分析可知,動(dòng)量考慮了歷史動(dòng)量方向和當(dāng)前梯度方向魏蔗。NAG算法通過在梯度計(jì)算項(xiàng)中加入歷史動(dòng)量信息來達(dá)到一個(gè)更精確的計(jì)算,因此我們修改公式為:
Dozat提出對NAG進(jìn)行如下修改:不再進(jìn)行兩次動(dòng)量計(jì)算(一次更新梯度痹筛,一次更新參數(shù))莺治,而是采用直接更新當(dāng)前的參數(shù):
注意這里我們沒有采用前一時(shí)刻的動(dòng)量m(t-1),而是采用當(dāng)前的動(dòng)量m(t)帚稠。為了加入NGA算法谣旁,我們同樣可以替換先前的動(dòng)量向量為當(dāng)前的動(dòng)量向量。首先滋早,我們回憶adam更新規(guī)則
將上式1榄审、2帶入式3中可得
通過使用動(dòng)量的偏差校正估計(jì),可得
現(xiàn)在我們加入nesterov 動(dòng)量杆麸,采用當(dāng)前動(dòng)量的偏差校正估計(jì)替換前一時(shí)刻動(dòng)量的偏差校正估計(jì)搁进,可得:
總結(jié)
當(dāng)訓(xùn)練數(shù)據(jù)特征較為稀疏的時(shí)候,采用自適應(yīng)的優(yōu)化器通常能獲得更好的性能昔头,而且我們采用自適應(yīng)優(yōu)化器的默認(rèn)值即可獲得較優(yōu)的性能饼问。
RMSprop算法是adagrad算法的優(yōu)化版,它解決了學(xué)習(xí)率趨近于零的問題揭斧。Adadelta算法和RMSprop算法類似莱革,區(qū)別在于Adadelta用參數(shù)的RMS作為更新規(guī)則的分子。最后,Adam則是在RMSprop的基礎(chǔ)上加入了偏差校正和動(dòng)量盅视。綜上來看捐名,Adam可能是最佳的選擇。
最近很多paper都采用不帶動(dòng)量的SGD算法闹击,輔助一些簡單的學(xué)習(xí)率退火策略镶蹋。如上所述,SGD算法能夠找到極小值拇砰,但是比其他優(yōu)化器花費(fèi)的時(shí)間更多梅忌。和其他算法相比,SGD算法更加依賴于初始化參數(shù)的設(shè)置和退火策略除破,而且SGD算法更加容易陷入鞍點(diǎn)牧氮。所以,如果你想模型更快的收斂或者訓(xùn)練一個(gè)深層次瑰枫、復(fù)雜度較高的網(wǎng)絡(luò)踱葛,自適應(yīng)的優(yōu)化器應(yīng)該是首選優(yōu)化器。