一、Batch Size の核心作用#
Batch Size は、モデルがパラメータを更新する際に使用するサンプルの数を決定します。以下の点に直接影響します:
-
勾配計算の正確性:
- 大きなバッチの勾配は複数のサンプルの平均であり、「真の勾配」(全データセットの勾配方向)に近いです。
- 小さなバッチの勾配はノイズが大きいですが、正則化効果をもたらし、過学習を防ぐ可能性があります。
-
ハードウェアリソースの利用率:
- GPU の並列計算能力は大きなバッチの方が効率的です。
- しかし、バッチが大きすぎるとメモリ不足(OOM)を引き起こす可能性があり、リソースのバランスを考慮する必要があります。
-
収束速度と安定性:
- 大きなバッチは単ステップの更新がより正確ですが、「鋭い」最小値(一般化が悪い)に収束する可能性があります。
- 小さなバッチは更新が頻繁で、収束パスがより「揺らぎます」が、「平坦な」最小値(一般化が良い)を見つける可能性があります。
二、Batch Size と勾配降下法の関係#
1. 勾配ノイズの数学的説明#
総サンプル数を (N)、バッチサイズを ( B )、損失関数を ( L ) とします。
- 全バッチ勾配降下(B=N):
勾配はノイズがなく、計算コストが高いです。
- 小バッチ勾配降下(B≪N):
勾配は真の勾配の偏った推定であり、ノイズの分散は $(\frac {1}{B} )$ に比例します。
2. ノイズがトレーニングに与える影響#
-
小バッチ(B=32):
- ノイズが大きい → パラメータ更新方向の変動が大きい → 局所最適から脱出する可能性があります。
- 「ランダム探索」に似ており、複雑なタスク(小さなデータセット、高ノイズデータ)に適しています。
-
大バッチ(B=1024):
- ノイズが小さい → 更新方向が安定 → 迅速に収束しますが、局所最適に陥りやすいです。
- 「精密誘導」に似ており、大規模データセットや分散トレーニングに適しています。
三、Batch Size の実践的選択戦略#
1. リソース制限下での最大バッチサイズ#
- メモリ推定式:
-
例えば:GPU メモリ 24GB、モデル占有 4GB、各サンプル占有 0.2GB → 最大バッチサイズ ≈ ((24-4)/0.2 = 100 )。
-
テクニック:
- 勾配累積(Gradient Accumulation)を使用:小バッチで複数回前向き伝播を行った後、勾配を累積し、パラメータを更新します。
例えば:目標バッチサイズ = 64、実際の GPU は 16 しかサポートできない → 4 回勾配を累積してから更新します。
- 勾配累積(Gradient Accumulation)を使用:小バッチで複数回前向き伝播を行った後、勾配を累積し、パラメータを更新します。
2. 学習率とバッチサイズの連動#
-
線形スケーリングルール(Linear Scaling Rule):
- バッチサイズを (k) 倍にすると、学習率も ( k ) 倍にする必要があります。
- 理論的根拠:大バッチの勾配分散は (k) 倍減少し、更新ステップを一定に保つために学習率を増加させる必要があります。
- 例えば:元のバッチサイズ = 64、学習率 = 0.1 → バッチサイズ = 256 の場合、学習率≈0.4。
-
注意事項:
- 学習率を無限に増加させることはできません!実際にはウォームアップ(Warmup)戦略を組み合わせて、学習率を徐々に増加させる必要があります。
3. 異なるタスクの経験則#
-
画像分類(ImageNet):
- 一般的にバッチサイズ = 256 または 512(複数の GPU 並列が必要)。
- 小さなモデル(例:MobileNet)は 64〜128 に減少できます。
-
物体検出 / セグメンテーション(COCO):
- バッチサイズ = 2〜16(高解像度画像のメモリ占有が大きいため)。
- 例えば、Mask R-CNN は通常バッチサイズ = 2〜8 を使用します。
-
自然言語処理(BERT):
- バッチサイズ = 32〜512、勾配累積を組み合わせます。
- 大きなバッチ(例:8192)は特別な最適化(例:LAMB オプティマイザ)が必要です。
四、Batch Size の進化的影響#
1. 一般化能力(Generalization)#
-
大バッチの一般化のジレンマ:
- 実験により、大バッチトレーニングは「鋭い」最小値に収束しやすく、テストセットのパフォーマンスが悪くなることが示されています。
- 解決策:
- データ拡張(Data Augmentation)を増やす。
- 確率的重み平均(SWA, Stochastic Weight Averaging)を使用する。
- 明示的な正則化(例:ラベルスムージング)を導入する。
-
小バッチの暗黙の正則化:
- 勾配ノイズはパラメータに対してランダムな摂動を加えることに相当し、Dropout の効果に似ています。
2. バッチ正規化との結合#
- BN のバッチサイズへの依存:
- BN は現在のバッチの平均と分散を用いて正規化を行います。
- バッチサイズが小さすぎる → 統計量の推定が不正確 → トレーニングが不安定になります。
- 推奨:バッチサイズ ≥ 32 の場合は BN を使用;バッチサイズが小さすぎる場合はグループ正規化またはレイヤー正規化に変更することを検討します。
3. 分散トレーニングにおけるバッチサイズ#
-
データ並列(Data Parallelism):
- 各 GPU がサブバッチを処理し、最終的に勾配を同期します。
- グローバルバッチサイズ = 単一 GPU バッチサイズ × GPU の数。
- 例えば:4 つの GPU で、各カードのバッチサイズ = 64 → グローバルバッチサイズ = 256。
-
極端に大きなバッチトレーニング:
- 例えば、Google の 1.5M バッチサイズで ResNet をトレーニングする:
- LARS(Layer-wise Adaptive Rate Scaling)オプティマイザと組み合わせる必要があります。
- 学習率は各層の重みのノルムに基づいて自動的に調整されます。
- 例えば、Google の 1.5M バッチサイズで ResNet をトレーニングする:
五、バッチサイズのデバッグの具体的なステップ#
1. 初期選択#
- 一般的な値(例:32 または 64)から始め、メモリ使用量とトレーニング速度を観察します。
- メモリ不足の場合は、バッチサイズを半分に減らし、OOM(Out Of Memory)にならないまで続けます。
2. トレーニングの動的監視#
-
トレーニング損失曲線:
- 小バッチ:損失の減少が大きく変動しますが、全体的な傾向は下降します。
- 大バッチ:損失が滑らかに減少しますが、早期に停滞する可能性があります。
-
検証セットのパフォーマンス:
- トレーニングセットの損失が減少しても検証セットが減少しない場合 → 過学習の可能性があります(バッチサイズを減少させるか、データを強化する必要があります)。
- 両者が減少しない場合 → モデルの容量が不足しているか、ラベルに誤りがある可能性があります。
3. ハイパーパラメータの調整#
- バッチサイズを固定し、学習率を調整:
- 学習率検索(LR Finder)を使用:学習率を徐々に増加させ、損失が最も早く減少する範囲を見つけます。
- 共同調整:
- バッチサイズと学習率は共同で調整する必要があります(線形スケーリングルールを参照)。
六、実際のケース:画像セグメンテーションにおけるバッチサイズの調整#
U-Net を使用して医療画像セグメンテーションをトレーニングしていると仮定します:
- ハードウェア条件:単一カード 12GB メモリ、入力サイズ 256x256。
- バッチサイズの推定:
- モデル自体が 3GB を占有し、残りは 9GB。
- 各画像のメモリ占有は約 0.5GB → 最大バッチサイズ≈18 → 16 を選択(2 の累乗数)。
- トレーニング効果:
- 検証セットの IoU が大きく変動することが判明 → バッチサイズが小さすぎる可能性があり、勾配ノイズが大きい。
- 勾配累積を試みる:4 ステップを累積(等価バッチサイズ = 64)、学習率を 4 倍に調整。
- 結果:
- 損失曲線がより滑らかになり、IoU が 5% 向上しました。
七、まとめ#
- バッチサイズはトレーニングにおけるレバレッジ:速度、リソース、安定性、一般化能力のバランスを取る必要があります。
- 核心法則:
- リソースが許す限り、一般的な値(32〜256)から始めます。
- 大バッチは学習率を増加させる必要があり、小バッチは勾配ノイズに注意する必要があります。
- タスクの特性とハードウェア条件に応じて柔軟に調整します。
この記事は Mix Space によって xLog に同期更新されました
元のリンクは https://blog.kanes.top/posts/ArtificialIntelligence/EasytounderstandBatchSizeinDeepLearning