Batch_Size 詳解

Batch_Size(批尺寸)是機器學習中一個重要參數,涉及諸多矛盾,下面逐一展開。html

首先,爲何須要有 Batch_Size 這個參數?

Batch 的選擇,首先決定的是降低的方向。若是數據集比較小,徹底能夠採用全數據集 ( Full Batch Learning )的形式,這樣作至少有 2 個好處:其一,由全數據集肯定的方向可以更好地表明樣本整體,從而更準確地朝向極值所在的方向。其二,因爲不一樣權重的梯度值差異巨大,所以選取一個全局的學習率很困難。 Full Batch Learning 可使用 Rprop 只基於梯度符號而且針對性單獨更新各權值。python

對於更大的數據集,以上 2 個好處又變成了 2 個壞處:其一,隨着數據集的海量增加和內存限制,一次性載入全部的數據進來變得愈來愈不可行。其二,以 Rprop 的方式迭代,會因爲各個 Batch 之間的採樣差別性,各次梯度修正值相互抵消,沒法修正。這纔有了後來 RMSProp 的妥協方案。算法

既然 Full Batch Learning 並不適用大數據集,那麼走向另外一個極端怎麼樣?

所謂另外一個極端,就是每次只訓練一個樣本,即 Batch_Size = 1。這就是在線學習(Online Learning)。線性神經元在均方偏差代價函數的錯誤面是一個拋物面,橫截面是橢圓。對於多層神經元、非線性網絡,在局部依然近似是拋物面。使用在線學習,每次修正方向以各自樣本的梯度方向修正,橫衝直撞各自爲政,難以達到收斂。如圖所示:網絡

 


這裏寫圖片描述 

 

可不能夠選擇一個適中的 Batch_Size 值呢?

固然能夠,這就是批梯度降低法(Mini-batches Learning)。由於若是數據集足夠充分,那麼用一半(甚至少得多)的數據訓練算出來的梯度與用所有數據訓練出來的梯度是幾乎同樣的。數據結構

在合理範圍內,增大 Batch_Size 有何好處?

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

盲目增大 Batch_Size 有何壞處?

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

調節 Batch_Size 對訓練效果影響到底如何?

這裏跑一個 LeNet 在 MNIST 數據集上的效果。MNIST 是一個手寫體標準庫,我使用的是 Theano 框架。這是一個 Python 的深度學習庫。安裝方便(幾行命令而已),調試簡單(自帶 Profile),GPU / CPU 通吃,官方教程至關完備,支持模塊十分豐富(除了 CNNs,更是支持 RBM / DBN / LSTM / RBM-RNN / SdA / MLPs)。在其上層有 Keras 封裝,支持 GRU / JZS1, JZS2, JZS3 等較新結構,支持 Adagrad / Adadelta / RMSprop / Adam 等優化算法。如圖所示:框架

 


這裏寫圖片描述

 

 

 


這裏寫圖片描述 

 

運行結果如上圖所示,其中絕對時間作了標幺化處理。運行結果與上文分析相印證:機器學習

  • Batch_Size 過小,算法在 200 epoches 內不收斂。
  • 隨着 Batch_Size 增大,處理相同數據量的速度越快。
  • 隨着 Batch_Size 增大,達到相同精度所須要的 epoch 數量愈來愈多。
  • 因爲上述兩種因素的矛盾, Batch_Size 增大到某個時候,達到時間上的最優。
  • 因爲最終收斂精度會陷入不一樣的局部極值,所以 Batch_Size 增大到某些時候,達到最終收斂精度上的最優。

歡迎一塊兒討論。函數

相關文章
相關標籤/搜索