1. 程式人生 > >深度學習中的batch的大小對學習效果的影響

深度學習中的batch的大小對學習效果的影響

Batch_size引數的作用:決定了下降的方向

極端一:

batch_size為全資料集(Full Batch Learning):

好處:

1.由全資料集確定的方向能夠更好地代表樣本總體,從而更準確地朝向極值所在的方向。

2.由於不同權重的梯度值差別巨大,因此選擇一個全域性的學習率很困難。Full Batch Learning可以使用Rprop只基於梯度符號並且針對性單獨更新各權值。

壞處:

1.隨著資料集的海量增長和記憶體限制,一次性載入所有的資料進來變得越來越不可行。

2.以Rprop的方式迭代,會由於各個Batch之間的取樣差異性,各次梯度修正值相互抵消,無法修正。

極端二:

Batch_size=1:

Batch_size=1,也就是每次只訓練一個樣本。這就是線上學習(Online Learning)。線性神經元在均方誤差代價函式的錯誤面是一個拋物面,橫截面是橢圓。對於多層神經元,非線性網路,在區域性依然近似是拋物面。使用線上學習,每次修正方向以各自樣本的梯度方向修正,難以達到收斂。

選擇適中的Batch_size值:

也就是批梯度下降法。因為如果資料集足夠充分,那麼用一半,甚至少得多的資料訓練算出來的梯度與用全部資料訓練出來的梯度幾乎是一樣的。

在合理範圍內,增大Batch_size的好處:

1.提高了記憶體利用率以及大矩陣乘法的並行化效率。

2.減少了跑完一次epoch(全資料集)所需要的迭代次數,加快了對於相同資料量的處理速度。

盲目增大Batch_size的壞處:

1.提高了記憶體利用率,但是記憶體容量可能不足。

2.跑完一次epoch(全資料集)所需的迭代次數減少,要想達到相同的精度,其所花費的時間大大增加,從而對引數的修正也就顯得更加緩慢。

3.Batch_size增大到一定程度,其確定的下降方向已經基本不再變化。

 

調節Batch_size會如何影響訓練效果?

實驗:使用不同的batch_size,在LeNet上訓練Mnist資料集的效果。使用的框架為Theano。

 

 

執行結果表明:

1.Batch_Size太小,演算法在200 epochs內不收斂。

2.隨著Batch_Size增大,處理相同資料量的速度加快。

3.隨著Batch_Size增大,達到相同精度所需要的epoch的數量增多。

4.由於上述兩種因素的矛盾,Batch_Size增大到某個時候,達到時間上的最優。

5.由於最終收斂精度會陷入不同的區域性極值,因此Batch_Size增大到某些時候,達到最終收斂精度上的最優。

 

在實際過程中,該如何選擇呢?

一般而言,根據GPU視訊記憶體,設定為最大,而且一般要求是8的倍數(比如32,128),這樣,GPU內部的平行計算效率最高。

或者,選擇一部分資料,設定幾個8的倍數的Batch_Size,看看loss的下降情況即可。

其他經驗之談

知乎使用者:理論上說batch_size=1是最好的,不過實際上調的時候,會出現batch_size太小導致網路收斂不穩定,最後結果比較差。而batch_size太大會影響隨機性的引入。

江河:

1.batch_size設的大一些,收斂得塊,也就是需要訓練的次數少,準確率上升的也很穩定,但是實際使用起來精度不高。

2.batch_size設的小一些,收斂得慢,可能準確率來回震盪,因此需要把基礎學習速率降低一些,但是實際使用起來精度較高。

一般嘗試batch_size=64或者batch_size=1兩種情況。

 

總結:對於新手而言,在GPU記憶體足夠的情況下,結合樣本大小,可以嘗試batch_size為8,16,32,64等.