DropoutとBatchNorm — 学習を安定させ、汎化させる
深いネットワークは放っておくと「訓練データの丸暗記(過学習)」と「学習の不安定化」に苦しみます。その二大処方箋 — 学習のたびにノードをわざと壊すDropoutと、層への入力分布を毎回整えるBatch Normalization — の動作原理を、動かしながら理解します。
1. Dropout — わざと壊しながら鍛える
Dropout は驚くほど乱暴なアイデアです。学習中、ミニバッチを処理するたびに、各ノードを確率 p でランダムに無効化(出力を0に)します。つまり毎回別の「部分ネットワーク」が学習することになります。
下のデモで p を動かし、「新しいミニバッチ」を何度か押してみてください。毎回違うメンバーで練習させられている様子が見えます。そして推論モードに切り替えると — 全員が復帰する代わりに、各重みを (1−p) 倍して「学習時の平均的な入力の大きさ」と辻褄を合わせます。
model.eval() への切り替えを忘れると「推論のたびに結果が変わる」「精度が謎に低い」という定番バグになる。
2. なぜ効くのか — 巨大なアンサンブルの多数決
Dropout が効く理由は2つの見方で説明できます。
- 共適応の防止:特定のノード同士が「相方がいる前提」の危うい連携(訓練データにしか通用しない暗記)を作れなくなる。どのノードも、仲間がいつ消えるか分からない前提で単独でも意味のある特徴を持たざるを得ない。
- 擬似アンサンブル:隠れノードが n 個あれば部分ネットワークは 2n 通り。Dropout 学習はこの膨大なネットワーク群を重み共有しながら同時に訓練し、推論時の (1−p) 倍スケーリングはその平均(多数決)の近似になっている。
3. BatchNorm — 層への入力分布を毎回整える
深いネットのもう一つの悩みは、学習が進むと前の層の重みが変わり、後ろの層から見た入力の分布がずるずる動き続けることです(下のデモ左側)。各層は「動く標的」に向かって学習することになり、学習率を上げられず不安定になります。
Batch Normalization(BN)は各層の入力を、ミニバッチ内の統計量で平均0・分散1に毎回正規化し、そのうえで学習可能なパラメータ γ・β で「ちょうどよいスケールと位置」に置き直します。①→②→③ の順にボタンを押して3段階を確認してください。
4. BNはなぜ効くのか — 実は諸説ある
BN を入れると、大きな学習率でも発散しにくくなり、初期値への敏感さが減り、学習が数倍速くなることが経験的に知られています。おまけにミニバッチごとの統計ゆらぎがノイズとして働き、弱い正則化効果まであります。ところが「なぜ効くのか」の説明は一枚岩ではありません。
5. weight decay も含めた使い分け
正則化の道具箱にはもう一つの古参、weight decay(L2正則化) — 毎ステップ重みを少しだけ0へ縮める — があります。3つは役割が違うので、対立ではなく併用が基本です。
| 手法 | 何をするか | 主な狙い | 注意点 |
|---|---|---|---|
| Dropout | 学習時にノードを確率 p で無効化 | 共適応を防ぎ、擬似アンサンブルで汎化 | 推論時はスケーリング。畳み込み層には効きにくく、現代の CNN/Transformer では全結合部分などに限定的に使う |
| BatchNorm | 層入力をバッチ統計で正規化し γ・β で再スケール | 学習を速く・安定に。大きい学習率を許容(+弱い正則化) | バッチが小さいと統計が暴れる(代替: LayerNorm など)。推論時は移動平均統計に切り替え |
| Weight decay (L2) | 毎ステップ重みを僅かに縮める | 重みの暴走を防ぎ、単純な関数を優先させる | Adam と素朴に併用すると効きが歪む → AdamW で分離する。BN 直前の層にはスケール不変性のため効き方が変わる |
6. まとめ
- Dropout:学習のたびに別の部分ネットワークを訓練 = 2n 個のアンサンブルの近似。推論時は全ノード+(1−p) 倍スケーリング(inverted dropout なら不要)。
- 効果は決定境界の滑らかさに現れる:訓練精度を少し捨てて、テスト精度を買う。
- BatchNorm:層入力をミニバッチ統計で平均0・分散1にし、γ・β で再スケール。学習が速く・安定になり、大きな学習率が使える。
- BN が効く理由は「分布シフト抑制」だけでなく「損失地形の平滑化」説が有力 — 諸説ある。
- weight decay は重みの暴走防止。3点セットは役割分担で併用し、学習時/推論時のモード切替を忘れない。