ひとことで言うと
ドロップアウトは、訓練時の各フォワードパスでユニットをランダムに無効化する手法です。特定のユニット同士がいつも組になって答えを出す共適応を崩し、欠けた状態でも予測できる表現を学習させます。
毎回メンバーをくじ引きで休ませたチームが、誰か一人に依存せず仕事を進めるようになる仕掛けです。
なぜ必要か
大きなネットワークは表現力が高い一方、訓練データへの合わせ込みが起きます。ドロップアウトでは、ユニットとその接続を確率的に外すため、訓練のたびに異なる「薄い」ネットワークになります。原論文の解釈では、これは指数個のサブネットワークを共有パラメータで訓練し、それらの予測を平均することの近似です。実際に全ネットワークを別々に持つ必要がない点が実用上の要所です。
| 場面 | 起きていること | ねらい |
|---|---|---|
| 訓練 | マスクで一部のユニットを落とす | 共適応を崩し、複数の薄いネットワークを学習する |
| 推論 | マスクを使わず一つのネットワークを動かす | 学習したアンサンブルの平均を近似する |
仕組み
入力を 、ドロップ率を 、各要素を残すマスクを とします。 は確率 で1、確率 で0になるベルヌーイ変数です。訓練時の出力は、現在主流の inverted dropout なら次です。
は要素ごとの積です。分母で割るのは、入力の期待値を訓練前と揃えるためです。したがって推論時はマスクを掛けず、層はそのまま入力を返します。古い説明で見る「推論時に重みを 倍する」方式は、訓練側で割らない実装に対応します。両方を同時に適用すると出力を二重に縮めるので、どちらの流儀かを確認します。
試験でどう問われるか
| 問われ方 | 正解に寄る条件 | 引っかけ |
|---|---|---|
| 訓練時の挙動 | ユニットをランダムに落とし、共適応を抑える | 推論時にも毎回ランダムに落とす |
| アンサンブル解釈 | 指数個の薄いネットワークの平均を単一ネットワークで近似する | サブネットワークを個別に保存して平均する |
| スケール調整 | inverted dropout は訓練時に 倍する | 訓練時と推論時の両方で縮小する |
| モード切替 | 評価時はマスクを無効化する | eval 忘れで推論結果が毎回変わる |
実装で確かめる
NumPyで、訓練時だけマスクとスケールを適用する最小例です。p は落とす確率なので、残す確率を別に掛けない点に注意します。
import numpy as np
rng = np.random.default_rng(0)
x = np.ones(100_000)
p = 0.2
mask = rng.random(x.shape) >= p
train_y = mask * x / (1 - p) # inverted dropout
eval_y = x # 評価時は恒等写像
print(round(train_y.mean(), 3), eval_y.mean())
取り違えやすいもの
| 対象 | ドロップアウトとの切り分け |
|---|---|
| 通常の重み減衰 | 重みの大きさへ直接ペナルティを掛ける。ユニットを落とす操作ではない |
| 推論時のランダム化 | 通常の評価ではマスクを止める。意図的に複数回サンプルする使い方とは別 |
| バッチ正規化などの正規化層 | 学習・評価で統計や挙動が変わる層。ドロップアウトのマスク処理と同じものではない |
| inverted dropout | 手法の別物ではなく、訓練時にスケールを済ませる実装流儀 |
正規化層と近接して置く場合は、各層の統計をどのモードで計算するかが変わります。ドロップアウトの前後で分布が揺れるため、既存モデルへ機械的に挿入せず、配置と評価モードを実装仕様として確認します。
想起チェック
ドロップアウトは何をランダムに無効化するか
訓練時のユニットです。対応する接続も実質的に外れ、フォワードパスごとに異なる薄いネットワークになります。
inverted dropout で推論時に何をするか
訓練時に 倍して期待値を合わせるため、推論時はマスクも追加スケールも使わず恒等写像にします。
推論結果が毎回変わるとき最初に確認することは何か
評価モードへ切り替わっているかを確認します。推論時にも訓練用のマスクが動いている可能性があります。