正則化テクニック
田中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.2 | Transformer の 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
| 比較項目 | BatchNorm | LayerNorm |
|---|---|---|
| 正規化方向 | バッチ方向 | 特徴量方向 |
| バッチサイズ依存 | あり(小バッチで不安定) | なし |
| 主な用途 | CNN | Transformer, 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 の推奨値
)
| Optimizer | Weight Decay の扱い |
|---|---|
| Adam + weight_decay | L2 正則化(勾配に加算) |
| AdamW | Weight 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分