[論文筆記] Batch size 越小越好?這篇論文這樣說

Hyades Lai
8 min readAug 30, 2022

--

抱歉用了釣魚標題🥺,這篇文整理了論文 <Revisiting Small Batch Training for Deep Neural Networks> 中,作者對 batch size 的研究結果與我的觀察。作者透過大量的實驗,去比較不同 batch size 與 learning rate 搭配下的實驗結果,並考慮 batch normalization 與 warm-up 等情境,並做出了「 batch size 小一點比較好!」的結論。

一、先備知識與實驗設定

Linear Scaling Rule: Batch size 與 Learning rate 的關係

一般 mini-batch SGD 的參數更新可參考下圖,假設 batch size 為 m,我們會針對 m 個樣本點計算各自的梯度,並且取平均(加總除以 m )、再乘上學習率 η 。

mini-batch SGD的更新公式

假設我們放大 batch size 為 k 倍,且不調整學習率,這時可以發現:單一樣本算出的梯度對該次參數更新的影響會變成 k 分之一倍 (因為下式中分母的 m 變成 mk)。

因此, 為了讓每個樣本的梯度影響維持一致,當我們的 batch size 提升 k 倍,則學習率也應該增加 k 倍,此即為 linear scaling rule 。

延續此精神,作者的實驗將學習率設定為下式。等同於以 linear scaling rule 的方式,去比較不同 batch size 與 learning rate 之間的關係。

有了上述的概念,接下來就來看看作者的實驗結果吧:

二、實驗結果的觀察

觀察1. 較小的 batch size 通常有比較好的準確度

作者用各種模型、資料集、與參數配置做了一大堆實驗。從這張總結圖可以看出,大部分的情境下,不論是否使用 BatchNorm 與 data augmentation,較小的 batch size 都能取得較佳的結果,當 batch size 大於 32 時,準確度都會開始遞減。

觀察2. 較小的 batch size 通常較容易收斂(convergence robustness)

  • 圖8: ResNet32 on CIFAR-10, with Batch Norm and data augmentation.
  • 圖12: ResNet50 on ImageNet, with Batch Norm and data augmentation.

先解釋一下圖片怎麼判讀,左圖每條線代表不同的學習率,而 x 軸則是每條線在不同 batch size 下的準確率。回顧上節的實驗設定,因為作者把梯度更新公式的分母 m 給拿掉了,所以這邊增加 batch size 等於用較大的學習率訓練(因為梯度加總變大)。

右圖則是每條線代表一個 batch size, x 軸為不同的 base learning rate。

觀察下面的圖 8 與圖 12,從右圖可以看出,較小的 batch size 能在較多的 base learning rate 區間上成功收斂,代表 batch size 較小時,能讓模型收斂的學習率範圍很大。

而較大的 batch size,能收斂的 learning rate 區間通常較小,且準確度也較低。

觀察 3. warm-up 可以改善大 batch size 的實驗結果,但還是小 batch size 好

  • 設定:ResNet32 on CIFAR-100, with BN and data augmentation。
  • 圖 11: 有 warm-up,圖 9: 無 warm-up。

warm-up 即在模型訓練剛開始時,先把學習率調低,再慢慢增加到原先設定的學習率。通常是在大 batch size 時,為了防止參數更新太慢,導致一開始模型訓練的不穩定。著名的 transformer 如果不搭配 warm-up 就很難訓練。

觀察兩組的左圖可以發現,加了 warm-up 的確可以改善大 batch size 時的準確率,但依舊呈現小 batch size 準確率較高的趨勢。

BatchNorm 篇: batch normalization 對batch size 設定的影響

BatchNorm 好處多多,基本上是現在 (2022) 的模型標配了。但 BatchNorm 必須根據 batch 內的資料計算平均數與標準差,並用來標準化資料,而小 batch size 因為樣本過少,會導致平均數與標準差的估計不準確,反而搞壞資料。因此,作者想知道,若加入 BatchNorm 後,是否還是在小 batch size 上有較佳的表現?或者我們必須為了 BatchNorm 調高 batch size?

另外,因為 fully-connected layer 與 convolution layer 後面計算 BatchNorm 的方式不同 (對應 BatchNorm1D 與 BatchNorm2D),所以作者也想知道兩者對 batch size 的限制是否相同。

備註:假設 batch size 為 n ,對 BatchNorm2D 來說,若輸入 feature map為 [n, c, w, h],則每個 channel (c)共有 n*w*h 的樣本可以參與 BatchNorm 運算。但對於 BatchNorm1D 來說,輸入 feature map 為 [n, x],x 的維度上只有 n 個點可以參與 batchnorm 運算。

觀察4. 加入 BatchNorm 可以改善準確度,且依然是在小 batch size 準確度較好

  • 圖1: 無 BatchNorm
  • 圖5: 有 BatchNorm (BatchNorm1D 與 BatchNorm2D)
  • 圖6: 有 BatchNorm (BatchNorm2D)

比較圖 1 與圖 5 ,可以發現加入 BatchNorm 後,準確度得到不少提升,且大 batch size 上的準確度也變得比較可靠,不過依然是在小 batch size 上有較佳的結果。

觀察5: 小 batch size 下,fully-connected layer 的 BatchNorm 需要一定的資料量,convolution layer 則不用

從圖 5 可以發現,batch size 小於 4 時,準確度就變得很難看了,這可能就是因為 fully-connected layer 後的 batchnorm1D 需要一定量的資料才能得到穩定的結果。

所以,作者拔掉了 fully-connected layer 後面的 batchnorm1D 。從圖 6 可以發現,模型依然能在 batch size 為 2 時跑出很好的結果,代表 convolution layer 的 batchNorm2D 比較不受小 batch size 影響。

觀察6: 在大 batch size 參數更新時,使用小 batch size 算 BatchNorm 準確度較好

蛤???

參數更新與 BatchNorm 用不同的 batch size,這種情境主要發生在資料平行的分布訓練 (data parallel distributed processing) ,資料會在不同節點上做 batchnorm 算 loss ,最後把梯度集中起來一起更新,所以會發生 BatchNorm 與參數更新的 batch size 大小不同的狀況(且 BatchNorm 通常較小)。

作者針對這個情境也做了實驗,讓我們了解 BatchNorm 的 batch size 對訓練結果的影響。從圖 13 可以看到,使用較大的參數更新 batch size 時,較小的 BatchNorm batch size 的結果會稍好一點,不過「參數更新 batch size」對於準確度的影響明顯比較大

三、Takeaway

所以要在實驗中使用小 batch size 嗎?

根據作者實驗結果, batch size 較小時通常能有較好的結果。但在不同任務中也許又是另一番風景,我們終究還是要自己做實驗去試出我們的最佳 batch size。

另外, machine learning 專案中,我們必須不斷地進行實驗的迭代,迭代速度決定你能試幾種模型、超參數、資料,往往迭代速度才是決定最終專案結果的最大因素。

而 batch size 調大能增快你的訓練速度,所以我覺得在實驗時,只要模型訓練的起來,可以盡可能調大 batch size,等實驗逐漸收斂後再嘗試使用較小的 batch size,看能不能提升模型準確度。

BatchNorm 與 batch size 的關係

相信很多人都知道 batch size 較小時,不適合使用 Batchnorm ,而作者進一步區分 1D 與 2D,並用實驗結果表明: BatchNorm2D 其實在 batch size 很小時依舊有效。

--

--

Hyades Lai

為了紀錄知識與生活,開始寫 medium 啦!文筆不好請見諒qq