ミニバッチ学習 みにばっちがくしゅう
ミニバッチバッチサイズSGD学習効率深層学習データローダー
ミニバッチ学習について教えて
簡単に言うとこんな感じ!
全社員の意見を聞いてから決断する(バッチ学習)のも、1人ずつ聞きながら決断する(SGD)のも極端だよね。ミニバッチは「10人ずつ聞いてから決断する」バランス型!深層学習ではこれが標準なんだ。
ミニバッチ学習とは
ミニバッチ学習(Mini-batch Learning) は、学習データを小さなグループ(ミニバッチ)に分割し、バッチ単位でパラメータを更新する学習手法です。現代のディープラーニングでは事実上の標準的手法として使われています。
データを全部使って1回更新する「バッチ学習」は計算が重く、1件ずつ使う「オンライン学習(SGD)」はノイズが多い——ミニバッチはその中間のベストバランスを取ります。一般にバッチサイズは32〜256がよく使われますが、モデルの規模やGPUのメモリに応じて調整します。
ミニバッチによってGPU並列計算を効率的に活用できるのも大きなメリットです。行列演算を束ねて処理できるため、同じ件数でも1件ずつ処理するより大幅に高速化できます。
バッチサイズによる違い
| バッチサイズ | 特徴 | 向いている場面 |
|---|---|---|
| 1(完全SGD) | 更新が多く不安定。メモリ消費最小 | 小さなモデル、オンライン学習 |
| 32〜128(ミニバッチ) | バランスが良く最もよく使われる | ほとんどのDLタスク |
| 256〜1024(大バッチ) | 安定しているが学習率調整が必要 | 分散学習、大規模モデル |
| 全データ(バッチ) | 最も安定だが計算コスト大 | 小規模データセット |
from torch.utils.data import DataLoader
# ミニバッチを自動生成するDataLoader
dataloader = DataLoader(
dataset,
batch_size=64, # バッチサイズ(1回の更新に使うデータ数)
shuffle=True, # エポックごとにシャッフル
num_workers=4 # データ読み込みの並列数
)
for epoch in range(num_epochs):
for x_batch, y_batch in dataloader: # ミニバッチを1つずつ取り出す
optimizer.zero_grad()
loss = model(x_batch, y_batch)
loss.backward()
optimizer.step()
歴史と背景
- 1980年代:確率的勾配降下法(SGD)が普及するが、計算効率の問題があった
- 2000年代:GPUの登場により行列計算の並列処理が可能になり、ミニバッチの恩恵が大きくなる
- 2012年:AlexNetがミニバッチ学習とGPUを組み合わせてImageNetで優勝し、標準化が進む
- 現在:分散学習では各ノードがミニバッチを処理し勾配を集約する手法が主流
バッチサイズと学習率の関係
バッチサイズを大きくした場合は、学習率も比例して大きくする必要があります(線形スケーリング則)。
| バッチサイズ | 推奨学習率の目安 |
|---|---|
| 32 | 0.001 |
| 64 | 0.002 |
| 128 | 0.004 |
| 256 | 0.008 |
関連用語
- SGD(確率的勾配降下法) — ミニバッチと組み合わせる最適化手法
- Adam — ミニバッチと組み合わせて使う定番最適化アルゴリズム
- 学習率スケジューリング — バッチサイズと連動して調整する
- データ前処理 — ミニバッチに供給するデータの準備