batch_size對於卷積神經網絡訓練的影響

學習卷積神經網絡之前,聽前輩們說過一些關於一次喂入的訓練數據集對收斂的影響。

當時也半懂不懂的一隻耳朵進一隻耳朵出就沒怎麼當回事就過去了。

現在真正走到這一步的時候才發現這還是個不小的坑。

於是趕緊google了一波並記錄下來。

------------------------------------先來看一個栗子-----------------------------------------

測試背景:20000張貓狗圖片,epochs=200

環境1:GTX950M(2G),batch_size=40

環境2:GTX1070(8G),batch_size=125

因爲是在兩臺不同的電腦上訓練的,一臺是我的筆記本一臺臺式機。年少無知的我這就奇了怪了,差距還不小,難道訓練結果好壞還分顯卡?我尋思着也不對呀,硬件層面的計算工作怎麼可能會影響算法結果的好壞呢?

畢竟也是接受過九年義務教育的共產主義接班人,那就採用單一變量原則吧,我把兩邊的代碼統一了,先從最可疑的batch_size開始查起,果不其然,問題果然在batch_size這裏:

“一般來說,在合理的範圍之內,越大的 batch size 使下降方向越準確,震盪越小;batch size 如果過大,則可能會出現局部最優的情況。小的 bath size 引入的隨機性更大,難以達到收斂,極少數情況下可能會效果變好。”

由於學習理論部分的時候,沒徹底掌握明白,我又去翻了翻相關資料,發現batch_size的選擇,首先決定的是下降的方向。如果數據集比較小,完全可以採用全數據集 ( Full Batch Learning )的形式,這樣做有 2 個好處:其一,由全數據集確定的方向能夠更好地代表樣本總體,從而更準確地朝向極值所在的方向。其二,由於不同權重的梯度值差別巨大,因此選取一個全局的學習率很困難。

 

總結:在合理範圍內,增大 Batch_Size 有何好處

  • 內存利用率提高了,大矩陣乘法的並行化效率提高。
  • 跑完一次 epoch(全數據集)所需的迭代次數減少,對於相同數據量的處理速度進一步加快。
  • 在一定範圍內,一般來說 Batch_Size 越大,其確定的下降方向越準,引起訓練震盪越小。


盲目增大 Batch_Size 有何壞處

  • 內存利用率提高了,但是內存容量可能撐不住了。
  • 跑完一次 epoch(全數據集)所需的迭代次數減少,要想達到相同的精度,其所花費的時間大大增加了,從而對參數的修正也就顯得更加緩慢。
  • Batch_Size 增大到一定程度,其確定的下降方向已經基本不再變化。

由於上述兩種因素的矛盾, Batch_Size 增大到某個時候,達到時間上的最優。由於最終收斂精度會陷入不同的局部極值,因此 Batch_Size 增大到某些時候,達到最終收斂精度上的最優。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章