姓名:張志文 學(xué)號:19021210649
【嵌牛導(dǎo)讀】
神經(jīng)網(wǎng)絡(luò)中有很多的優(yōu)化算法
【嵌牛鼻子】
神經(jīng)網(wǎng)絡(luò);優(yōu)化算法
【嵌牛提問】
神經(jīng)網(wǎng)絡(luò)中的優(yōu)化算法有哪些?
【嵌牛正文】
首先,我們慣用的方法是“梯度下降法”犀填,稱為Gradient Decent蠢壹,就是把所有的訓(xùn)練樣本丟進去訓(xùn)練一次之后嗓违,把W和b更新一次,然后重復(fù)這個過程图贸,具體重復(fù)多少次就看我們的“迭代次數(shù)”是多少蹂季。
【為了下面敘述的方便,我們稱“把所有訓(xùn)練樣本過一遍”為一個epoch疏日,另外 gradient decent也就是梯度下降我們就簡稱為GD偿洁。】
我們傳統(tǒng)的GD沟优,也可以稱為Batch GD涕滋,這個batch就是指一整批,就是指我們所有樣本挠阁。
今天主要介紹的有如下方法宾肺,均是對傳統(tǒng)batch gradient decent的改進:
- Mini-batch GD(小批量梯度下降法)
- GD with Momentum(動量法)
- Adam算法(Momentum與RMSprop算法結(jié)合)
一、Mini-batch GD
mini-batch是相對于batch來說的侵俗,后者我們前面說過锨用,是走完一個epoch才把參數(shù)更新一次,這樣其實很慢隘谣。
樣本數(shù)量不多還好增拥,但是樣本多了就會明顯耗費大量時間,比如5百萬樣本,這在深度學(xué)習(xí)里面是很平常的事情掌栅,但是使用傳統(tǒng)的方法秩仆,即batch GD,意味著我們需要把5,000,000個樣本跑一遍才能更新一次W和b猾封。
mini-batch就是為了解決這個問題的逗概,我們可以把5百萬的樣本分成一塊一塊的,比如1000個樣本一塊忘衍,稱為一個mini-batch逾苫,這樣我們就有5000個mini-batch。我們訓(xùn)練的時候枚钓,跑完一個mini-batch就把W和b更新一次铅搓,這樣的的話,在一個epoch中搀捷,我們就已經(jīng)把參數(shù)更新了5000次了星掰!雖然每一步?jīng)]有batch GD的一步走的準,但是我5000步加起來嫩舟,怎么樣也比你走一步的效果好的多氢烘,因此可以加快訓(xùn)練速度,更快到達最值點家厌。
這就是mini-batch GD方法播玖。
對于不同的mini-batch的大小(size)饭于,也有不一樣的效果:
- size=樣本數(shù) —> Batch GD
- size=1 —> Stochastic GD(隨機梯度下降)
有人可能會問蜀踏,那size=1的時候,也就是來一個樣本就更新一次掰吕,豈不是會更快果覆?
不是的,它會有兩個問題:
- 震動太劇烈殖熟,誤差會灰常大局待,可能根本無法到達最低點
- 每次只計算一個樣本,就失去了我們前面提到的“Vectorization(矢量化)”的優(yōu)勢菱属,因此計算效率反而不高
因此钳榨,我們通常取一個中間的值,這樣照皆,既利用了Vectorization來加速計算重绷,又可以在一個epoch中多次更新,速度就可以最快膜毁。
有意思的是昭卓,據(jù)吳恩達說愤钾,mini-batch size 通常取2的指數(shù),主要是16候醒,32能颁,64,128倒淫,256伙菊,512,1024這幾個值敌土,因為計算機是二進制镜硕,這樣的數(shù)字計算起來效率會更高一些。
口說無憑返干,現(xiàn)在我做個實驗驗證一下是不是mini-batch 更好:
實驗條件:
三層神經(jīng)網(wǎng)絡(luò)兴枯,learning-rate=0.0007,batch size=300矩欠,mini-batch size=64财剖,迭代次數(shù)=40000
數(shù)據(jù)集形狀如下:
猜想:
①mini-batch GD效果要比batch GD更好
②mini-batch GD的cost曲線會比batch波動更大,但是最終cost卻更低
實驗代碼和過程就不放了癌淮,直接看我們運行的結(jié)果:
batch GD:
耗時105s躺坟,準確率只有0.76,看圖明顯就知道還沒訓(xùn)練好乳蓄。
再看mini-batch GD:
哇塞咪橙,效果不錯!準確率提高到了91.7%栓袖,而且從cost曲線上看匣摘,確實如我所料有很大的波動店诗,但是最終的cost顯著低于batch GD裹刮,因此學(xué)習(xí)的模型就更好。
出乎我意料的是庞瘸,時間居然縮短了一半以上捧弃!一開始我估計時間應(yīng)該差不多,因為我們迭代的40000次相當(dāng)于40000個epoch擦囊,我前面只是說一個epoch中mini-batch更新的次數(shù)更多违霞,沒想到居然也更快(因為我覺得一個epoch中的操作變多了,可能會變慢一點)瞬场。
想了想买鸽,覺得應(yīng)該是這樣:因為mini-batch在一個epoch中走的步子多,因此可以迅速地找到“最佳下坡路”贯被,找到了之后眼五,就跟坐滑滑梯一樣妆艘,越溜越快,因此比batch GD更快看幼。
二批旺、Momentum 動量法
上面的mini-batch GD給了我們一些驚喜了,但是似乎還可以更好诵姜,畢竟還有不少點都分類錯誤汽煮。
主要的原因就是因為,使用mini-batch之后棚唆,穩(wěn)定性降低了暇赤,在梯度下降的時候會有較為劇烈的振動,這樣可能導(dǎo)致在最低點附近瞎晃悠宵凌,因此效果會受影響翎卓。
動量法就是解決mini-batch的這個問題的,它讓梯度下降不那么抖動摆寄。
看看Momentum的參數(shù)更新過程:
如果你熟悉神經(jīng)網(wǎng)絡(luò)梯度下降的過程失暴,就知道,我們一般的梯度下降的更新過程(以W為例)是:W = W -αdW微饥。
動量法相當(dāng)于多了一個V_dW逗扒,它考慮了前面若干個dW,(實際上欠橘,V_dW約等于前1/(1-β)個dW的平均值矩肩,數(shù)學(xué)上稱為“指數(shù)加權(quán)平均”)這樣,dW的方向就會受到前面若干個dW的沖擊肃续,于是整體就變得更平緩黍檩。
可能畫個示意圖才能更好地說明吧:
mini-batch是上下起伏不定的箭頭,但是把若干個的方向平均一下始锚,就變得平緩多了刽酱,相當(dāng)于抵消掉了很多的方向相反的誤差。
我們也在做實驗驗證一下瞧捌,實驗條件跟上面一樣棵里,我們在mini-batch size=64的基礎(chǔ)上,使用Momentum方法來更新參數(shù)姐呐,得到的效果如下:
這個超參數(shù)β調(diào)了我半天殿怜,最開始0.9,然后0.95曙砂,再0.99头谜,再0.999,終于有了上面的這么一點點的提升鸠澈,準確率到了92%柱告∽┲可見momentum有一些效果,但是此處還不太明顯末荐。
三侧纯、Adam算法
這個方法,對momentum再進一步改進甲脏,結(jié)合了RMSprop算法(是另一種減小梯度下降振動的方法)眶熬,更新過程如下:
不僅有了我們剛剛的V_dW, 還有一個S_dW(就把它理解為跟V_dW的原理類似就行了),然后块请,再對這兩個玩意兒都進行了一個修正(corrected)娜氏,最后參數(shù)更新是綜合了這二者,結(jié)果效果就出奇的好:
準確率有了明顯提升墩新,達到94%贸弥,擬合的形狀明顯是那么一回事了。
對于Momentum的效果不那么明顯的現(xiàn)在海渊,吳恩達的解釋是在learning-rate太小以及數(shù)據(jù)集比較簡單的情況下绵疲,momentum發(fā)揮不了太大的作用,因此本實驗中我們看不出驚人的效果臣疑。但在其他場景下也許就有很好的改善了盔憨。
當(dāng)然,既然有了Adam算法讯沈,我們自然會使用Adam這個最佳實踐了郁岩。
總結(jié)一下:
Mini-batch GD比傳統(tǒng)GD效果更好,訓(xùn)練更快
Momentum動量法可以減小Mini-batch帶來的振動
梯度下降的最佳優(yōu)化方法是Adam算法
Adam算法中的超參數(shù)β1和β2以及l(fā)earning-rate也會顯著影響模型缺狠,因此需要我們反復(fù)調(diào)試
本文內(nèi)容為轉(zhuǎn)載问慎,版權(quán)歸作者所有