天天看點

深度學習筆記(2):2.1|2.2 mini-batch梯度下降法及其了解

2.1   mini-batch梯度下降法

第二章我們開始學習優化算法,以便于更快地訓練神經網絡。首先介紹mini-batch梯度下降法,如下圖所示:

深度學習筆記(2):2.1|2.2 mini-batch梯度下降法及其了解

相比于mini-batch梯度下降法,我們大家更熟悉的應該是batch梯度下降法,即梯度下降法。那batch梯度下降法和mini-batch梯度下降法有什麼差別嗎?其實他倆的差別就存在于名字中,一個是batch,即進行梯度下降訓練時,使用全部的訓練集,而mini-batch,表示比batch小一些,就是指在進行梯度下降訓練時,并不使用全部的訓練集,隻使用其中一部分資料集。

我們知道,不論是梯度下降法還是mini-batch梯度下降法,我們都可以通過向量化(vectorization)更加有效地計算所有樣本。如上圖所示,我們用nx表示每個樣本的次元,m表示樣本數,那麼通過向量化,我們使用nx*m維的矩陣X來表示所有樣本,同理,Y為m維的向量。

已經有了梯度下降法,我們為什麼還要提出mini-batch梯度下降法呢?在實際計算中,我們可能會遇到特别大的資料集,這時再使用梯度下降法,每次疊代都要計算所有的資料集,計算量太大,效率低下,而mini-batch梯度下降法允許我們拿出一小部分資料集來運作梯度下降法,能夠大大提高計算效率。

如上圖中例子,假設我們有5,000,000個樣本,使用梯度下降法效率低下,這時我們可以将其分為5000份mini-batch,而每一份有1000個樣本,我們将每一份mini-batch記為X{t}、Y{t}(t為右上标,如上圖所示),可知,X{t}為nx*1000維的矩陣,Y{t}為1000維的向量。

這裡再重複說明一下老師課中一些符号的意義。如上圖右下角所示,X右上方小括号内i表示這是第i個樣本,Z右上方中括号内L表示這是神經網絡的第L層對應的Z值,X和Y右上方花括号内的t表示第t個mini-batch資料集。

那麼我們該怎麼使用mini-batch梯度下降法呢?如下圖所示:

深度學習筆記(2):2.1|2.2 mini-batch梯度下降法及其了解

可以看到上圖的算法流程圖顯示,存在兩個循環。首先是我們循環使用所有mini-batch資料集去訓練W(for t =1,...,5000),這個過程我們重複5000次,每次都用一個包含1000個樣本的mini-batch資料集去訓練W。圖中右上角的一次梯度下降法(one step of gradient descent)是指此時我們在訓練W時使用其中一個mini-batch去訓練,且此時并不利用for循環去處理這1000個樣本,而是通過向量化(vectorization)同時處理這1000個樣本。

這個過程重複5000次,我們稱之為一代訓練(one epoch of training),‘一代’在這裡指隻是周遊了訓練集一次,對于梯度下降法(batch),一代訓練(one epoch)意味着隻能做一次梯度下降(one step),因為對于梯度下降法,我們每次都使用全部的資料集去做一次梯度下降。 而對于mini-batch梯度下降,一代訓練我們可以做5000次梯度下降。

這5000次循環完隻是把我們所有的mini-batch資料集循環了一遍,但是不一定達到我們的收斂精度要求,是以我們需要在最外面再加一層循環,停止準則為循環次數或者誤差要求。

2.2   深入了解mini-batch梯度下降法

接下來我們來深入了解一下梯度下降法和mini-batch梯度下降法的差別,不僅僅是局限于資料集的使用大小上,如下圖所示:

深度學習筆記(2):2.1|2.2 mini-batch梯度下降法及其了解

如上圖所示,當我們使用梯度下降法時,代價函數J是梯度下降疊代次數的單調遞減函數,即每一次參數的修正都是奔着能使J減小的目的去的,這結果也是理所當然,因為梯度下降法使用了全部的資料集,且參數的梯度就是以減少J為目的計算得到的。

相比于梯度下降法的光滑曲線,mini-batch梯度下降法就顯得粗糙多了。為什麼會這樣呢?如上圖所示,t表示第t個mini-batch資料集,也可以作為疊代次數,因為我們是從第一個mini-batch資料集開始訓練的,一直到最後一個。我們把大的資料集分為多個mini-batch資料集,這些小的資料集是獨立同分布的,是以當我們用這些資料集去更新權重時,大的方向肯定是對的,即随着疊代次數的增加,代價函數J的趨勢是逐漸減小的,那為什麼會有波動呢?因為我們在疊代過程中,每次使用了不同的資料集,他們在更新權重的過程中,代價函數情況也是不一樣的。也許第一個資料集比較簡單,代價函數值降低,而在該權重的基礎上,第二個資料集較複雜,代價函數反而上升。

了解了原理,我們該怎麼選擇mini-batch的大小呢?

深度學習筆記(2):2.1|2.2 mini-batch梯度下降法及其了解

如上圖所示:如果我們令mini-batch的大小為m,那就是梯度下降法(batch),如果我們令mini-batch的大小為1,那就是随機梯度下降法(stochastic gradient descent),即每次我們隻使用一個樣本進行訓練。

一般實際中,我們會令mini-batch的大小介于1和m之間,會什麼這樣設定呢,我們來分析一下這三種方法的優缺點,相信你能更好了解。

首先介紹梯度下降(batch),路徑如圖中藍線所示,從任一點出發,每一步都使代價函數J的值更小,相比mini-batch梯度下降法和随機梯度下降法噪聲低一些,幅度也大一些。但缺點是每次疊代要使用全部資料集,運作時間太長。

接着介紹随機梯度下降法(stochastic),路徑如圖中紫線所示,大部分時候向着全局最小值靠近,有時候也會遠離最小值,當那個樣本恰恰指的方向不對時,有很多噪音。平均來看,最終會靠近最小值,但有時也會方向錯誤,因為SGD永遠不會收斂,而是會一直在最小值附近波動,不會到達最小值并停留在那裡。為了減少噪聲,我們可以通過減少學習率, 這也是為什麼梯度下降相比于随機梯度下降,幅度更大一些。同時,因為每次隻處理一個樣本,該算法失去了向量化帶來的加速,導緻效率過于低下。

最後介紹mini-batch梯度下降法,路徑如圖中綠線所示,mini-batch資料集大小介于1和m之間,其特征也介于梯度下降法和随機梯度下降法之間,是二者的優化,計算速度最快。因為相比于随機梯度下降法,mini-batch可以進行向量化操作,同時相比于梯度下降法同時使用全部資料集,效率更高。mini-batch梯度下降法不一定在很小的範圍内收斂或者波動,如果出現這個問題,可以慢慢減少學習率。

确定了mini-batch的大小範圍,我們該如何确定mini-batch的大小值呢?如下圖所示:

深度學習筆記(2):2.1|2.2 mini-batch梯度下降法及其了解

如果我們的訓練集很小,比如小于2000個樣本,那直接使用梯度下降法就可以,無需使用mini-batch。對于較大的資料集,我們最好使用mini-batch,考慮到電腦記憶體的設定和使用方式,其大小最好設為2的次方,比如64,128,256,512,這些都是大家經常使用的mini-batch的大小,我們上文中使用的1000其實不常見,就算使用最好使用1024。注意,所有的mini-batch資料集要符合CPU/GPU記憶體,如果不符合,那麼不論你怎麼處理資料,你會發現算法的表現變得很差,甚至慘不忍睹。

其實,mini-batch的大小值也是一個超參數,需要我們去調試的。這裡給了幾種選項,那麼在實際中,我們可以将這幾個都試一下,選擇能夠最有效地減少代價函數的那個超參數值。

版權聲明:尊重部落客原創文章,轉載請注明出處https://blog.csdn.net/kkkkkiko/article/details/81227887

繼續閱讀