minibatchgd代码_神经网络中的优化算法
上一篇文章講了神經網絡的參數初試化,可以看到不同的初始化方法對我們的學習效果有很大影響。(參見:【DL筆記】神經網絡參數初始化的學問)
本文繼續討論如何進一步優化我們的梯度下降算法,使得我們的學習更快,學習效果更佳。
首先,我們慣用的方法是“梯度下降法”,稱為Gradient Decent,就是把所有的訓練樣本丟進去訓練一次之后,把W和b更新一次,然后重復這個過程,具體重復多少次就看我們的“迭代次數”是多少。
【為了下面敘述的方便,我們稱“把所有訓練樣本過一遍”為一個epoch,另外 gradient decent也就是梯度下降我們就簡稱為GD。】
我們傳統的GD,也可以稱為Batch GD,這個batch就是指一整批,就是指我們所有樣本。
今天主要介紹的有如下方法,均是對傳統batch gradient decent的改進:Mini-batch GD(小批量梯度下降法)
GD with Momentum(動量法)
Adam算法(Momentum與RMSprop算法結合)
一、Mini-batch GD
mini-batch是相對于batch來說的,后者我們前面說過,是走完一個epoch才把參數更新一次,這樣其實很慢。
樣本數量不多還好,但是樣本多了就會明顯耗費大量時間,比如5百萬樣本,這在深度學習里面是很平常的事情,但是使用傳統的方法,即batch GD,意味著我們需要把5,000,000個樣本跑一遍才能更新一次W和b。
mini-batch就是為了解決這個問題的,我們可以把5百萬的樣本分成一塊一塊的,比如1000個樣本一塊,稱為一個mini-batch,這樣我們就有5000個mini-batch。我們訓練的時候,跑完一個mini-batch就把W和b更新一次,這樣的的話,在一個epoch中,我們就已經把參數更新了5000次了!雖然每一步沒有batch GD的一步走的準,但是我5000步加起來,怎么樣也比你走一步的效果好的多,因此可以加快訓練速度,更快到達最值點。
這就是mini-batch GD方法。
對于不同的mini-batch的大小(size),也有不一樣的效果:size=樣本數 —> Batch GD
size=1 —> Stochastic GD(隨機梯度下降)
有人可能會問,那size=1的時候,也就是來一個樣本就更新一次,豈不是會更快?
不是的,它會有兩個問題:震動太劇烈,誤差會灰常大,可能根本無法到達最低點
每次只計算一個樣本,就失去了我們前面提到的“Vectorization(矢量化)”的優勢,因此計算效率反而不高
因此,我們通常取一個中間的值,這樣,既利用了Vectorization來加速計算,又可以在一個epoch中多次更新,速度就可以最快。
有意思的是,據吳恩達說,mini-batch size 通常取2的指數,主要是16,32,64,128,256,512,1024這幾個值,因為計算機是二進制,這樣的數字計算起來效率會更高一些。
口說無憑,現在我做個實驗驗證一下是不是mini-batch 更好:
實驗條件:
三層神經網絡,learning-rate=0.0007,batch size=300,mini-batch size=64,迭代次數=40000
數據集形狀如下:
數據集
猜想:
①mini-batch GD效果要比batch GD更好
②mini-batch GD的cost曲線會比batch波動更大,但是最終cost卻更低
實驗代碼和過程就不放了,直接看我們運行的結果:
batch GD:
耗時105s,準確率只有0.76,看圖明顯就知道還沒訓練好。
再看mini-batch GD:
哇塞,效果不錯!準確率提高到了91.7%,而且從cost曲線上看,確實如我所料有很大的波動,但是最終的cost顯著低于batch GD,因此學習的模型就更好。
出乎我意料的是,時間居然縮短了一半以上!一開始我估計時間應該差不多,因為我們迭代的40000次相當于40000個epoch,我前面只是說一個epoch中mini-batch更新的次數更多,沒想到居然也更快(因為我覺得一個epoch中的操作變多了,可能會變慢一點)。
想了想,覺得應該是這樣:因為mini-batch在一個epoch中走的步子多,因此可以迅速地找到“最佳下坡路”,找到了之后,就跟坐滑滑梯一樣,越溜越快,因此比batch GD更快。
二、Momentum 動量法
上面的mini-batch GD給了我們一些驚喜了,但是似乎還可以更好,畢竟還有不少點都分類錯誤。
主要的原因就是因為,使用mini-batch之后,穩定性降低了,在梯度下降的時候會有較為劇烈的振動,這樣可能導致在最低點附近瞎晃悠,因此效果會受影響。
動量法就是解決mini-batch的這個問題的,它讓梯度下降不那么抖動。
看看Momentum的參數更新過程:
如果你熟悉神經網絡梯度下降的過程,就知道,我們一般的梯度下降的更新過程(以W為例)是:W = W -αdW。
動量法相當于多了一個V_dW,它考慮了前面若干個dW,(實際上,V_dW約等于前1/(1-β)個dW的平均值,數學上稱為“指數加權平均”)這樣,dW的方向就會受到前面若干個dW的沖擊,于是整體就變得更平緩。
可能畫個示意圖才能更好地說明吧:
mini-batch是上下起伏不定的箭頭,但是把若干個的方向平均一下,就變得平緩多了,相當于抵消掉了很多的方向相反的誤差。
我們也在做實驗驗證一下,實驗條件跟上面一樣,我們在mini-batch size=64的基礎上,使用Momentum方法來更新參數,得到的效果如下:
這個超參數β調了我半天,最開始0.9,然后0.95,再0.99,再0.999,終于有了上面的這么一點點的提升,準確率到了92%。可見momentum有一些效果,但是此處還不太明顯。
三、Adam算法
這個方法,對momentum再進一步改進,結合了RMSprop算法(是另一種減小梯度下降振動的方法),更新過程如下:
不僅有了我們剛剛的V_dW, 還有一個S_dW(就把它理解為跟V_dW的原理類似就行了),然后,再對這兩個玩意兒都進行了一個修正(corrected),最后參數更新是綜合了這二者,結果效果就出奇的好:
準確率有了明顯提升,達到94%,擬合的形狀明顯是那么一回事了。
對于Momentum的效果不那么明顯的現在,吳恩達的解釋是在learning-rate太小以及數據集比較簡單的情況下,momentum發揮不了太大的作用,因此本實驗中我們看不出驚人的效果。但在其他場景下也許就有很好的改善了。
當然,既然有了Adam算法,我們自然會使用Adam這個最佳實踐了。
總結一下:Mini-batch GD比傳統GD效果更好,訓練更快
Momentum動量法可以減小Mini-batch帶來的振動
梯度下降的最佳優化方法是Adam算法
Adam算法中的超參數β1和β2以及learning-rate也會顯著影響模型,因此需要我們反復調試
作者:Stack_empty
鏈接:https://www.jianshu.com/p/ea708a06f87c
總結
以上是生活随笔為你收集整理的minibatchgd代码_神经网络中的优化算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 替代VS Code的产品Eclipse
- 下一篇: Zeros()