一、Batch Size 的核心作用#
Batch Size 決定了模型每次更新參數時使用的樣本數量。直接影響以下方面:
-
梯度計算的準確性:
- 大 Batch 的梯度是多個樣本的平均,更接近 “真實梯度”(整個數據集的梯度方向)。
- 小 Batch 的梯度噪聲更大,但可能帶來正則化效果,防止過擬合。
-
硬體資源利用率:
- GPU 的並行計算能力在大 Batch 下更高效。
- 但 Batch 過大會導致顯存不足(OOM),需權衡資源。
-
收斂速度和穩定性:
- 大 Batch 單步更新更準,但可能收斂到 “尖銳” 最小值(泛化差)。
- 小 Batch 更新頻繁,收斂路徑更 “抖動”,但可能找到 “平坦” 最小值(泛化好)。
二、Batch Size 與梯度下降的關係#
1. 梯度噪聲的數學解釋#
假設總樣本數為 (N),Batch Size 為 ( B ),損失函數為 ( L )。
- 全批量梯度下降(B=N):
梯度無噪聲,但計算成本高。
- 小批量梯度下降(B≪N):
梯度是真實梯度的有偏估計,噪聲方差與 $(\frac {1}{B} )$ 成正比。
2. 噪聲對訓練的影響#
-
小 Batch(B=32):
- 噪聲大 → 參數更新方向波動大 → 可能跳出局部最優。
- 類似 “隨機探索”,適合複雜任務(如小數據集、高噪聲數據)。
-
大 Batch(B=1024):
- 噪聲小 → 更新方向穩定 → 快速收斂,但易陷入局部最優。
- 類似 “精確制導”,適合大數據集、分佈式訓練。
三、Batch Size 的實踐選擇策略#
1. 資源限制下的最大 Batch Size#
- 顯存估算公式:
-
例如:GPU 顯存 24GB,模型佔用 4GB,每個樣本佔 0.2GB → 最大 Batch Size ≈ ((24-4)/0.2 = 100 )。
-
技巧:
- 使用梯度累積(Gradient Accumulation):小 Batch 多次前向傳播後累積梯度,再更新參數。
例如:目標 Batch Size=64,實際 GPU 只能支持 16 → 累積 4 次梯度再更新。
- 使用梯度累積(Gradient Accumulation):小 Batch 多次前向傳播後累積梯度,再更新參數。
2. 學習率與 Batch Size 的聯動#
-
線性縮放規則(Linear Scaling Rule):
- 當 Batch Size 乘以 (k),學習率也應乘以 ( k )。
- 理論依據:大 Batch 的梯度方差減小 (k) 倍,需增大小學習率以保持更新步長一致。
- 例如:原 Batch Size=64,學習率 = 0.1 → Batch Size=256 時,學習率≈0.4。
-
注意事項:
- 學習率不能無限放大!實際中需結合熱身(Warmup)策略,逐步增加學習率。
3. 不同任務的經驗值#
-
圖像分類(ImageNet):
- 常用 Batch Size=256 或 512(需多 GPU 並行)。
- 小模型(如 MobileNet)可降低到 64~128。
-
目標檢測 / 分割(COCO):
- Batch Size=2~16(因高解析度圖像顯存佔用大)。
- 例如 Mask R-CNN 通常用 Batch Size=2~8。
-
自然語言處理(BERT):
- Batch Size=32~512,結合梯度累積。
- 大 Batch(如 8192)需特殊優化(如 LAMB 優化器)。
四、Batch Size 的進階影響#
1. 泛化能力(Generalization)#
-
大 Batch 的泛化困境:
- 實驗表明,大 Batch 訓練容易收斂到 “尖銳” 最小值,測試集表現較差。
- 解決方法:
- 增加數據增強(Data Augmentation)。
- 使用隨機權重平均(SWA, Stochastic Weight Averaging)。
- 引入顯式正則化(如 Label Smoothing)。
-
小 Batch 的隱式正則化:
- 梯度噪聲相當於對參數施加隨機擾動,類似 Dropout 的效果。
2. 與 Batch Normalization 的耦合#
- BN 對 Batch Size 的依賴:
- BN 通過當前 Batch 的均值和方差做歸一化。
- Batch Size 過小 → 統計量估計不準 → 訓練不穩定。
- 建議:Batch Size ≥ 32 時使用 BN;若 Batch Size 過小,可改用 Group Normalization 或 Layer Normalization。
3. 分佈式訓練中的 Batch Size#
-
數據並行(Data Parallelism):
- 每個 GPU 處理子 Batch,最終同步梯度。
- 全局 Batch Size = 單卡 Batch Size × GPU 數量。
- 例如:4 塊 GPU,每卡 Batch Size=64 → 全局 Batch Size=256。
-
極端大 Batch 訓練:
- 如 Google 的 1.5M Batch Size 訓練 ResNet:
- 需配合 LARS(Layer-wise Adaptive Rate Scaling)優化器。
- 學習率根據每層權重的範數自適應調整。
- 如 Google 的 1.5M Batch Size 訓練 ResNet:
五、調試 Batch Size 的具體步驟#
1. 初始選擇#
- 從常用值開始(如 32 或 64),觀察顯存佔用和訓練速度。
- 若顯存不足,逐步減半 Batch Size,直到不再 OOM(Out Of Memory)。
2. 監控訓練動態#
-
訓練損失曲線:
- 小 Batch:損失下降波動大,但整體趨勢向下。
- 大 Batch:損失平滑下降,但可能停滯早。
-
驗證集表現:
- 若訓練集損失下降但驗證集不降 → 可能過擬合(需減小 Batch Size 或增強數據)。
- 若兩者均不降 → 可能模型容量不足或標註錯誤。
3. 超參數調優#
- 固定 Batch Size,調學習率:
- 使用學習率搜索(LR Finder):逐步增加學習率,找到損失下降最快的區間。
- 聯合調參:
- Batch Size 和 學習率需共同調整(參考線性縮放規則)。
六、實際案例:圖像分割中的 Batch Size 調整#
假設你在訓練 U-Net 做醫學圖像分割:
- 硬體條件:單卡 12GB 顯存,輸入尺寸 256x256。
- 估算 Batch Size:
- 模型本身佔用 3GB,剩餘 9GB。
- 每張圖顯存佔用約 0.5GB → 最大 Batch Size≈18 → 選擇 16(2 的幂數)。
- 訓練效果:
- 發現驗證集 IoU 波動大 → 可能 Batch Size 過小,梯度噪聲大。
- 嘗試梯度累積:累積 4 步(等效 Batch Size=64),學習率調整為 4 倍。
- 結果:
- 損失曲線更平滑,IoU 提升 5%。
七、總結#
- Batch Size 是訓練中的槓桿:需平衡速度、資源、穩定性、泛化能力。
- 核心法則:
- 資源允許時,從常用值(32~256)開始。
- 大 Batch 需調大學習率,小 Batch 需注意梯度噪聲。
- 結合任務特點和硬體條件靈活調整。
此文由 Mix Space 同步更新至 xLog
原始鏈接為 https://blog.kanes.top/posts/ArtificialIntelligence/EasytounderstandBatchSizeinDeepLearning