深度學(xué)習(xí)優(yōu)化器總結(jié)

一.優(yōu)化器算法簡(jiǎn)述

首先來(lái)看一下梯度下降最常見(jiàn)的三種變形 BGD,SGD鸣戴,MBGD,這三種形式的區(qū)別就是取決于我們用多少數(shù)據(jù)來(lái)計(jì)算目標(biāo)函數(shù)的梯度缰雇,這樣的話自然就涉及到一個(gè) trade-off疏之,即參數(shù)更新的準(zhǔn)確率和運(yùn)行時(shí)間。

?1.Batch Gradient Descent (BGD)

梯度更新規(guī)則:

BGD 采用整個(gè)訓(xùn)練集的數(shù)據(jù)來(lái)計(jì)算 cost function 對(duì)參數(shù)的梯度:


缺點(diǎn):

由于這種方法是在一次更新中扯旷,就對(duì)整個(gè)數(shù)據(jù)集計(jì)算梯度逼肯,所以計(jì)算起來(lái)非常慢备禀,遇到很大量的數(shù)據(jù)集也會(huì)非常棘手,而且不能投入新數(shù)據(jù)實(shí)時(shí)更新模型。


for i in range(nb_epochs):

? ????params_grad = evaluate_gradient(loss_function, data, params)

? ????params = params - learning_rate * params_grad

我們會(huì)事先定義一個(gè)迭代次數(shù) epoch,首先計(jì)算梯度向量 params_grad鹏倘,然后沿著梯度的方向更新參數(shù) params,learning rate 決定了我們每一步邁多大镜粤。

Batch gradient descent 對(duì)于凸函數(shù)可以收斂到全局極小值,對(duì)于非凸函數(shù)可以收斂到局部極小值稚矿。

2.Stochastic Gradient Descent (SGD)

梯度更新規(guī)則:

和 BGD 的一次用所有數(shù)據(jù)計(jì)算梯度相比昧识,SGD 每次更新時(shí)對(duì)每個(gè)樣本進(jìn)行梯度更新缀去,對(duì)于很大的數(shù)據(jù)集來(lái)說(shuō)咏雌,可能會(huì)有相似的樣本赊抖,這樣 BGD 在計(jì)算梯度時(shí)會(huì)出現(xiàn)冗余,而?SGD 一次只進(jìn)行一次更新寨典,就沒(méi)有冗余氛雪,而且比較快捆昏,并且可以新增樣本寇仓。

for i in range(nb_epochs):

? ? ?np.random.shuffle(data)

? ? ?forexamplein data:

? ? ?params_grad = evaluate_gradient(loss_function, example, params)

? ? ?params = params - learning_rate * params_grad


?看代碼拐云,可以看到區(qū)別,就是整體數(shù)據(jù)集是個(gè)循環(huán),其中對(duì)每個(gè)樣本進(jìn)行一次參數(shù)更新攒磨。


隨機(jī)梯度下降是通過(guò)每個(gè)樣本來(lái)迭代更新一次汤徽,如果樣本量很大的情況娩缰,那么可能只用其中部分的樣本,就已經(jīng)將theta迭代到最優(yōu)解了谒府,對(duì)比上面的批量梯度下降拼坎,迭代一次需要用到十幾萬(wàn)訓(xùn)練樣本亲轨,一次迭代不可能最優(yōu),如果迭代10次的話就需要遍歷訓(xùn)練樣本10次憎妙。缺點(diǎn)是SGD的噪音較BGD要多,使得SGD并不是每次迭代都向著整體最優(yōu)化方向铣焊。所以雖然訓(xùn)練速度快灭美,但是準(zhǔn)確度下降袁勺,并不是全局最優(yōu)雹食。雖然包含一定的隨機(jī)性,但是從期望上來(lái)看期丰,它是等于正確的導(dǎo)數(shù)的群叶。

缺點(diǎn):

SGD 因?yàn)楦卤容^頻繁,會(huì)造成 cost function 有嚴(yán)重的震蕩钝荡。

BGD 可以收斂到局部極小值街立,當(dāng)然 SGD 的震蕩可能會(huì)跳到更好的局部極小值處。

當(dāng)我們稍微減小 learning rate化撕,SGD 和 BGD 的收斂性是一樣的几晤。

3.Mini-Batch Gradient Descent (MBGD)

梯度更新規(guī)則:

MBGD 每一次利用一小批樣本,即 n 個(gè)樣本進(jìn)行計(jì)算植阴,這樣它可以降低參數(shù)更新時(shí)的方差蟹瘾,收斂更穩(wěn)定,另一方面可以充分地利用深度學(xué)習(xí)庫(kù)中高度優(yōu)化的矩陣操作來(lái)進(jìn)行更有效的梯度計(jì)算掠手。

和 SGD 的區(qū)別是每一次循環(huán)不是作用于每個(gè)樣本憾朴,而是具有 n 個(gè)樣本的批次。

for i in range(nb_epochs):

? ? ?np.random.shuffle(data)

? ? ?forbatchinget_batches(data, batch_size=50):

? ? ?params_grad = evaluate_gradient(loss_function, batch, params)

? ? ?params = params - learning_rate * params_grad


超參數(shù)設(shè)定值:n 一般取值在 50~256

缺點(diǎn):(兩大缺點(diǎn))

不過(guò) Mini-batch gradient descent 不能保證很好的收斂性喷鸽,learning rate 如果選擇的太小众雷,收斂速度會(huì)很慢,如果太大,loss function 就會(huì)在極小值處不停地震蕩甚至偏離砾省。(有一種措施是先設(shè)定大一點(diǎn)的學(xué)習(xí)率鸡岗,當(dāng)兩次迭代之間的變化低于某個(gè)閾值后,就減小 learning rate编兄,不過(guò)這個(gè)閾值的設(shè)定需要提前寫好轩性,這樣的話就不能夠適應(yīng)數(shù)據(jù)集的特點(diǎn)。)對(duì)于非凸函數(shù)狠鸳,還要避免陷于局部極小值處揣苏,或者鞍點(diǎn)處,因?yàn)榘包c(diǎn)周圍的error是一樣的件舵,所有維度的梯度都接近于0卸察,SGD 很容易被困在這里。(會(huì)在鞍點(diǎn)或者局部最小點(diǎn)震蕩跳動(dòng)铅祸,因?yàn)樵诖它c(diǎn)處坑质,如果是訓(xùn)練集全集帶入即BGD,則優(yōu)化會(huì)停止不動(dòng)个少,如果是mini-batch或者SGD洪乍,每次找到的梯度都是不同的眯杏,就會(huì)發(fā)生震蕩夜焦,來(lái)回跳動(dòng)。

SGD對(duì)所有參數(shù)更新時(shí)應(yīng)用同樣的 learning rate岂贩,如果我們的數(shù)據(jù)是稀疏的茫经,我們更希望對(duì)出現(xiàn)頻率低的特征進(jìn)行大一點(diǎn)的更新。LR會(huì)隨著更新的次數(shù)逐漸變小萎津。

鞍點(diǎn)就是:一個(gè)光滑函數(shù)的鞍點(diǎn)鄰域的曲線卸伞,曲面,或超曲面锉屈,都位于這點(diǎn)的切線的不同邊荤傲。例如這個(gè)二維圖形,像個(gè)馬鞍:在x-軸方向往上曲颈渊,在y-軸方向往下曲遂黍,鞍點(diǎn)就是(0,0)俊嗽。


為了應(yīng)對(duì)上面的兩點(diǎn)挑戰(zhàn)就有了下面這些算法雾家。

?指數(shù)加權(quán)平均

在深度學(xué)習(xí)優(yōu)化算法中,例如Momentum绍豁、RMSprop芯咧、Adam,都提到了一個(gè)概念,指數(shù)加權(quán)平均敬飒,看了Andrew Ng的深度學(xué)習(xí)課程后邪铲,總結(jié)一下什么是指數(shù)加權(quán)平均。

?式中v_t可近似代表1/(1-β)個(gè)θ的平均值无拗。

偏差修正

由以上證明可以看出霜浴,每個(gè)最新數(shù)據(jù)值,依賴于以前的數(shù)據(jù)結(jié)果蓝纲。

一般令第一個(gè)數(shù)值為0阴孟,即v0=0;但此時(shí)初期的幾個(gè)計(jì)算結(jié)果就會(huì)與真實(shí)的平均值有較大偏差税迷,具體如下:

有了指數(shù)加權(quán)平均永丝、偏差修正的基礎(chǔ),就可以研究一下深度學(xué)習(xí)中優(yōu)化算法的實(shí)現(xiàn)原理了箭养。

點(diǎn)擊進(jìn)入文章

4.Momentum

SGD 在 ravines 的情況下容易被困住慕嚷, ravines 就是曲面的一個(gè)方向比另一個(gè)方向更陡,這時(shí) SGD 會(huì)發(fā)生震蕩而遲遲不能接近極小值:


梯度更新規(guī)則:

?Momentum 通過(guò)加入 γv_t?1 毕泌,可以加速 SGD喝检, 并且抑制震蕩


當(dāng)我們將一個(gè)小球從山上滾下來(lái)時(shí),沒(méi)有阻力的話撼泛,它的動(dòng)量會(huì)越來(lái)越大挠说,但是如果遇到了阻力,速度就會(huì)變小愿题。

加入的這一項(xiàng)损俭,可以使得梯度方向不變的維度上速度變快,梯度方向有所改變的維度上的更新速度變慢潘酗,這樣就可以加快收斂并減小震蕩杆兵。

超參數(shù)設(shè)定值: ?一般 γ 取值 0.9 左右。

缺點(diǎn):

這種情況相當(dāng)于小球從山上滾下來(lái)時(shí)是在盲目地沿著坡滾仔夺,如果它能具備一些先知琐脏,例如快要上坡時(shí),就知道需要減速了的話缸兔,適應(yīng)性會(huì)更好日裙。

5.Nesterov Accelerated Gradient

梯度更新規(guī)則:

用 θ?γv_t?1 來(lái)近似當(dāng)做參數(shù)下一步會(huì)變成的值,則在計(jì)算梯度時(shí)灶体,不是在當(dāng)前位置阅签,而是未來(lái)的位置上

超參數(shù)設(shè)定值: ?一般 γ 仍取值 0.9 左右。

效果比較:

藍(lán)色是 Momentum 的過(guò)程蝎抽,會(huì)先計(jì)算當(dāng)前的梯度政钟,然后在更新后的累積梯度后會(huì)有一個(gè)大的跳躍路克。

而 NAG 會(huì)先在前一步的累積梯度上(brown vector)有一個(gè)大的跳躍,然后衡量一下梯度做一下修正(red vector)养交,這種預(yù)期的更新可以避免我們走的太快精算。

NAG 可以使 RNN 在很多任務(wù)上有更好的表現(xiàn)。

目前為止碎连,我們可以做到灰羽,在更新梯度時(shí)順應(yīng) loss function 的梯度來(lái)調(diào)整速度,并且對(duì) SGD 進(jìn)行加速鱼辙。

我們還希望可以根據(jù)參數(shù)的重要性而對(duì)不同的參數(shù)進(jìn)行不同程度的更新廉嚼。

[應(yīng)對(duì)挑戰(zhàn) 2]

?6.Adagrad (Adaptive gradient algorithm)

這個(gè)算法就可以對(duì)低頻的參數(shù)做較大的更新對(duì)高頻的做較小的更新倒戏,也因此怠噪,對(duì)于稀疏的數(shù)據(jù)它的表現(xiàn)很好,很好地提高了 SGD 的魯棒性杜跷,例如識(shí)別 Youtube 視頻里面的貓傍念,訓(xùn)練 GloVe word embeddings,因?yàn)樗鼈兌际切枰诘皖l的特征上有更大的更新葛闷。

Adagrad其實(shí)是對(duì)學(xué)習(xí)率進(jìn)行了一個(gè)約束憋槐。即:


特點(diǎn):

前期gt較小的時(shí)候, regularizer較大淑趾,能夠放大梯度

后期gt較大的時(shí)候阳仔,regularizer較小,能夠約束梯度

適合處理稀疏梯度

缺點(diǎn):

由公式可以看出治笨,仍依賴于人工設(shè)置一個(gè)全局學(xué)習(xí)率

學(xué)習(xí)率設(shè)置過(guò)大的話驳概,會(huì)使regularizer過(guò)于敏感赤嚼,對(duì)梯度的調(diào)節(jié)太大

中后期旷赖,分母上梯度平方的累加將會(huì)越來(lái)越大,使gradient趨近于0更卒,使得訓(xùn)練提前結(jié)束


7.Adadelta

改進(jìn)方法一:Accumulate Over Window

在一個(gè)窗口w中對(duì)梯度進(jìn)行求和等孵,而不是對(duì)梯度一直累加

因?yàn)榇娣?w 之前的梯度是低效的,所以可以用對(duì)先前所有梯度均值(使用RMS即均方根值實(shí)現(xiàn))的一個(gè)指數(shù)衰減作為代替的實(shí)現(xiàn)方法蹂空。

更新公式如下:

① 將累計(jì)梯度信息從全部歷史梯度變?yōu)楫?dāng)前時(shí)間向前的一個(gè)窗口期內(nèi)的累積:

相當(dāng)于歷史梯度信息的累計(jì)乘上一個(gè)衰減系數(shù)ρ俯萌,然后用(1?ρ)作為當(dāng)前梯度的平方加權(quán)系數(shù)相加。

②然后將上述E[gt2?] 開(kāi)方后上枕,作為每次迭代更新后的學(xué)習(xí)率衰減系數(shù):

咐熙,其中?是為了防止分母為0而加上的一個(gè)極小值。

這種更新方法解決了對(duì)歷史梯度一直累加而導(dǎo)致學(xué)習(xí)率一直下降的問(wèn)題辨萍,但是還是需要自己選擇初始的學(xué)習(xí)率棋恼。

改進(jìn)方法二:Correct Units with Hessian Approximation

通過(guò)牛頓法可以知道,牛頓法迭代步長(zhǎng)是f''(x),一階牛頓迭代公式為;

可以看出牛頓算法的迭代步長(zhǎng)是二階近似的解析解,不需要我們手動(dòng)指定學(xué)習(xí)率爪飘。

??而高階的牛頓法迭代的步長(zhǎng)為Hessian矩陣义起。

AdaDelta算法正是采用了這種思想,采用Hessian矩陣的對(duì)角線近似Hessian矩陣师崎。

同理對(duì)分子分母按照上一個(gè)方法進(jìn)行處理,可以得到以下公式:


7.RMSprop

RMSprop 是 Geoff Hinton 提出的一種自適應(yīng)學(xué)習(xí)率方法默终。

RMSprop 和 Adadelta 都是為了解決 Adagrad 學(xué)習(xí)率急劇下降問(wèn)題的

梯度更新規(guī)則:

RMSprop 與 Adadelta 的第一種形式相同:(使用的是指數(shù)加權(quán)平均犁罩,旨在消除梯度下降中的擺動(dòng)齐蔽,與Momentum的效果一樣,某一維度的導(dǎo)數(shù)比較大床估,則指數(shù)加權(quán)平均就大肴熏,某一維度的導(dǎo)數(shù)比較小,則其指數(shù)加權(quán)平均就小顷窒,這樣就保證了各維度導(dǎo)數(shù)都在一個(gè)量級(jí)蛙吏,進(jìn)而減少了擺動(dòng)。允許使用一個(gè)更大的學(xué)習(xí)率η)

超參數(shù)設(shè)定值:

Hinton 建議設(shè)定 γ 為 0.9, 學(xué)習(xí)率 η 為 0.001鞋吉。

8.Adam:Adaptive Moment Estimation

這個(gè)算法是另一種計(jì)算每個(gè)參數(shù)的自適應(yīng)學(xué)習(xí)率的方法鸦做。相當(dāng)于 RMSprop + Momentum

除了像 Adadelta 和 RMSprop 一樣存儲(chǔ)了過(guò)去梯度的平方 vt 的指數(shù)衰減平均值 ,也像 momentum 一樣保持了過(guò)去梯度 mt 的指數(shù)衰減平均值

如果 mt 和 vt 被初始化為 0 向量谓着,那它們就會(huì)向 0 偏置泼诱,所以做了偏差校正,通過(guò)計(jì)算偏差校正后的 mt 和 vt 來(lái)抵消這些偏差:

梯度更新規(guī)則:

超參數(shù)設(shè)定值:

建議 β1 = 0.9赊锚,β2 = 0.999治筒,? = 10e?8

實(shí)踐表明,Adam 比其他適應(yīng)性學(xué)習(xí)方法效果要好舷蒲。

?二.效果比較

下面看一下幾種算法在鞍點(diǎn)和等高線上的表現(xiàn):

SGD optimization on saddle point

?SGD optimization on loss surface contours

上面兩種情況都可以看出耸袜,Adagrad, Adadelta, RMSprop 幾乎很快就找到了正確的方向并前進(jìn),收斂速度也相當(dāng)快牲平,而其它方法要么很慢堤框,要么走了很多彎路才找到。

由圖可知自適應(yīng)學(xué)習(xí)率方法即 Adagrad, Adadelta, RMSprop, Adam 在這種情景下會(huì)更合適而且收斂性更好纵柿。

三.如何選擇優(yōu)化算法

如果數(shù)據(jù)是稀疏的蜈抓,就用自適用方法,即 Adagrad, Adadelta, RMSprop, Adam昂儒。

RMSprop, Adadelta, Adam 在很多情況下的效果是相似的沟使。

Adam 就是在 RMSprop 的基礎(chǔ)上加了 bias-correction 和 momentum,

隨著梯度變的稀疏渊跋,Adam 比 RMSprop 效果會(huì)好腊嗡。

整體來(lái)講撤缴,Adam 是最好的選擇

很多論文里都會(huì)用 SGD叽唱,沒(méi)有 momentum 等屈呕。SGD 雖然能達(dá)到極小值,但是比其它算法用的時(shí)間長(zhǎng)棺亭,而且可能會(huì)被困在鞍點(diǎn)虎眨。

如果需要更快的收斂,或者是訓(xùn)練更深更復(fù)雜的神經(jīng)網(wǎng)絡(luò)镶摘,需要用一種自適應(yīng)的算法嗽桩。



備用知識(shí):

駐點(diǎn),極值點(diǎn)凄敢,拐點(diǎn) 碌冶,鞍點(diǎn)

導(dǎo)數(shù)、微分涝缝、偏導(dǎo)數(shù)扑庞、全微分、方向?qū)?shù)拒逮、梯度的定義與關(guān)系

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末罐氨,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子滩援,更是在濱河造成了極大的恐慌栅隐,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,185評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件玩徊,死亡現(xiàn)場(chǎng)離奇詭異租悄,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)恩袱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門泣棋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人憎蛤,你說(shuō)我怎么就攤上這事外傅。” “怎么了俩檬?”我有些...
    開(kāi)封第一講書人閱讀 163,524評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)碾盟。 經(jīng)常有香客問(wèn)我棚辽,道長(zhǎng),這世上最難降的妖魔是什么冰肴? 我笑而不...
    開(kāi)封第一講書人閱讀 58,339評(píng)論 1 293
  • 正文 為了忘掉前任屈藐,我火速辦了婚禮榔组,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘联逻。我一直安慰自己搓扯,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評(píng)論 6 391
  • 文/花漫 我一把揭開(kāi)白布包归。 她就那樣靜靜地躺著锨推,像睡著了一般。 火紅的嫁衣襯著肌膚如雪公壤。 梳的紋絲不亂的頭發(fā)上换可,一...
    開(kāi)封第一講書人閱讀 51,287評(píng)論 1 301
  • 那天,我揣著相機(jī)與錄音厦幅,去河邊找鬼沾鳄。 笑死,一個(gè)胖子當(dāng)著我的面吹牛确憨,可吹牛的內(nèi)容都是我干的译荞。 我是一名探鬼主播,決...
    沈念sama閱讀 40,130評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼休弃,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼磁椒!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起玫芦,我...
    開(kāi)封第一講書人閱讀 38,985評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤浆熔,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后桥帆,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體医增,經(jīng)...
    沈念sama閱讀 45,420評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評(píng)論 3 334
  • 正文 我和宋清朗相戀三年老虫,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了叶骨。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,779評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡祈匙,死狀恐怖忽刽,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情夺欲,我是刑警寧澤跪帝,帶...
    沈念sama閱讀 35,477評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站些阅,受9級(jí)特大地震影響伞剑,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜市埋,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評(píng)論 3 328
  • 文/蒙蒙 一黎泣、第九天 我趴在偏房一處隱蔽的房頂上張望恕刘。 院中可真熱鬧,春花似錦抒倚、人聲如沸褐着。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,716評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)含蓉。三九已至,卻和暖如春镣陕,著一層夾襖步出監(jiān)牢的瞬間谴餐,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,857評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工呆抑, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留岂嗓,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,876評(píng)論 2 370
  • 正文 我出身青樓鹊碍,卻偏偏與公主長(zhǎng)得像厌殉,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子侈咕,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評(píng)論 2 354