banner
kanes

kanes

深入淺出深度學習中的BatchSize

一、Batch Size 的核心作用#

Batch Size 決定了模型每次更新參數時使用的樣本數量。直接影響以下方面:

  1. 梯度計算的準確性

    • 大 Batch 的梯度是多個樣本的平均,更接近 “真實梯度”(整個數據集的梯度方向)。
    • 小 Batch 的梯度噪聲更大,但可能帶來正則化效果,防止過擬合。
  2. 硬體資源利用率

    • GPU 的並行計算能力在大 Batch 下更高效。
    • 但 Batch 過大會導致顯存不足(OOM),需權衡資源。
  3. 收斂速度和穩定性

    • 大 Batch 單步更新更準,但可能收斂到 “尖銳” 最小值(泛化差)。
    • 小 Batch 更新頻繁,收斂路徑更 “抖動”,但可能找到 “平坦” 最小值(泛化好)。

二、Batch Size 與梯度下降的關係#

1. 梯度噪聲的數學解釋#

假設總樣本數為 (N),Batch Size 為 ( B ),損失函數為 ( L )。

  • 全批量梯度下降(B=N)
θt+1=θtη1Ni=1NLi(θt)\theta_{t+1} = \theta_t - \eta \cdot \frac{1}{N} \sum_{i=1}^{N} \nabla L_i(\theta_t)

梯度無噪聲,但計算成本高。

  • 小批量梯度下降(B≪N)
θt+1=θtη1Bi=1BLi(θt)\theta_{t+1} = \theta_t - \eta \cdot \frac{1}{B} \sum_{i=1}^B \nabla L_i(\theta_t)

梯度是真實梯度的有偏估計,噪聲方差與 $(\frac {1}{B} )$ 成正比。

2. 噪聲對訓練的影響#

  • 小 Batch(B=32)

    • 噪聲大 → 參數更新方向波動大 → 可能跳出局部最優。
    • 類似 “隨機探索”,適合複雜任務(如小數據集、高噪聲數據)。
  • 大 Batch(B=1024)

    • 噪聲小 → 更新方向穩定 → 快速收斂,但易陷入局部最優。
    • 類似 “精確制導”,適合大數據集、分佈式訓練。

三、Batch Size 的實踐選擇策略#

1. 資源限制下的最大 Batch Size#

  • 顯存估算公式
最大 Batch Size=可用顯存模型佔用的顯存單個樣本的顯存佔用 \text{最大 Batch Size} = \frac{\text{可用顯存} - \text{模型佔用的顯存}}{\text{單個樣本的顯存佔用}}
  • 例如:GPU 顯存 24GB,模型佔用 4GB,每個樣本佔 0.2GB → 最大 Batch Size ≈ ((24-4)/0.2 = 100 )。

  • 技巧

    • 使用梯度累積(Gradient Accumulation):小 Batch 多次前向傳播後累積梯度,再更新參數。
      例如:目標 Batch Size=64,實際 GPU 只能支持 16 → 累積 4 次梯度再更新。

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)優化器。
      • 學習率根據每層權重的範數自適應調整。

五、調試 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 做醫學圖像分割:

  1. 硬體條件:單卡 12GB 顯存,輸入尺寸 256x256。
  2. 估算 Batch Size
    • 模型本身佔用 3GB,剩餘 9GB。
    • 每張圖顯存佔用約 0.5GB → 最大 Batch Size≈18 → 選擇 16(2 的幂數)。
  3. 訓練效果
    • 發現驗證集 IoU 波動大 → 可能 Batch Size 過小,梯度噪聲大。
    • 嘗試梯度累積:累積 4 步(等效 Batch Size=64),學習率調整為 4 倍。
  4. 結果
    • 損失曲線更平滑,IoU 提升 5%。

七、總結#

  • Batch Size 是訓練中的槓桿:需平衡速度、資源、穩定性、泛化能力。
  • 核心法則
    • 資源允許時,從常用值(32~256)開始。
    • 大 Batch 需調大學習率,小 Batch 需注意梯度噪聲。
    • 結合任務特點和硬體條件靈活調整。

此文由 Mix Space 同步更新至 xLog
原始鏈接為 https://blog.kanes.top/posts/ArtificialIntelligence/EasytounderstandBatchSizeinDeepLearning


載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。