吳恩達深度學習筆記(43)-動量梯度下降法(Momentum)

動量梯度下降法(Gradient descent with Momentum)

還有一種算法叫做Momentum,或者叫做動量梯度下降法,運行速度幾乎總是快於標準的梯度下降算法,簡而言之,基本的想法就是計算梯度的指數加權平均數,並利用該梯度更新你的權重,在本筆記中,我們要一起拆解單句描述,看看你到底如何計算。

吳恩達深度學習筆記(43)-動量梯度下降法(Momentum)

例如,如果你要優化成本函數,函數形狀如圖,紅點代表最小值的位置,假設你從這裡(藍色點)開始梯度下降法,如果進行梯度下降法的一次迭代,無論是batch或mini-batch下降法,也許會指向這裡,現在在橢圓的另一邊,計算下一步梯度下降,結果或許如此,然後再計算一步,再一步,計算下去,你會發現梯度下降法要很多計算步驟對吧?

吳恩達深度學習筆記(43)-動量梯度下降法(Momentum)

慢慢擺動到最小值,這種上下波動減慢了梯度下降法的速度,你就無法使用更大的學習率,如果你要用較大的學習率(紫色箭頭),結果可能會偏離函數的範圍,為了避免擺動過大,你要用一個較小的學習率

吳恩達深度學習筆記(43)-動量梯度下降法(Momentum)

另一個看待問題的角度是,在縱軸上,你希望學習慢一點,因為你不想要這些擺動,但是在橫軸上,你希望加快學習

你希望快速從左向右移,移向最小值,移向紅點

所以使用動量梯度下降法,你需要做的是,在每次迭代中,確切來說在第t次迭代的過程中,你會計算微分dW,db,我會省略上標[l],你用現有的mini-batch計算dW,db。

如果你用batch梯度下降法,現在的mini-batch就是全部的batch,對於batch梯度下降法的效果是一樣的。如果現有的mini-batch就是整個訓練集,效果也不錯,你要做的是計算v_dW=βv_dW+(1-β)dW,這跟我們之前的計算相似,也就是v=βv+(1-β) θ_t,dW的移動平均數,接著同樣地計算v_db,v_db=βv_db+(1-β)db,然後重新賦值權重,W:=W-av_dW,同樣b:=b-av_db,這樣就可以減緩梯度下降的幅度。

例如,在上幾個導數中,

你會發現這些縱軸上的擺動平均值接近於零,所以在縱軸方向,你希望放慢一點,平均過程中,正負數相互抵消,所以平均值接近於零。

但在橫軸方向,所有的微分都指向橫軸方向,因此橫軸方向的平均值仍然較大,因此用算法幾次迭代後,你發現動量梯度下降法,最終縱軸方向的擺動變小了,橫軸方向運動更快,因此你的算法走了一條更加直接的路徑,在抵達最小值的路上減少了擺動。

動量梯度下降法的一個本質,這對有些人而不是所有人有效,就是如果你要最小化碗狀函數,這是碗的形狀,我畫的不太好。

它們能夠最小化碗狀函數,這些微分項,想象它們為你從山上往下滾的一個球,提供了加速度,Momentum項相當於速度。

吳恩達深度學習筆記(43)-動量梯度下降法(Momentum)

想象你有一個碗,你拿一個球,微分項給了這個球一個加速度,此時球正向山下滾,球因為加速度越滾越快,而因為β 稍小於1,表現出一些摩擦力,所以球不會無限加速下去,所以不像梯度下降法,每一步都獨立於之前的步驟,你的球可以向下滾,獲得動量,可以從碗向下加速獲得動量。我發現這個球從碗滾下的比喻,物理能力強的人接受得比較好,但不是所有人都能接受,如果球從碗中滾下這個比喻,你理解不了,別擔心。

最後我們來看具體如何計算,算法在此。

吳恩達深度學習筆記(43)-動量梯度下降法(Momentum)

所以你有兩個超參數,學習率a以及參數β,β控制著指數加權平均數

β最常用的值是0.9,我們之前平均了過去十天的溫度,所以現在平均了前十次迭代的梯度。

實際上β為0.9時,效果不錯,你可以嘗試不同的值,可以做一些超參數的研究,不過0.9是很棒的魯棒數(系統穩定性)。

那麼關於偏差修正,所以你要拿v_dW和v_db除以1-β^t,實際上人們不這麼做,因為10次迭代之後,因為你的移動平均已經過了初始階段。

實際中,在使用梯度下降法或動量梯度下降法時,人們不會受到偏差修正的困擾。當然v_dW初始值是0,要注意到這是和dW擁有相同維數的零矩陣,也就是跟W擁有相同的維數,v_db的初始值也是向量零,所以和db擁有相同的維數,也就是和b是同一維數。

吳恩達深度學習筆記(43)-動量梯度下降法(Momentum)

最後要說一點,如果你查閱了動量梯度下降法相關資料,你經常會看到一個被刪除了的專業詞彙,1-β被刪除了,最後得到的是v_dW=βv_dW+dW。

用紫色版本的結果就是,所以v_dW縮小了1-β倍,相當於乘以1/(1-β),所以你要用梯度下降最新值的話,a要根據1/(1-β)相應變化。實際上,二者效果都不錯,只會影響到學習率a的最佳值。

我覺得這個公式用起來沒有那麼自然,因為有一個影響,如果你最後要調整超參數β,就會影響到v_dW和v_db,你也許還要修改學習率a,所以我更喜歡左邊的公式,而不是刪去了1-β的這個公式,所以我更傾向於使用左邊的公式,也就是有1-β的這個公式,但是兩個公式都將β設置為0.9,是超參數的常見選擇,只是在這兩個公式中,學習率a的調整會有所不同。

所以這就是動量梯度下降法,這個算法肯定要好於沒有Momentum的梯度下降算法,我們還可以做別的事情來加快學習算法,我們將在接下來的筆記裡探討這些問題。


分享到:


相關文章: