ドロップアウト正則化シミュレーター 戻る
機械学習

ドロップアウト正則化シミュレーター

ニューラルネットワークの過学習を抑える「ドロップアウト」を体験するツールです。保持確率 p と層のニューロン数を変えると、ランダムに消えるニューロンのマスク、保持数の二項分布、1/p スケーリング、そして暗黙に訓練される部分ネットワークの総数 2ⁿ がリアルタイムで分かります。

パラメータ設定
層のニューロン数 n
この層に並ぶニューロン(ユニット)の総数
保持確率 p
各ニューロンが「残る」確率。1−p が消える確率
乱数シード seed
マスク生成の擬似乱数を決める種。決定論的に再現
平均活性値 a
各ニューロンの活性化出力のおおよその大きさ
計算結果
保持ニューロン数
ドロップ数
スケール係数 1/p
期待アクティブ数
部分ネットワーク総数
出力スケール比
ドロップアウトマスク — サブネットワークのアニメーション

層のニューロンを格子状に表示します。点灯したニューロンは保持、灰色+×印は今回ドロップされたもの。マスクは約1.5秒ごとに引き直され、毎回ちがう部分ネットワークが現れます。

保持ニューロン数の確率分布(二項分布)
期待アクティブ数 vs 保持確率 p
理論・主要公式

$$\text{(訓練時)}\quad y_i=\frac{m_i}{p}\,a_i,\qquad m_i\sim\text{Bernoulli}(p)$$

訓練時、各ニューロン i は確率 p で残り($m_i=1$)、確率 $1-p$ で消える($m_i=0$)。生き残った活性 $a_i$ は 1/p 倍にスケールされる。これが逆ドロップアウト(inverted dropout)で、推論時はマスクもスケーリングも不要でネットワークをそのまま使える。

$$P(k)=\binom{n}{k}p^{k}(1-p)^{n-k},\qquad \mathbb{E}[k]=np$$

n 個中ちょうど k 個が保持される確率は二項分布に従い、保持数の期待値は np。出力の期待値は $\mathbb{E}[\sum m_i a_i / p]=\sum a_i$ で、ドロップ前と一致する。

$$N_{\text{sub}}=2^{n},\qquad \log_{10}N_{\text{sub}}=n\log_{10}2$$

各ニューロンが「残る/消える」の2状態を取るため、可能なサブネットワークは $2^{n}$ 通り。ドロップアウトはこの指数的に多い細いネットワークを暗黙に同時訓練している。

ドロップアウト正則化とは

🙋
「ドロップアウト」って、学習の途中でニューロンをわざと消すんですよね?せっかく作った部品を捨てるなんて、もったいなくないですか?
🎓
気持ちは分かるけど、捨てるんじゃなくて「一時的に休ませる」が正しいイメージだね。訓練のミニバッチごとに、各ニューロンをコインで決めるように確率 1−p でランダムにオフにする。次のバッチではまた別のニューロンが休む。左の保持確率 p を 0.5 にすると、毎回だいたい半分が休んでいる状態になる。上のキャンバスを見ると、点灯したやつと灰色の×印が1.5秒ごとに入れ替わるだろう?あれが「毎回ちがうサブネットワークで学習している」ということなんだ。
🙋
わざとランダムに壊して、それで性能が上がるんですか?直感に反します…。
🎓
そこがドロップアウトの面白いところだ。ニューロンを消さずに普通に訓練すると、ニューロン同士が「お前がこの特徴を見るなら、俺はその裏取りをするよ」みたいに役割分担を始める。これを共適応(co-adaptation)と呼ぶ。仲が良すぎるチームみたいなもので、訓練データには強いけど、本番データでメンバーが少し変わると総崩れになる——これが過学習だ。ドロップアウトは「隣のニューロンはいつ休むか分からない」状況を作るから、各ニューロンは他人に頼らず単独でも使える特徴を学ぶしかなくなる。
🙋
なるほど、頼り合いを禁止するわけですね。でも半分も消したら、層から出てくる信号が弱くなりませんか?
🎓
鋭い。実際 p=0.5 なら合計はだいたい半分になる。そこで使うのが 1/p スケーリングだ。生き残ったニューロンの出力を 1/p 倍——p=0.5 なら2倍に増幅する。左の「スケール係数 1/p」と「出力スケール比」を見て。スケール比はシードを変えるたびに 1 の前後でゆらぐけど、平均すると必ず 1 になる。こうしておけば層出力の期待値が消す前と一致するから、推論のときはドロップアウトもスケーリングも全部オフにして、ネットワークをそのまま使えるんだ。この方式を逆ドロップアウト(inverted dropout)と呼ぶ。
🙋
「部分ネットワーク総数」が ≈10⁶ ってすごい数ですけど、これは何を意味してるんですか?
🎓
n=20 個のニューロンそれぞれが「残る/消える」の2択だから、マスクの組み合わせは 2²⁰ ≈ 100 万通り。n を 64 まで上げると約 1.8×10¹⁹ という天文学的な数になる。各バッチではそのうち1つのサブネットワークしか訓練しないけど、重みは全部のサブネットワークで共有されている。だからドロップアウトは「指数的に多い細いネットワークを同時に訓練して、推論時にその平均を近似的に取る」アンサンブル学習だと解釈できる。ランダムフォレストが多数の決定木を平均するのと同じ発想を、1つのネットワークの中で実現しているんだ。
🙋
じゃあ p はとにかく小さくして、たくさん消すほど良いんですか?
🎓
いや、そこはトレードオフだ。p を小さくしすぎると毎回ほとんど消えてしまい、ネットワークが学ぶ容量そのものが足りなくなって、今度は学習不足(アンダーフィット)になる。逆に p=1.0 はドロップアウトを完全にオフにした状態で、正則化の効果はゼロ。実務では全結合の隠れ層で p=0.5、入力に近い層では情報を消しすぎないよう p=0.8〜0.9 と高めにするのが定石だね。下の「期待アクティブ数 vs p」のグラフで、p を動かすと生き残る数が直線的に変わるのが見えるよ。

よくある質問

ドロップアウトは訓練の各ステップでニューロンを確率 1−p でランダムに「消す」ため、ネットワークは特定のニューロンに頼り切る戦略を取れなくなります。あるニューロンが他のニューロンの存在を前提に役割分担してしまう「共適応(co-adaptation)」が壊され、各ニューロンは単独でも意味のある特徴を学ぶよう強制されます。これは多数の細いサブネットワークを訓練して平均を取るアンサンブル学習に近く、結果として汎化性能が上がり過学習が抑えられます。
ドロップアウトで一部のニューロンを消すと、層の出力の合計は平均して p 倍に減ってしまいます。逆ドロップアウト(inverted dropout)では、生き残ったニューロンの活性を訓練時に 1/p 倍にスケールすることでこの減少を打ち消し、層出力の期待値を元のまま保ちます。こうしておくと推論時にはマスクもスケーリングも一切不要で、ネットワークをそのまま使えます。現在の主要フレームワークはすべてこの逆ドロップアウト方式を採用しています。
n 個のニューロンを持つ層では、各ニューロンが「残る/消える」の2状態を取るため、可能なマスクの組み合わせは 2ⁿ 通りあります。n=20 なら約 100 万、n=64 なら約 1.8×10¹⁹ という天文学的な数です。各ミニバッチではそのうち1つのサブネットワークだけが訓練されますが、重みは全サブネットワークで共有されるため、ドロップアウトは指数的に多いネットワークを同時に訓練し、推論時にその近似的な平均を取っていると解釈できます。
全結合の隠れ層では p=0.5(半分を消す)が古典的な標準値で、Hinton らの原論文でもこの値が使われました。入力層に近い部分では情報を消しすぎないよう p=0.8〜0.9 と高めにします。畳み込み層は重みの共有とパラメータ数の少なさからそもそも過学習しにくいため、ドロップアウトを弱めるか使わない、あるいは空間ブロック単位で落とす SpatialDropout を使うのが一般的です。p=1.0 はドロップアウトを完全にオフにした状態に相当します。

実世界での応用

画像認識のCNN分類器:VGG や AlexNet のような畳み込みネットワークでは、最後の全結合層(分類ヘッド)に p=0.5 のドロップアウトを入れるのが定番でした。畳み込み層はパラメータが少なく過学習しにくい一方、全結合層は数千万のパラメータを持ち過学習の温床になります。そこに集中してドロップアウトを効かせることで、ImageNet のような大規模データセットでも汎化性能を保ちます。畳み込み層には通常のドロップアウトより、空間的に相関したピクセルをまとめて落とす SpatialDropout が使われます。

自然言語処理と Transformer:BERT や GPT 系の Transformer は、各注意(attention)層とフィードフォワード層の出力に p=0.1 前後の控えめなドロップアウトを入れています。さらに注意の重み行列そのものにドロップアウトをかける attention dropout も併用されます。大規模言語モデルは学習データも巨大ですが、それでも特定のトークン共起パターンへの過剰適合を防ぐためにドロップアウトが効いています。

不確実性推定(MC Dropout):通常ドロップアウトは推論時にオフにしますが、あえて推論時もオンにしたまま同じ入力を何十回も流すと、毎回ちがうサブネットワークの予測が得られます。そのばらつき(分散)をモデルの「自信のなさ」として読み取る手法がモンテカルロドロップアウト(MC Dropout)です。医療画像診断や自動運転など、予測の信頼度を知る必要がある領域で、ベイズ的な不確実性推定の簡便な近似として使われています。

小規模データセットでの学習:データが数百〜数千件しかない医療・産業検査・科学計測の分野では、モデルが訓練データを丸暗記する過学習が深刻です。データ拡張や転移学習と並んで、ドロップアウトは追加コストほぼゼロで効く正則化として真っ先に試されます。検証損失が訓練損失から大きく乖離し始めたら、ドロップアウト率を上げるのが基本的な対処の一つです。

よくある誤解と注意点

まず最も多い誤解が、「推論時にもドロップアウトを効かせたままにする」ことです。逆ドロップアウトの 1/p スケーリングは訓練時に行うため、推論時はドロップアウトを完全にオフ(全ニューロンを使用、スケーリングなし)にするのが正しい使い方です。フレームワークでは「train モード/eval モード」の切り替えがこれを担っており、評価前に eval モードへ切り替え忘れると、予測が毎回ランダムにゆらいで精度が落ちます。逆に MC Dropout のように意図的にオンのままにする使い方は別物で、混同しないことが重要です。

次に、「ドロップアウトとバッチ正規化(BatchNorm)を安易に重ねる」こと。両者を同じ層に同時に置くと、ドロップアウトが作るランダムなスケールのゆらぎと、BatchNorm が計算するミニバッチ統計(平均・分散)が干渉し、訓練と推論で統計がずれて性能が落ちることが知られています。実務では BatchNorm を使う層ではドロップアウトを省く、あるいはドロップアウトを BatchNorm の後ろに置く、といった配置の工夫が必要です。両方をとりあえず全層に入れれば強くなる、という発想は危険です。

最後に、「ドロップアウト率を上げれば上げるほど正則化が強くて良い」という思い込み。p を小さくして大量に消すと、確かに過学習は抑えられますが、ネットワークが一度に使える容量が減り、今度は訓練データすら十分に学べないアンダーフィットに陥ります。また学習が不安定になり収束も遅くなります。ドロップアウト率はあくまでハイパーパラメータであり、検証損失を見ながら調整すべき対象です。「過学習しているからとにかく p を下げる」のではなく、まずモデル容量・データ量・学習率とのバランスを見て、適切な範囲(隠れ層で p=0.5 前後)から調整するのが定石です。

使い方ガイド

  1. ニューロン数スライダー(nNum)で隠れ層のユニット数を設定します。例えば256ユニットの場合、ドロップアウト適用時の保持数が二項分布B(256, p)に従います
  2. 保持確率pスライダー(pNum)を0.3~0.9の範囲で調整し、各エポックで保持するニューロンの割合を決定します。p=0.5なら期待値として128ユニットが有効に保たれます
  3. 乱数シード(seedNum)を変更してマスクパターンを再生成し、同じ確率分布下での異なるドロップパターンを比較します。その際1/pスケーリング係数により出力を補正し、推論時のスケール齟齬を防ぎます

具体的な計算例

隠れ層1024ニューロン、p=0.8、バッチサイズ32で訓練する場合を想定します。各サンプルでランダムにニューロンをドロップすると、保持数の期待値は1024×0.8=819.2です。実際のドロップ数は約204.8となり、スケール係数1/0.8=1.25が出力に乗算されます。このネットワークの部分ネットワーク総数は2¹⁰²⁴に達し、一般化性能の向上に寄与します。乱数シード固定時には毎回同じマスク配列が生成され、再現性が確保されます

実務での注意点

  1. 画像分類(CIFAR-10)では隠れ層にp=0.5を設定すると過学習を抑制できますが、RNN言語モデルではp=0.8以上が推奨されます。層ごとにドロップアウト率を変える場合、入力層近くは0.1程度に低く設定し、深い隠れ層では0.5を採用するのが定石です
  2. 訓練時と推論時で異なる計算グラフが生成されるため、1/pスケーリングの有無をフレームワーク(TensorFlow・PyTorch)で明示的に指定しないとスケール齟齬が生じます
  3. バッチ正規化と併用する場合、ドロップアウトをBN層の後に配置し、乱数シードを固定してハイパーパラメータ探索時の再現性を確保してください