LESSON

正則化テクニック

田中VPoE:「深層学習モデルはパラメータ数が多い分、過学習しやすい。ここからは、モデルの性能を引き出すための実践テクニックを学ぼう。まずは正則化だ。」

あなた:「Dropout と BatchNorm は既に使いましたが、他にもあるんですか?」

田中VPoE:「いくつかの正則化手法を組み合わせるのが実務の定石だ。それぞれの仕組みと使いどころを整理しておこう。」

Dropout

学習時にランダムにニューロンを無効化し、特定のニューロンへの依存を防ぎます。

import torch.nn as nn

# Dropout の使用
model = nn.Sequential(
    nn.Linear(256, 128),
    nn.ReLU(),
    nn.Dropout(p=0.3),  # 30% のニューロンを無効化
    nn.Linear(128, 64),
    nn.ReLU(),
    nn.Dropout(p=0.3),
    nn.Linear(64, 10)
)

Dropout の仕組み

学習時:
  ニューロン: [○ × ○ ○ × ○ ○ × ○ ○]  (× は無効化)
  出力は 1/(1-p) 倍にスケーリング(期待値を保つ)

推論時:
  ニューロン: [○ ○ ○ ○ ○ ○ ○ ○ ○ ○]  (全て有効)
  スケーリングなし
Dropout 率推奨場面
0.1 ~ 0.2Transformer の Attention 後
0.2 ~ 0.3中間層
0.3 ~ 0.5全結合層(過学習が強い場合)

2D Dropout(画像向け)

# チャンネル全体を無効化(空間的な相関を保持)
dropout2d = nn.Dropout2d(p=0.2)  # CNN の特徴マップに使用

Batch Normalization(BatchNorm)

ミニバッチ内でデータを正規化し、学習の安定化と高速化を実現します。

# BatchNorm1d: 全結合層の後に使用
bn1d = nn.BatchNorm1d(128)  # 128ユニットの出力を正規化

# BatchNorm2d: 畳み込み層の後に使用
bn2d = nn.BatchNorm2d(64)   # 64チャンネルの特徴マップを正規化

BatchNorm の仕組み

各ミニバッチについて:
  1. バッチ内の平均 μ と分散 σ² を計算
  2. 正規化: x_norm = (x - μ) / sqrt(σ² + ε)
  3. スケーリング: y = γ * x_norm + β  (γ, β は学習パラメータ)

学習時: バッチ統計量を使用し、移動平均を記録
推論時: 記録した移動平均を使用

BatchNorm の効果

効果説明
学習の安定化内部共変量シフトを軽減
高速化より大きな学習率が使える
正則化効果ミニバッチの統計量にノイズが含まれるため
勾配の改善勾配の大きさが安定する

Layer Normalization(LayerNorm)

LayerNorm は各サンプルの特徴量方向に正規化します。Transformer で標準的に使用されます。

# LayerNorm: 特徴量方向に正規化
ln = nn.LayerNorm(512)  # 512次元の特徴量を正規化

BatchNorm vs LayerNorm

比較項目BatchNormLayerNorm
正規化方向バッチ方向特徴量方向
バッチサイズ依存あり(小バッチで不安定)なし
主な用途CNNTransformer, RNN
推論時の挙動移動平均を使用入力のみで計算
BatchNorm:
  バッチ内の全サンプルで各特徴量の平均/分散を計算
  [サンプル1の特徴1, サンプル2の特徴1, ...] → 正規化

LayerNorm:
  各サンプル内の全特徴量の平均/分散を計算
  [サンプル1の特徴1, サンプル1の特徴2, ...] → 正規化

Weight Decay(重み減衰)

パラメータの大きさにペナルティを加え、重みが過度に大きくなるのを防ぎます。

# L2 正則化(Weight Decay)
optimizer = torch.optim.Adam(
    model.parameters(),
    lr=1e-3,
    weight_decay=1e-4  # L2 正則化の強度
)

# AdamW では Weight Decay が正しく分離されている
optimizer = torch.optim.AdamW(
    model.parameters(),
    lr=1e-3,
    weight_decay=0.01  # AdamW の推奨値
)
OptimizerWeight Decay の扱い
Adam + weight_decayL2 正則化(勾配に加算)
AdamWWeight Decay を正しく分離(推奨)

正則化手法の組み合わせ

class RegularizedModel(nn.Module):
    def __init__(self):
        super().__init__()
        self.network = nn.Sequential(
            nn.Linear(100, 256),
            nn.BatchNorm1d(256),    # BatchNorm
            nn.ReLU(),
            nn.Dropout(0.3),        # Dropout
            nn.Linear(256, 128),
            nn.BatchNorm1d(128),
            nn.ReLU(),
            nn.Dropout(0.3),
            nn.Linear(128, 10)
        )

    def forward(self, x):
        return self.network(x)

model = RegularizedModel()
# Weight Decay は Optimizer で設定
optimizer = torch.optim.AdamW(model.parameters(), lr=1e-3, weight_decay=0.01)

正則化の強さの調整

症状対策
過学習(train↓ val↑)Dropout を増やす、Weight Decay を強める
学習不足(両方高い)Dropout を減らす、モデルを大きくする
学習が不安定BatchNorm/LayerNorm を追加、学習率を下げる

まとめ

  • Dropout はニューロンをランダムに無効化して過学習を防ぐ
  • BatchNorm はバッチ方向に正規化し、学習の安定化と高速化を実現する
  • LayerNorm は特徴量方向に正規化し、Transformer で標準使用される
  • Weight Decay はパラメータの大きさを制約し、過学習を抑制する
  • 複数の正則化手法を組み合わせて使うのが実務の定石

チェックリスト

  • Dropout の仕組みと推奨ドロップ率を理解した
  • BatchNorm と LayerNorm の違いと使い分けを説明できる
  • Weight Decay の役割と Adam vs AdamW の違いを理解した
  • 過学習の度合いに応じた正則化の調整ができる

推定読了時間: 30分