Keras 不同批次量對訓練成效的影響

tf.Keras 小實驗 by 施威銘研究室@旗標科技

當我們在訓練模型時, 每批次使用一筆、多筆、或全部的樣本來訓練, 會對訓練成效有什麼影響呢?底下就使用 tf.Keras 以 MNIST 資料集做實驗, 測試各種不同 batch_size 的訓練成效。實驗的規劃如下:

  1. 使用 60,000 筆 MNIST 訓練資料做訓練, 並用另外的 10,000 筆測試資料做驗證。
  2. 由 batch_size=1 開始, 分別測試 batch_size=1、2、4、8、16、32…、60000 的狀況 (batch_size 每次乘 2)。
  3. 測試每種 batch_size 時, 當驗證準確率 (val_acc) 到達 0.98 或時間超過 20分鐘即停止。此監控功能是使用 Keras 的 callback 來達成, 不過這裡我們只展示相關程式碼而不多解釋 (callback 的詳細用法可參見「tf.keras 技術者們必讀! 深度學習攻略手冊」第 7–0 節)。

底下就趕快來看程式碼:

自訂模組 util2.py 的內容如下:

程式的執行結果如下:

由以上實驗結果可發現, batch_size=1024 時的訓練成效最好, 只花了 4.1 秒就達到 98% 的準確率。不過每次測試的結果都可能有些差異, 基本上 batch_size 約在 128~4096 之間的訓練成效都算不錯。當 batch_size 為 1 或 2 時的成效最差, 花了 20 分鐘仍未達到 98%;batch_size 為 4 或 8 時的成效也很差, 花了 2 分鐘以上的時間才達到 98%;再來是 batch_size=60000, 共花了 61.69 秒才達到 98%。

分析原因, 當 batch_size=1 時, 就表示每次只用 1 筆樣本來訓練 (計算損失值然後進行優化), 這有可能發生 2 個問題:

  1. 如果遇到品質不佳、甚至錯誤的樣本, 就會將模型往不正確的方向優化, 因而不利於模型的收斂。反之, 如果改用較多筆樣本一起訓練, 則可將少數不良樣本的影響力平均掉, 讓模型仍可往正確的方向優化。
  2. 如果是分類預測, 那麼每次只用一筆樣本訓練, 就相當於只針對一種類別做優化而未顧及其他的類別, 因此難保優化方向是正確的。反之, 如果改用較多筆樣本一起訓練, 則能同時針對多種類別進行優化, 自然比較能往正確的方向優化。不過如果是迴歸預測, 理論上就比較不會有這個問題。

因此 batch_size 設太小時, 就比較容易受單筆樣本的影響 (見樹不見林) 而不利於訓練, 此問題在分類預測時更加明顯。

反之, 若將 batch_size 設的很大, 則會 花過多的時間在計算損失值 (將大量樣本以正向傳播法算出預測值, 再比對答案計算損失值)。例如一次用 60000 筆樣本計算損失值, 然後只做一次優化, 這在效率上非常不合算, 因而導致效率低落。不過由總訓練次數 (優化次數) 來看, batch_size 最大的 3 種訓練其優化次數也最少 (480~507 次), 表示每次優化的方向都比其他訓練更正確一些。

當樣本數量龐大或模型較為複雜 (使用很多的權重參數) 時, 將 batch_size 設太大還可能會耗盡電腦的記憶體而發生 OOM (Out Of Memroy) 錯誤。

--

--

施威銘研究室
施威銘研究室

Written by 施威銘研究室

致力開發AI領域的圖書、創客、教具,希望培養更多的AI人才。整合各種人才,投入創客產品的開發,推廣「實作學習」,希望實踐學以致用的理想。

No responses yet