Batch Normalization
バッチ正規化は、ミニバッチ内の各チャネルを標準化し、学習可能なパラメーターで再スケーリングします。数式、推論時の挙動、限界を解説します。
バッチ正規化(BatchNorm)は、入力の各チャネルを現在のミニバッチの平均と分散で正規化し、その結果を学習可能な2つのパラメーターで再スケーリングするニューラルネットワークの層です。Sergey Ioffe氏とChristian Szegedy氏が2015年に発表し、これにより同氏らのInception 画像分類器は、14分の1の学習ステップ数で同じ精度を達成しました。BatchNormはより高い学習率を可能にし、重み初期化への学習の感度を下げ、ResNetなどの畳み込みニューラルネットワーク(CNN)における標準的な構成要素となりました。
バッチ正規化の仕組み#
畳み込み層では、BatchNormはチャネルごとに平均μと分散σ²を1つずつ計算し、バッチ内のすべての画像とすべての空間位置を対象に集約します。各活性化値xには、次の2つの処理を適用します。
- 正規化: x̂ = (x − μ) / √(σ² + ε)。PyTorchではデフォルトで1e-5となる小さなεにより、ゼロ除算を防ぎます。
- スケーリングとシフト: y = γ·x̂ + β。γとβはチャネルごとに学習されます。これにより、次の層に適した平均とばらつきをネットワークが復元でき、正規化を完全に取り消すこともできます。
BatchNormは通常、畳み込み層と活性化関数の間に配置されます。βがチャネルごとのオフセットをすでに加えるため、前段の畳み込み層のバイアスは冗長であり、通常は無効にします。
学習と推論#
学習中は、各順伝播でバッチ統計量の指数移動平均として、移動平均と移動分散も更新されます。PyTorchのBatchNorm2dは、デフォルトでは各新規バッチに向かって10%移動します(momentum=0.1)。推論時には、代わりにこれらの移動平均を使って層を正規化するため、1枚の画像の予測が、同じバッチに含まれるほかの画像に左右されなくなります。model.train()とmodel.eval()で、これら2つの動作を切り替えます。
import torch
torch.manual_seed(0)
bn = torch.nn.BatchNorm2d(num_features=3)
# A batch of 8 three-channel feature maps with mean 5 and standard deviation 2
x = 5 + 2 * torch.randn(8, 3, 16, 16)
# Training mode normalizes with this batch's per-channel mean and variance
out = bn(x)
print(f"train mode: output mean {out.mean():.3f}, std {out.std():.3f}")
# The same call nudges the running averages 10% of the way toward the batch statistics
print(f"running mean {bn.running_mean[0]:.3f}, running var {bn.running_var[0]:.3f}")
# Eval mode normalizes with the running averages instead of the batch statistics
bn.eval()
out = bn(x)
print(f"eval mode: output mean {out.mean():.3f}, std {out.std():.3f}")学習モードでは、入力の平均が5であっても、出力の平均は0.000、標準偏差は1.000になります。1バッチ処理した後も、移動平均は0から0.496へ、移動分散は1から1.294へ変化しただけなので、評価モードの出力平均は3.920になります。移動平均が収束するには数十バッチが必要です。誤ったモードで評価したモデルや、統計量が安定する前に評価したモデルのスコアは、本来の精度を大きく下回ります。
推論時のBatchNormはチャネルごとの固定線形変換であるため、前段の畳み込み層に統合できます。畳み込みの重みにγ/√(σ² + ε)を乗算し、バイアスをβ − γμ/√(σ² + ε)にします。YOLO26の標準的な畳み込みブロックは、バイアスなしの畳み込み層にBatchNormとSiLU活性化関数を続けた構成です。Ultralyticsでは、予測とエクスポートの前にBatchNorm層をそれぞれ畳み込み層へ統合するため、同じ出力を保ちながら層を取り除けます。
バッチ正規化が効果を発揮する理由#
原著論文では、BatchNormの効果を内部共変量シフトの軽減、つまり前段の層が更新される際に各層の入力分布が変化する現象の軽減に帰していました。その後、BatchNorm層の後にランダムな分布シフトを注入した実験では、学習への影響はほとんど見られず、効果の原因はより滑らかな損失曲面と予測しやすい勾配にあるとされました。これにより、オプティマイザーはより大きく安定したステップを取れます。活性化前の値を平均0、分散1付近に保つことで、飽和する活性化関数が平坦な領域に入るのも防ぎ、勾配消失の抑制にも役立ちます。
各サンプルはランダムに選ばれたバッチの統計量で正規化されるため、BatchNormはノイズも加えます。このノイズは弱い正則化として働き、原著論文では場合によってドロップアウトが不要になることも報告されました。
制限事項#
- 小さなバッチ: 各デバイスに保持する画像が少ないと、バッチ統計量のノイズが大きくなります。GPUあたり2枚の画像を使った場合、画像ごとにチャネル群全体の統計量を計算するグループ正規化は、ResNet-50でBatchNormよりImageNetのエラー率を10.6%低減しました。
- マルチGPU学習: 層をSyncBatchNormに変換しない限り、各GPUはバッチのうち自身に割り当てられた部分で正規化します。SyncBatchNormは通信コストを伴う代わりに、デバイス間で統計量を集約します。
- 系列モデル: 可変長系列とバッチ依存の統計量は相性がよくないため、Transformerでは代わりにレイヤー正規化を使います。
バッチ正規化と関連用語の比較#
- データ正規化: 前処理時に、たとえばピクセル値を255で割るなどして、生の入力を一度だけ再スケーリングします。BatchNormは、すべての層および学習ステップで中間活性化値を正規化します。
- レイヤー正規化: 各サンプルについて、そのサンプル自身の特徴量にわたって正規化するため、学習時と推論時で同じ動作をし、バッチサイズにも依存しません。平均の減算を省いたシンプルな派生手法であるRMSNormは、大規模言語モデルで一般的に使われます。
- グループ正規化: 各画像のチャネルを複数のグループに分割し、グループごとに正規化します。小さなバッチで学習する物体検出モデルやセグメンテーションモデルに適しています。
- インスタンス正規化: 画像ごとに各チャネルを個別に正規化し、画像単位のコントラストを取り除きます。学習時とテスト時の両方でBatchNormをインスタンス正規化に置き換えたところ、高速なニューラルスタイル変換の品質が大幅に向上しました。










