機器學(xué)習(xí)優(yōu)化過程中的各種梯度下降方法(SGD谷异,AdaGrad分尸,RMSprop,AdaDelta歹嘹,Adam箩绍,Momentum,Nesterov)
實際上尺上,優(yōu)化算法可以分成一階優(yōu)化和二階優(yōu)化算法材蛛,其中一階優(yōu)化就是指的梯度算法及其變種,而二階優(yōu)化一般是用二階導(dǎo)數(shù)(Hessian 矩陣)來計算怎抛,如牛頓法卑吭,由于需要計算Hessian陣和其逆矩陣,計算量較大马绝,因此沒有流行開來豆赏。這里主要總結(jié)一階優(yōu)化的各種梯度下降方法。先從最原始的梯度下降開始富稻。
SGD算法
簡單來講:樣本少可以采用Batch Gradient Descent掷邦,樣本過大可以SGD,實際情況下一般Mini-batch Gradient Descent唉窃。
BGD是一次將所有的樣本點進(jìn)行掃描并計算出梯度:
這樣雖然簡單耙饰,但是具有一個很大的缺陷纹笼,就是對于較大的數(shù)據(jù)集速度很慢纹份,而且也并不保險,很可能花了很長時間走到了局部最優(yōu),可是又出不來了蔓涧,因為這里的梯度是0件已。所以并不實用。
樣本較大時可以用SGD元暴,隨機梯度下降篷扩,也就是說,每次只用一個隨機抽取的樣本點求導(dǎo)數(shù)茉盏,作為最終結(jié)果鉴未,進(jìn)行下降:
這里的g代表著某一個樣本的gradient。這樣雖然不如直接做BGD在路徑上更穩(wěn)定鸠姨,但是一般最終會找到最優(yōu)解铜秆。而且還有好處是可以在局部最優(yōu)解中跳出來,只要新選取的一個樣本可以提供一個向外的梯度讶迁。SGD是一種可以用來做在線學(xué)習(xí)的连茧,也就是每進(jìn)來一個樣本就更新一下參數(shù)。另外巍糯,SGD比BGD收斂更快啸驯。
常用的一個是Mini-batch gradient,也就是每次訓(xùn)練一個batch祟峦,可以盡量減少波動罚斗,同時又不必把所有的都投入訓(xùn)練。因此比較常用宅楞。但是小批量下降并不能保證很好的收斂惰聂,并且,需要選擇learning rate咱筛,這是很困難的搓幌。
AdaGrad
前面的sgd是對所有的參數(shù)統(tǒng)一求導(dǎo)和下降的,但是由于實際數(shù)據(jù)中可能存在這樣一種情況:有些參數(shù)已經(jīng)近乎最優(yōu)迅箩,因此只需要微調(diào)了溉愁,而另一些可能還需要很大的調(diào)整。這種情況可能會在樣本較少的情況下出現(xiàn)饲趋,比如含有某一特征的樣本出現(xiàn)較少拐揭,因此被代入優(yōu)化的次數(shù)也較少,這樣就導(dǎo)致不同參數(shù)的下降不平衡奕塑。adagrad就是來處理這類問題的堂污。
adagrad的基本想法是,對每個參數(shù)theta自適應(yīng)的調(diào)節(jié)它的學(xué)習(xí)率龄砰,自適應(yīng)的方法就是對每個參數(shù)乘以不同的系數(shù)盟猖,并且這個系數(shù)是通過之前累積的梯度大小的平方和決定的讨衣,也就是說,對于之前更新很多的式镐,相對就可以慢一點反镇,而對那些沒怎么更新過的,就可以給一個大一些的學(xué)習(xí)率娘汞。
Adagrad的算法如下:
RMSprop
這個實際上是對adagrad的一個改進(jìn)歹茶,也就是把Adagrad對歷史梯度加和變成了對歷史梯度求均值(當(dāng)然這個不是嚴(yán)格意義上的均值),然后用這個均值代替Adagrad的累加的梯度和對當(dāng)前梯度進(jìn)行加權(quán)你弦,并用來update惊豺。
用均值代替求和是為了解決Adagrad的學(xué)習(xí)率逐漸消失的問題。
AdaDelta
這個更高級禽作,用AdaDelta下降我們甚至不需要設(shè)置學(xué)習(xí)率扮叨。它的基本思路是這樣:首先,借鑒了Adagrad的思路领迈,對每個參數(shù)進(jìn)行自適應(yīng)的學(xué)習(xí)率變化彻磁,依據(jù)的也是之前的梯度的累積,但是這里不是像Adagrad那樣直接加起來狸捅,而是用平均值的方式(實際使用的是RMS)衷蜓,把之前的梯度大小的影響加進(jìn)來。目的是計算歷史梯度在某個窗內(nèi)的值的均值尘喝,但是不通過儲存窗口內(nèi)的值磁浇,而是用了當(dāng)前的均值和當(dāng)前的梯度來近似計算。另外朽褪,為了解決Adagrad置吓,sgd等方法中直接用梯度的倒數(shù)可能帶來的假設(shè)單位不相同的問題(個人理解是這樣:希望更新梯度乘上系數(shù)以后,那個系數(shù)是不帶單位的缔赠,這樣update和當(dāng)前的parameter有相同的單位才能疊加)衍锚,把梯度的系數(shù)的分子上的eta換成了之前更新的部分Delta(theta)的RMS,這樣嗤堰,更新就變成了:
整個AdaDelta的算法流程如下:
Adam
adam名字來源是adaptive moment estimation戴质。Our method is designed to combine the advantages of two recently popular methods: AdaGrad (Duchi et al., 2011), which works well with sparse gradients, and RMSProp (Tieleman & Hinton, 2012), which works well in on-line and non-stationary settings。也就是說踢匣,adam融合了Adagrad和RMSprop的思想告匠。
這里,用gt的一次方和平方來估計一階矩和二階矩离唬,由于不是全部儲存求平均后专,而是迭代更新的方法,所以會有bias输莺,兩個帶hat 的mt和vt就是消除bias以后的結(jié)果戚哎。然后用這兩個估計的m和v進(jìn)行更新裸诽。
Momentum
動量法是為了解決維度的傾斜程度不相等的問題,讓下一步的位置帶上一些上一次的慣性建瘫,而不是完全按照更新后的走崭捍,這樣會更穩(wěn)一點尸折,減輕上圖所示zigzag的這種情況啰脚。
Nesterov Accelerated Gradient (NAG)
NAG的思路也很簡單,那就是要解決直接動量下降可能直接邁的步子太大的問題实夹,因為我們當(dāng)前下降的時候是無法知道下一步究竟落在一個什么地方的橄浓。但是由于momentum中我們常常把動量項,也就是上一時刻的更新的值亮航,的權(quán)重設(shè)置為0.9左右荸实,也就是說,下一步達(dá)到的位置很大程度是由動量項決定的缴淋,因此我們可以先用動量項估計一下下一步的大概位置准给,然后在估計的位置求取梯度,在將這個梯度作為更新的梯度項重抖,和動量項加起來做一個update露氮。
下面這個圖表示的就是momentum和NAG的區(qū)別,藍(lán)色是momentum钟沛,先計算梯度畔规,在加上動量,紅和綠色表示NAG恨统,先加上動量項叁扫,再計算梯度。
————————————————
版權(quán)聲明:本文為CSDN博主「江戶川柯壯」的原創(chuàng)文章畜埋,遵循CC 4.0 BY-SA版權(quán)協(xié)議莫绣,轉(zhuǎn)載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/edogawachia/article/details/80071967