動(dòng)量梯度下降法(Gradient descent with Momentum)
還有一種算法叫做Momentum,或者叫做動(dòng)量梯度下降法,運(yùn)行速度幾乎總是快于標(biāo)準(zhǔn)的梯度下降算法,簡(jiǎn)而言之,基本的想法就是計(jì)算梯度的指數(shù)加權(quán)平均數(shù),并利用該梯度更新你的權(quán)重,在本筆記中,我們要一起拆解單句描述,看看你到底如何計(jì)算。
例如,如果你要優(yōu)化成本函數(shù),函數(shù)形狀如圖,紅點(diǎn)代表最小值的位置,假設(shè)你從這里(藍(lán)色點(diǎn))開(kāi)始梯度下降法,如果進(jìn)行梯度下降法的一次迭代,無(wú)論是batch或mini-batch下降法,也許會(huì)指向這里,現(xiàn)在在橢圓的另一邊,計(jì)算下一步梯度下降,結(jié)果或許如此,然后再計(jì)算一步,再一步,計(jì)算下去,你會(huì)發(fā)現(xiàn)梯度下降法要很多計(jì)算步驟對(duì)吧?
慢慢擺動(dòng)到最小值,這種上下波動(dòng)減慢了梯度下降法的速度,你就無(wú)法使用更大的學(xué)習(xí)率,如果你要用較大的學(xué)習(xí)率(紫色箭頭),結(jié)果可能會(huì)偏離函數(shù)的范圍,為了避免擺動(dòng)過(guò)大,你要用一個(gè)較小的學(xué)習(xí)率。
另一個(gè)看待問(wèn)題的角度是,在縱軸上,你希望學(xué)習(xí)慢一點(diǎn),因?yàn)槟悴幌胍@些擺動(dòng),但是在橫軸上,你希望加快學(xué)習(xí),你希望快速?gòu)淖笙蛴乙?,移向最小值,移向紅點(diǎn)。
所以使用動(dòng)量梯度下降法,你需要做的是,在每次迭代中,確切來(lái)說(shuō)在第t次迭代的過(guò)程中,你會(huì)計(jì)算微分dW,db,我會(huì)省略上標(biāo)[l],你用現(xiàn)有的mini-batch計(jì)算dW,db。
如果你用batch梯度下降法,現(xiàn)在的mini-batch就是全部的batch,對(duì)于batch梯度下降法的效果是一樣的。如果現(xiàn)有的mini-batch就是整個(gè)訓(xùn)練集,效果也不錯(cuò),你要做的是計(jì)算v_dW=βv_dW+(1-β)dW,這跟我們之前的計(jì)算相似,也就是v=βv+(1-β) θ_t,dW的移動(dòng)平均數(shù),接著同樣地計(jì)算v_db,v_db=βv_db+(1-β)db,然后重新賦值權(quán)重,W:=W-av_dW,同樣b:=b-av_db,這樣就可以減緩梯度下降的幅度。
例如,在上幾個(gè)導(dǎo)數(shù)中,
你會(huì)發(fā)現(xiàn)這些縱軸上的擺動(dòng)平均值接近于零,所以在縱軸方向,你希望放慢一點(diǎn),平均過(guò)程中,正負(fù)數(shù)相互抵消,所以平均值接近于零。
但在橫軸方向,所有的微分都指向橫軸方向,因此橫軸方向的平均值仍然較大,因此用算法幾次迭代后,你發(fā)現(xiàn)動(dòng)量梯度下降法,最終縱軸方向的擺動(dòng)變小了,橫軸方向運(yùn)動(dòng)更快,因此你的算法走了一條更加直接的路徑,在抵達(dá)最小值的路上減少了擺動(dòng)。
動(dòng)量梯度下降法的一個(gè)本質(zhì),這對(duì)有些人而不是所有人有效,就是如果你要最小化碗狀函數(shù),這是碗的形狀,我畫(huà)的不太好。
它們能夠最小化碗狀函數(shù),這些微分項(xiàng),想象它們?yōu)槟銖纳缴贤聺L的一個(gè)球,提供了加速度,Momentum項(xiàng)相當(dāng)于速度。
想象你有一個(gè)碗,你拿一個(gè)球,微分項(xiàng)給了這個(gè)球一個(gè)加速度,此時(shí)球正向山下滾,球因?yàn)榧铀俣仍綕L越快,而因?yàn)棣?稍小于1,表現(xiàn)出一些摩擦力,所以球不會(huì)無(wú)限加速下去,所以不像梯度下降法,每一步都獨(dú)立于之前的步驟,你的球可以向下滾,獲得動(dòng)量,可以從碗向下加速獲得動(dòng)量。我發(fā)現(xiàn)這個(gè)球從碗滾下的比喻,物理能力強(qiáng)的人接受得比較好,但不是所有人都能接受,如果球從碗中滾下這個(gè)比喻,你理解不了,別擔(dān)心。
最后我們來(lái)看具體如何計(jì)算,算法在此。
所以你有兩個(gè)超參數(shù),學(xué)習(xí)率a以及參數(shù)β,β控制著指數(shù)加權(quán)平均數(shù)。
β最常用的值是0.9,我們之前平均了過(guò)去十天的溫度,所以現(xiàn)在平均了前十次迭代的梯度。
實(shí)際上β為0.9時(shí),效果不錯(cuò),你可以嘗試不同的值,可以做一些超參數(shù)的研究,不過(guò)0.9是很棒的魯棒數(shù)(系統(tǒng)穩(wěn)定性)。
那么關(guān)于偏差修正,所以你要拿v_dW和v_db除以1-β^t,實(shí)際上人們不這么做,因?yàn)?0次迭代之后,因?yàn)槟愕囊苿?dòng)平均已經(jīng)過(guò)了初始階段。
實(shí)際中,在使用梯度下降法或動(dòng)量梯度下降法時(shí),人們不會(huì)受到偏差修正的困擾。當(dāng)然v_dW初始值是0,要注意到這是和dW擁有相同維數(shù)的零矩陣,也就是跟W擁有相同的維數(shù),v_db的初始值也是向量零,所以和db擁有相同的維數(shù),也就是和b是同一維數(shù)。
最后要說(shuō)一點(diǎn),如果你查閱了動(dòng)量梯度下降法相關(guān)資料,你經(jīng)常會(huì)看到一個(gè)被刪除了的專(zhuān)業(yè)詞匯,1-β被刪除了,最后得到的是v_dW=βv_dW+dW。
用紫色版本的結(jié)果就是,所以v_dW縮小了1-β倍,相當(dāng)于乘以1/(1-β),所以你要用梯度下降最新值的話,a要根據(jù)1/(1-β)相應(yīng)變化。實(shí)際上,二者效果都不錯(cuò),只會(huì)影響到學(xué)習(xí)率a的最佳值。
我覺(jué)得這個(gè)公式用起來(lái)沒(méi)有那么自然,因?yàn)橛幸粋€(gè)影響,如果你最后要調(diào)整超參數(shù)β,就會(huì)影響到v_dW和v_db,你也許還要修改學(xué)習(xí)率a,所以我更喜歡左邊的公式,而不是刪去了1-β的這個(gè)公式,所以我更傾向于使用左邊的公式,也就是有1-β的這個(gè)公式,但是兩個(gè)公式都將β設(shè)置為0.9,是超參數(shù)的常見(jiàn)選擇,只是在這兩個(gè)公式中,學(xué)習(xí)率a的調(diào)整會(huì)有所不同。
所以這就是動(dòng)量梯度下降法,這個(gè)算法肯定要好于沒(méi)有Momentum的梯度下降算法,我們還可以做別的事情來(lái)加快學(xué)習(xí)算法,我們將在接下來(lái)的筆記里探討這些問(wèn)題。