Dropoutは「暗黙のアンサンブル」なのか。同じパラメータ予算で本物のアンサンブルと殴り合わせたら、相関係数0.13だった
約15分で読めます

Dropoutは「暗黙のアンサンブル」なのか。同じパラメータ予算で本物のアンサンブルと殴り合わせたら、相関係数0.13だった


「dropoutは、指数個のサブネットワークを暗黙のうちにアンサンブルしているようなものだ」——machine learningを学び始めると、わりと早い段階でこの説明に出会う。Srivastavaらのdropout原論文(2014)にも、学習時にユニットをランダムに落とすことは 2n2^n 通りのサブネットワークの重み共有アンサンブルを訓練しているのと近い、という趣旨の記述がある。よく聞く話だし、直感的にも納得しやすい。ただ、これを自分の手で検証したことは一度もなかった。

言葉で終わらせず、実際に「本物の明示的アンサンブル」と「dropoutを使った1つの大きいネット」を、同じパラメータ予算で殴り合わせてみることにした。精度だけでなく、アンサンブルの本質である「予測の不確実性(点ごとのばらつき)」の構造が本当に似ているのかまで見る。

対決の設計: 総パラメータ数をほぼ揃える

データは two moons(重なりが大きく、単純な境界では解けないノイズ設定)。GAN の記事Normalizing Flow の記事でも使ってきたおなじみの形だ。

two moonsのデータセットの散布図。青がclass 0、オレンジがclass 1で、2つの三日月が大きく重なり合っており、単純な直線では分離できないことが見て取れる

図だけだと規模感が分からないので、数字を先に固定しておく。データはnoise=0.28で1000点生成し(座標は平均0・分散1に標準化)、そのうち700点を訓練用、残りの300点をテスト用に分けた。タスクは、平面上の点の座標を入力として、その点がclass 0とclass 1のどちらの三日月から生成されたかを当てる2クラス分類で、モデルの出力は「class 1である確率」1つだ。このあと何度も出てくる「テスト精度」は、学習に一切使っていないこの300点を、出力確率0.5を境に分類したときの正解率を指す。図の通り2つの三日月は大きく重なっているので、重なりの中の点は位置だけを見てもどちらのクラスか原理的に判定しようがなく、テスト精度が1.0に届くことはない設定になっている。

対決させる2つのモデルは以下の通り。すべて2入力→隠れ層(tanh)→1出力(sigmoid)のMLPを、順伝播・逆伝播・GANの記事から続けて使っているAdamオプティマイザまで全部numpyで自前実装している。

  • explicit ensemble: 隠れユニット8個の小さいMLPを、異なる乱数初期化からM=10個、それぞれ独立に学習(33パラメータ×10=330パラメータ)。テスト時は10個の出力を平均する
  • dropout付きMLP 1個: 隠れユニット80個(=8×10、小さいネット10個分と同じ隠れユニット総数)のMLPを1つ、学習時にdropout率p=0.5で学習(321パラメータ、アンサンブル側の97.3%)。テスト時もdropoutをONにしたまま10回forwardして平均する(MC-dropout)。学習が終わったら dropout を切って1回だけ通す「普通の」推論もついでに記録しておく

explicit ensemble(上段、隠れ8ユニットの小さいMLPの箱が10個横に並び、独立に初期化・独立に学習した10個の予測を平均、test acc 0.927)とdropout付きMLP(下段、隠れ80ユニットの大きい箱1個をp=0.5のdropoutで学習し、推論時もdropoutをONのまま10回forwardして平均、test acc 0.930)を上下に並べた対比図。総パラメータ数はほぼ同じ(330 vs 321)であることが最上部に明記されている

隠れユニット総数を揃えれば総パラメータ数もほぼ揃う、というのが単一隠れ層MLPの都合の良いところで、今回はこれで「同じ予算」を作った。学習エポック数・バッチ(全データ使用のフルバッチ)・学習率もすべて同一条件にしている。

def forward(params, X, drop_p=0.0, train=False, rng=None):
    W1, b1, W2, b2 = params
    h1 = np.tanh(X @ W1 + b1)
    mask = None
    if drop_p > 0.0:
        # train=TrueでもFalseでも、dropoutは同じ確率でONにする
        # (MC-dropoutの核心: 推論時もマスクをサンプルし続ける)
        mask = (rng.random(h1.shape) > drop_p) / (1 - drop_p)
        h1 = h1 * mask
    out = sigmoid(h1 @ W2 + b2).ravel()
    return out, (X, h1, mask)

「学習時だけdropoutを有効にして推論時は切る」のが普通の使い方だが、MC-dropoutはこの逆で、推論時もdropoutを生かしたまま複数回forwardする。1回ごとに違うユニットの組み合わせで予測させ、その散らばりを「モデルの自信のなさ」として読む、というのがアイデアの核心だ。

精度はほぼ互角だった

まず素直にテスト精度を比べる。

  • explicit ensemble(10個平均): 0.927
  • MC-dropout(p=0.5、10回平均): 0.930
  • 同じdropoutネット、dropoutを切った通常の1回forward: 0.927

ほぼ差がない。むしろdropout切っただけの1回forwardがensembleの平均と全く同じ精度に落ち着いたのは偶然にしても出来すぎで、少なくとも「予測精度」という指標だけ見れば、dropoutは確かにアンサンブルに匹敵する仕事をしている。ここまでは説の通りだ。

不確実性のヒートマップ: 平均は揃うが、分散の「形」が違う

本題はここから。テスト精度という1点の要約ではなく、入力空間全体で「平均予測」と「予測の分散(不確実性)」をヒートマップにした。ensembleは10メンバーの分散、MC-dropoutは10回のforwardパスの分散だ。

4枚のヒートマップ。左上と右上は平均予測(赤=class1寄り、青=class0寄り)でensembleとMC-dropoutはほぼ同じS字の境界を描いている。左下はensembleの分散で、データがある領域ではほぼ紫色(低い)だが、右上の外挿域(データが疎な角)だけ黄色く鋭く跳ね上がっている。右下はMC-dropoutの分散で、決定境界に沿って薄く青緑色の帯が広がっているが、外挿域での跳ね上がりはほとんど見られない

平均予測(上段)はensembleとMC-dropoutでほぼ同じS字を描く。 ここは完全に一致していると言っていい。ところが分散(下段)の「形」がまるで違う。ensembleの分散はデータのある領域ではほとんどゼロに近いのに、右上の隅——訓練データがほとんど届いていない外挿域——だけ最大0.240まで鋭く跳ね上がっている。一方MC-dropoutの分散は最大でも0.089で、決定境界に沿ってうっすら広がるだけで、外挿域での跳ね上がりはほとんど起きていない。

これを定量化するために、グリッド上の各点について「最寄りの訓練データまでの距離」で近傍(距離<0.3)と遠方に分けて、分散の平均を比べてみた。

  • 近傍(データがある場所): ensemble分散の平均 0.00275 / MC-dropout分散の平均 0.00888
  • 遠方(外挿域): ensemble分散の平均 0.03027 / MC-dropout分散の平均 0.00974
  • 遠方/近傍の比: ensembleは11.0倍に増えるが、MC-dropoutは1.10倍しか増えない

ensembleは「見たことのない場所」ではメンバー同士がまるで違う予測をする(独立に初期化・独立に学習しているので当然と言えば当然)のに対し、MC-dropoutは所詮同じ重み行列の一部を隠しているだけなので、外挿域でもベースの関数の形からそれほど逸脱できない。アンサンブルの不確実性の多くは「データがない場所での意見の食い違い」から来ているのに、MC-dropoutはそこをほとんど再現できていない。

点ごとの相関: 全体でPearson r=0.13、近傍だけならさらに弱い

グリッド4900点それぞれの分散を、ensemble側とMC-dropout側で散布図にして相関係数を計算した。

explicit ensembleの分散(横軸)とMC-dropoutの分散(縦軸)の散布図。点の色は最寄りの訓練データまでの距離を表し、色が濃い(遠い)点ほど横軸方向に大きく伸びている。全体の相関はPearson r=0.132、Spearman ρ=0.612で、近傍だけに絞るとr=0.022とほぼ無相関になり、遠方に限るとr=0.206とやや強まる

  • 全4900点: Pearson r = 0.13Spearman ρ = 0.61
  • 近傍(データがある場所)だけ: r = 0.02(ほぼ無相関)
  • 遠方(外挿域)だけ: r = 0.21(弱いながらやや持ち直す)

Pearsonの0.13という数字だけ見ると「ほとんど無関係」に見えるが、Spearman(順位相関)は0.61とそれなりに高い。これは、外挿域のほんの一部の点でensembleの分散が突出して大きくなり(最大0.240)、その少数の極端な点が線形相関を押し下げている一方で、「分散が大きい点/小さい点」という大まかな順位はそれなりに一致しているということだ。「完全に別物」でもなければ「よく言われる通りぴったり一致」でもない、というのが実測した実感に近い。

メンバーごとの予測を並べると、質感がそもそも違う

分散という要約統計だけでなく、ensembleの10メンバー・MC-dropoutの10パスそれぞれの予測ヒートマップを1枚ずつ切り替えるGIFも作ってみた。

ensembleの10メンバーとMC-dropoutの10パスの予測ヒートマップを1枚ずつ切り替えるアニメーション。ensembleメンバーは毎回はっきりした境界線を持つ別々の決定境界(位置や角度が少しずつ違う)を見せるのに対し、MC-dropoutのパスは決定境界の大まかな位置はほぼ同じままで、細かい砂嵐のような斑点ノイズが乗ったり消えたりしているだけに見える

これが個人的には一番腑に落ちた発見だった。ensembleのメンバーは、毎回「別の仮説」を見せてくる(境界の位置や傾きそのものが違う)。MC-dropoutのパスは、毎回ほぼ同じ境界の上に「砂嵐」のようなノイズが乗るだけで、境界そのものが動くことはあまりない。両方とも「予測がばらつく」という現象ではあるけれど、ばらつき方の質感が違う。ensembleの多様性は「複数の異なる仮説」で、MC-dropoutの多様性は「1つの仮説に乗ったノイズ」に近い、と言えそうだ。

おまけ: dropout率を上げれば相関はもっと近づくのか

メインの実験はp=0.5固定だったが、dropout率を変えたら本物のアンサンブルとの相関がどう動くか気になったので、p=0.1〜0.9で同じネットを学習し直し、分散の相関とテスト精度を追ってみた。

  • p=0.1: 相関 r=0.21、精度 0.937
  • p=0.2: 相関 r=0.23、精度 0.930
  • p=0.3: 相関 r=0.23、精度 0.923
  • p=0.5: 相関 r=0.17、精度 0.923
  • p=0.7: 相関 r=-0.03、精度 0.920
  • p=0.9: 相関 r=-0.05、精度 0.853

先に細かい注を1つ。この表のp=0.5の相関がr=0.17と、メイン実験のr=0.13から少しずれているのは、スイープでは各dropout率ごとにネットワークを別の乱数seedで初期化して学習し直しているからだ(メイン実験のネットの使い回しではない)。つまり同じp=0.5でも、重みの初期値が違うだけで相関は0.13→0.17と動く。この分散相関という数字自体がその程度にはぶれるものだと分かったので、以下は厳密な値というより傾向として読んでほしい。

意外だったのは、相関が一番高いのはメインで使ったp=0.5ではなく、p=0.2〜0.3付近だったこと(それでもr=0.23程度で「強い相関」には遠い)。そしてp=0.7を超えると相関はほぼゼロ、むしろ弱いマイナスにまで落ちる。dropout率を上げるほどネットワークの「不確実性表現」が豊かになってensembleに近づく、という単純な話では全くなかった。精度への悪影響もp=0.9で急に大きく出ている(0.853)。dropout率は「多ければ多いほどアンサンブルらしくなる」ノブではなく、どこかに(今回で言えばp=0.2前後の)ゆるいピークがあって、そこを超えると精度も相関も両方犠牲になる、というのが実測して分かったことだった。

手を動かして意外だったこと

一番驚いたのは、「精度」で見る限り2つの手法はほとんど区別がつかないという点だった。もし今回テスト精度だけを報告する記事だったら、「dropoutは確かにアンサンブル並みに機能する」ときれいにまとめて終わっていたと思う。でも予測の中身(点ごとの分散の構造)まで見ると、ズレはむしろはっきりしていた。特に「訓練データから離れた場所でどれだけ不安になれるか」という一点において、explicit ensembleとMC-dropoutは11倍もの差があった。これは過学習と正則化の記事で見た「データが少ないところほど強い制約が必要」という話とも重なる。dropoutという1つの制約(正則化)の中に押し込められたネットワークは、独立に育った10個のネットワークほど自由に「知らないものを知らないと言う」ことができない、ということなのだと思う。

精度という1つの数字が一致していても、その内側で起きていることが同じとは限らない——GANの記事で見た「識別器を騙せたことと本物の分布を再現できたことはイコールではない」という話ともどこか似ている。表側の指標が揃っているときほど、中身を覗く価値があるのかもしれない。

まとめ

  • two moonsデータに対し、隠れ8ユニットのMLP×10(330パラメータ)の explicit ensemble と、隠れ80ユニット1個(321パラメータ、ほぼ同じ予算)をdropout(p=0.5)で学習しMC-dropoutで評価したモデルを比較した
  • テスト精度はほぼ互角(ensemble 0.927 vs MC-dropout 0.930、dropout切った通常forwardも0.927)。「精度」だけ見ればdropoutはアンサンブル並みに機能する
  • 点ごとの予測分散(不確実性)の相関はPearson r=0.13、Spearman ρ=0.61と弱い。特に訓練データ近傍だけに絞ると r=0.02 とほぼ無相関になる
  • ズレの正体は外挿域(データが疎な場所): ensembleの分散はデータ近傍と比べて外挿域で11.0倍に跳ね上がるのに、MC-dropoutは1.10倍しか増えない。同じ重みの一部を隠しているだけのMC-dropoutは、「知らないものを知らないと言う」力がensembleより弱い
  • 個々のメンバー/パスを見比べると、ensembleは毎回「別の決定境界(仮説)」を見せるのに対し、MC-dropoutは同じ境界の上に「ノイズ」が乗るだけ——多様性の質感自体が違う
  • dropout率を0.1〜0.9でスイープすると、ensembleとの分散相関はp=0.2〜0.3付近でゆるいピーク(r≈0.23)を迎え、p=0.7以降はほぼゼロ〜マイナスに落ちる。精度もp=0.9で大きく悪化(0.853)し、「dropout率は高いほどアンサンブルに近づく」わけではなかった