日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

minibatchgd代码_神经网络中的优化算法

發布時間:2024/1/18 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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代码_神经网络中的优化算法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。