学習手法

ミニバッチ学習 みにばっちがくしゅう

ミニバッチバッチサイズ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で優勝し、標準化が進む
  • 現在:分散学習では各ノードがミニバッチを処理し勾配を集約する手法が主流

バッチサイズと学習率の関係

バッチサイズを大きくした場合は、学習率も比例して大きくする必要があります(線形スケーリング則)。

バッチサイズ推奨学習率の目安
320.001
640.002
1280.004
2560.008

関連用語