Dropoutとは?
学習時にランダムにノードを選び、出力を0で学習することで正則化を強める働きと、ランダムでサンプリングすることで、1つのネットワークで複数のネットワークを疑似的に作成しており、アンサンブル効果により精度が向上することから、幅広く使用されている手法になります。

(参照 Dropout: A Simple Way to Prevent Neural Networks from Overfitting)
出力を0にする確率pはハイパーパラメータでモデル作成時に設定する必要があります。
また、学習時はpの確率で出力を0にしますが、推論時にそれを行うとアンサンブル効果が得られないので、推論時は全てのノードを使用する代わりに出力にpを掛けてスケールダウンさせて予測結果を算出します。

(参照 Dropout: A Simple Way to Prevent Neural Networks from Overfitting)
BatchNormalizationとは?
Batch Normalizationとは、層が深くなるにつれて各ノードの出力値のスケールがずれる(内部共変量シフトが起きる)ことへの対策として、各ノードの出力をミニバッチ内で正規化を行う処理となります。
以前BatchNormalizationについてまとめました。

ポイントとしては、学習時と推論時で挙動が異なるところで推論時は、学習時のデータのミニバッチの期待値を用いて正規化を行います。
DropoutとBatchNormalizationの位置は?
上記で説明したように、Dropout、BatchNormalizationそれぞれ、学習時と推論時で挙動が変わります。この仕組みのせいでDropoutがBatchNormalizationの処理の前にある場合、予測精度が悪化するということが言われています。

(参照 Understanding the Disharmony between Dropout and Batch Normalization by Variance Shift)
精度が下がる理由として、入力の分散が変わることが挙げられています(分散シフトと論文の中では呼んでいる)。
ドロップアウトは実装では、学習時にランダムに出力を0にしてテスト時にp倍(ドロップする割合)にスケールダウンさせるのではなく、学習時に1/(1-p)倍(0<p<1)の値でスケールアップさせて、テスト時は何も変えずに出力がされるように実装がされています。(pytorchのdropoutの実装参照)
従って学習時の入力xは図の上のように、ベルヌーイ分布に従う確率変数aとドロップさせる割合1/pを掛けた値がBatch Normalizationに入力されます。
しかし、推論時は単純に入力がxとなるため、学習時と推論時でBatch Normalizationに入力される値の分散が変わってしまいます(平均は同じ)
その影響として同じデータに対して学習時と推論時の挙動の違いによる予測精度の違いを確認すると下記のようになるようです。

(参照 Understanding the Disharmony between Dropout and Batch Normalization by Variance Shift)
画像が少し小さいですが、赤青はドロップアウトの有り無しですが、点線と実線の違いが同じデータに対する予測精度の違いのようで、分散シフトの影響で予測精度が悪化していることがわかります。
簡単な実験
Numeraiのデータを使ってDropoutをBatch Normalizationの前に入れた時と後で入れた時で精度が変わるか実験します。
Numeraiのデータは、匿名化された株価データで特徴量が310個あり、データ数量は約60万件となります。時系列なので、日付が新しい10万件を評価対象として、残りの50万件を学習データとします。
モデルは単純な4層のMLPでBN→Dropout(p=0.3)→FCの場合と、4層目以外Dropout層を除いた場合の比較を行います。
20epochで異なる乱数で30回学習させた時の評価対象の精度の分布が下記となります。

軸ラベルが見にくいですが、縦軸がターゲットとの順位相関で高いほど好ましい指標になります。左半分が予測が難しい期間、右半分が易しい期間で分けています。
また赤がBatch Normalizationの前にDropoutがない場合、紫が置いた場合となります。Dropoutを置いた方が予測精度が良いことがわかります…( ゚Д゚)ナゼ?
ということで、dropする割合をp=0.3→0.6に増やしてアンサンブル効果を上げてみます。

茶色がdropoutを上げた場合の評価結果で、アンサンブル効果?で赤と比較して精度が向上しています。しかし、Batch Normalizationの前にDropoutを入れたモデルと比較すると微妙…という結果です。
今回の対象が金融データで、ノイズが多いことが考えられるため、分散シフトによる精度の悪化よりも、アンサンブル効果による予測精度向上が大きかったのが理由かもしれません。
まとめ
予測精度が上がるかと思いましたが、期待された効果は確認できませんでした。理論とは違って、実際にデータへ適用してみないとわからないことが多いですね。とは言え、推論時の分散シフトが起きる話は勉強になったので、今後モデルを作成する時は気を付けたいと思います。