比Momentum更快:揭开Nesterov Accelerated Gradient的真面目NAG 梯度下降
d為累計梯度
作為一個調(diào)參狗,每天用著深度學習框架提供的各種優(yōu)化算法如Momentum、AdaDelta、Adam等,卻對其中的原理不甚清楚,這樣和一條咸魚有什么分別!(誤)但是我又懶得花太多時間去看每個優(yōu)化算法的原始論文,幸運的是,網(wǎng)上的大神早就已經(jīng)幫人總結(jié)好了:《An overview of gradient descent optimization algorithms》,看完了這篇文章,總算可以說對自己平時用的工具有一個大概的了解啦!文章的內(nèi)容包括了Momentum、Nesterov Accelerated Gradient、AdaGrad、AdaDelta和Adam,在這么多個優(yōu)化算法里面,一個妖艷的賤貨(劃去)成功地引起了我的注意——Nesterov Accelerated Gradient,簡稱NAG。原因不僅僅是它名字比別人長,而且還帶了個逼格很高、一聽就像是個數(shù)學家的人名,還因為,它僅僅是在Momentum算法的基礎(chǔ)上做了一點微小的工作,形式上發(fā)生了一點看似無關(guān)痛癢的改變,卻能夠顯著地提高優(yōu)化效果。為此我折騰了一個晚上,終于扒開了它神秘的面紗……(主要是我推導(dǎo)公式太慢了……)
話不多說,進入正題,首先簡要介紹一下Momentum和NAG,但是本文無恥地假設(shè)你已經(jīng)懂了Momentum算法,如果不懂的話,強烈推薦這篇專欄:《路遙知馬力——Momentum - 無痛的機器學習 - 知乎專欄》,本文的實驗代碼也是在這篇專欄的基礎(chǔ)上改的。
Momentum改進自SGD算法,讓每一次的參數(shù)更新方向不僅僅取決于當前位置的梯度,還受到上一次參數(shù)更新方向的影響:
公式1,Momentum的數(shù)學形式
其中,和分別是這一次和上一次的更新方向,表示目標函數(shù)在處的梯度,超參數(shù)是對上一次更新方向的衰減權(quán)重,所以一般是0到1之間,是學習率。總的來說,在一次迭代中總的參數(shù)更新量包含兩個部分,第一個是由上次的更新量得到的,第二個則是由本次梯度得到的。
所以Momentum的想法很簡單,就是多更新一部分上一次迭代的更新量,來平滑這一次迭代的梯度。從物理的角度上解釋,就像是一個小球滾落的時候會受到自身歷史動量的影響,所以才叫動量(Momentum)算法。這樣做直接的效果就是使得梯度下降的的時候轉(zhuǎn)彎掉頭的幅度不那么大了,于是就能夠更加平穩(wěn)、快速地沖向局部最小點:
圖片引自《An overview of gradient descent optimization algorithms》
然后NAG就對Momentum說:“既然我都知道我這一次一定會走的量,那么我何必還用現(xiàn)在這個位置的梯度呢?我直接先走到之后的地方,然后再根據(jù)那里的梯度再前進一下,豈不美哉?”所以就有了下面的公式:
公式2,NAG的原始形式
跟上面Momentum公式的唯一區(qū)別在于,梯度不是根據(jù)當前參數(shù)位置,而是根據(jù)先走了本來計劃要走的一步后,達到的參數(shù)位置計算出來的。
對于這個改動,很多文章給出的解釋是,能夠讓算法提前看到前方的地形梯度,如果前面的梯度比當前位置的梯度大,那我就可以把步子邁得比原來大一些,如果前面的梯度比現(xiàn)在的梯度小,那我就可以把步子邁得小一些。這個大一些、小一些,都是相對于原來不看前方梯度、只看當前位置梯度的情況來說的。
但是我個人對這個解釋不甚滿意。你說你可以提前看到,但是我下次到了那里之后不也照樣看到了嗎?最多比你落后一次迭代的時間,真的會造成非常大的差別?可是實驗結(jié)果就是表明,NAG收斂的速度比Momentum要快:
圖片引自《路遙知馬力——Momentum - 無痛的機器學習 - 知乎專欄》,上圖是Momentum的優(yōu)化軌跡,下圖是NAG的優(yōu)化軌跡
為了從另一個角度更加深入地理解這個算法,我們可以對NAG原來的更新公式進行變換,得到這樣的等效形式(具體推導(dǎo)過程放在最后啦):
公式3,NAG的等效形式
這個NAG的等效形式與Momentum的區(qū)別在于,本次更新方向多加了一個,它的直觀含義就很明顯了:如果這次的梯度比上次的梯度變大了,那么有理由相信它會繼續(xù)變大下去,那我就把預(yù)計要增大的部分提前加進來;如果相比上次變小了,也是類似的情況。這樣的解釋聽起來好像和原本的解釋一樣玄,但是讀者可能已經(jīng)發(fā)現(xiàn)了,這個多加上去的項不就是在近似目標函數(shù)的二階導(dǎo)嘛!所以NAG本質(zhì)上是多考慮了目標函數(shù)的二階導(dǎo)信息,怪不得可以加速收斂了!其實所謂“往前看”的說法,在牛頓法這樣的二階方法中也是經(jīng)常提到的,比喻起來是說“往前看”,數(shù)學本質(zhì)上則是利用了目標函數(shù)的二階導(dǎo)信息。
那么,變換后的形式真的與NAG的原始形式等效么?在給出數(shù)學推導(dǎo)之前,先讓我用實驗來說明吧:
上圖是公式3給出的優(yōu)化軌跡,下圖是公式2給出的優(yōu)化軌跡——完全一樣
實驗代碼放在Github,修改自《路遙知馬力——Momentum - 無痛的機器學習 - 知乎專欄》的實驗代碼。有興趣的讀者可以多跑幾個起始點+學習率+衰減率的超參數(shù)組合,無論如何兩個算法給出的軌跡都會是一樣的。
最后給出NAG的原始形式到等效形式的推導(dǎo)。由
可得
上式代入上上式,就得到了NAG等效形式的第二個式子:
于是我們可以寫出的形式,然后用減去消去后面的無窮多項,就得到了NAG等效形式的第一個式子:
最終我們就得到了NAG的等效形式:
結(jié)論:在原始形式中,Nesterov Accelerated Gradient(NAG)算法相對于Momentum的改進在于,以“向前看”看到的梯度而不是當前位置梯度去更新。經(jīng)過變換之后的等效形式中,NAG算法相對于Momentum多了一個本次梯度相對上次梯度的變化量,這個變化量本質(zhì)上是對目標函數(shù)二階導(dǎo)的近似。由于利用了二階導(dǎo)的信息,NAG算法才會比Momentum具有更快的收斂速度。
本文實驗代碼放在Github
總結(jié)
以上是生活随笔為你收集整理的比Momentum更快:揭开Nesterov Accelerated Gradient的真面目NAG 梯度下降的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: pytorch问题索引
- 下一篇: 深度学习优化函数详解(5)-- Nest