DropoutとBatchNorm — 学習を安定させ、汎化させる

深いネットワークは放っておくと「訓練データの丸暗記(過学習)」と「学習の不安定化」に苦しみます。その二大処方箋 — 学習のたびにノードをわざと壊すDropoutと、層への入力分布を毎回整えるBatch Normalization — の動作原理を、動かしながら理解します。

1. Dropout — わざと壊しながら鍛える

Dropout は驚くほど乱暴なアイデアです。学習中、ミニバッチを処理するたびに、各ノードを確率 p でランダムに無効化(出力を0に)します。つまり毎回別の「部分ネットワーク」が学習することになります。

下のデモで p を動かし、「新しいミニバッチ」を何度か押してみてください。毎回違うメンバーで練習させられている様子が見えます。そして推論モードに切り替えると — 全員が復帰する代わりに、各重みを (1−p) 倍して「学習時の平均的な入力の大きさ」と辻褄を合わせます。

Dropout の動作 — 毎バッチ別の部分ネットワークが学習する
薄くなったノード=このミニバッチでは無効(出力0)。Dropout は通常隠れ層に適用します。学習モードでは自動でミニバッチが切り替わります。推論モードでは全ノードを使い、重みを (1−p) 倍にスケーリング(エッジが薄くなるのがその表現)。
学習時: h̃ᵢ = mᵢ · hᵢ , mᵢ ~ Bernoulli(1−p)   推論時: h̃ᵢ = (1−p) · hᵢ 実装では学習時に 1/(1−p) 倍しておく「inverted dropout」が主流(推論時は何もしなくてよい)。PyTorch 等もこの方式
注意 — 学習時と推論時で挙動が違う Dropout(と後述の BatchNorm)は学習時と推論時で計算が変わる層。フレームワークで model.eval() への切り替えを忘れると「推論のたびに結果が変わる」「精度が謎に低い」という定番バグになる。

2. なぜ効くのか — 巨大なアンサンブルの多数決

Dropout が効く理由は2つの見方で説明できます。

Dropout の効果 — 決定境界が滑らかになる(2D分類)
●=訓練データ(水色=クラスA、オレンジ=クラスB)、白い縁取り=ラベルノイズ(外れ値)。Dropoutなしのモデルは外れ値まで拾うグネグネの境界で訓練精度100%を叩き出しますが、テスト精度は80%。Dropoutありは外れ値を「ノイズ」として諦めた滑らかな境界になり、訓練精度は下がるのにテスト精度は上がります。
POINT — 訓練精度を捨ててテスト精度を買う 正則化とは「訓練データへの当てはまり」を意図的に犠牲にして「未知データへの汎化」を買う取引。隠れノード16個の小さなネットでも部分ネットワークは 216 = 65,536 通り — Dropout はこの巨大アンサンブルをほぼタダで手に入れる方法と言える。

3. BatchNorm — 層への入力分布を毎回整える

深いネットのもう一つの悩みは、学習が進むと前の層の重みが変わり、後ろの層から見た入力の分布がずるずる動き続けることです(下のデモ左側)。各層は「動く標的」に向かって学習することになり、学習率を上げられず不安定になります。

Batch Normalization(BN)は各層の入力を、ミニバッチ内の統計量で平均0・分散1に毎回正規化し、そのうえで学習可能なパラメータ γ・β で「ちょうどよいスケールと位置」に置き直します。①→②→③ の順にボタンを押して3段階を確認してください。

BatchNorm の動作 — ①そのまま → ②正規化 → ③γ・βで再スケール
左=BNなし:この層への入力分布(1ミニバッチ分のヒストグラム)は学習の進行とともに平均も分散も動き続けます(内部共変量シフト)。右=BNあり:②で常に平均0・分散1に固定され、③で γ・β により層が自分の好きな分布に置き直します。下の帯は両者のミニバッチ平均 μ の推移 — オレンジは揺れ続け、緑は動かないことに注目(γ・βを動かすと緑の線も β へ移動します)。
μ_B = 1/m Σ xᵢ , σ²_B = 1/m Σ (xᵢ−μ_B)² → x̂ᵢ = (xᵢ − μ_B) ⁄ √(σ²_B + ε) → yᵢ = γ x̂ᵢ + β γ・β は学習されるパラメータ。正規化で失われる表現力(層ごとの最適なスケール・位置)を取り戻す。推論時は移動平均で貯めた μ, σ² を使う

4. BNはなぜ効くのか — 実は諸説ある

BN を入れると、大きな学習率でも発散しにくくなり、初期値への敏感さが減り、学習が数倍速くなることが経験的に知られています。おまけにミニバッチごとの統計ゆらぎがノイズとして働き、弱い正則化効果まであります。ところが「なぜ効くのか」の説明は一枚岩ではありません。

一歩先へ — 「内部共変量シフト」説は揺らいでいる BN の原論文(2015)は上のデモ左側のような内部共変量シフトの抑制を理由に挙げた。しかし後の研究(Santurkar らの2018年の実験)は、わざと BN の後ろに分布シフトを注入しても学習が速いままであることを示し、本質は損失地形が滑らかになる(勾配のリプシッツ性が改善する)ことだと主張した。現在も完全には決着しておらず、「効くのは確実、理由は複合的」というのが正直なところ。

5. weight decay も含めた使い分け

正則化の道具箱にはもう一つの古参、weight decay(L2正則化) — 毎ステップ重みを少しだけ0へ縮める — があります。3つは役割が違うので、対立ではなく併用が基本です。

手法何をするか主な狙い注意点
Dropout学習時にノードを確率 p で無効化共適応を防ぎ、擬似アンサンブルで汎化推論時はスケーリング。畳み込み層には効きにくく、現代の CNN/Transformer では全結合部分などに限定的に使う
BatchNorm層入力をバッチ統計で正規化し γ・β で再スケール学習を速く・安定に。大きい学習率を許容(+弱い正則化)バッチが小さいと統計が暴れる(代替: LayerNorm など)。推論時は移動平均統計に切り替え
Weight decay (L2)毎ステップ重みを僅かに縮める重みの暴走を防ぎ、単純な関数を優先させるAdam と素朴に併用すると効きが歪む → AdamW で分離する。BN 直前の層にはスケール不変性のため効き方が変わる
注意 — DropoutとBNの併用は順序に敏感 Dropout が学習時に分散を変えてしまうため、BN を Dropout の後ろに置くと学習時と推論時で BN の統計がずれる(variance shift)。併用するなら「BN → 活性化 → Dropout」の順が無難で、そもそも BN があると Dropout を減らす・外す設計も多い。

6. まとめ