バッチ正規化とドロップアウトの注文?


116

元々の質問は、特にTensorFlowの実装に関するものでした。ただし、答えは一般的な実装です。この一般的な答えは、TensorFlowの正しい答えでもあります。

TensorFlowでバッチ正規化とドロップアウトを使用する場合(具体的にはcontrib.layersを使用)、順序について心配する必要がありますか?

ドロップアウトを使用してすぐにバッチ正規化を実行すると、問題が発生する可能性があります。たとえば、バッチ正規化のシフトがトレーニング出力のより大きなスケール数にトレーニングするが、テスト中にドロップアウトなしで同じシフトがより小さな(より多くの出力を持つための補正により)スケール数に適用される場合、シフトがオフになっている可能性があります。TensorFlowバッチ正規化レイヤーはこれを自動的に補正しますか?それとも私が行方不明になった何らかの理由でこれは起こりませんか?

また、これら2つを一緒に使用するときに注意すべき他の落とし穴はありますか?たとえば、上記に関して正しい順序で使用していると仮定する(正しい順序がある仮定して)、連続する複数のレイヤーでバッチ正規化とドロップアウトの両方を使用すると問題が発生する可能性がありますか?すぐに問題が発生することはありませんが、何か不足している可能性があります。

どうもありがとうございました!

更新:

実験的なテストでは、と思われる順序がことを示唆して事柄。同じネットワークを2回実行しましたが、バッチノルムとドロップアウトリバースのみを使用しています。ドロップアウトがバッチノルムの前にある場合、トレーニングの損失が減少するにつれて検証の損失が増加するように見えます。他のケースでは、どちらも下がっています。しかし私の場合、動きが遅いので、トレーニングを重ねると状況が変わる可能性があり、それは1つのテストにすぎません。より決定的で情報に基づいた回答をいただければ幸いです。

回答:


143

ヨッフェとSzegedy 2015、「我々は任意のパラメータ値のために、ネットワークは常に所望の分布でアクティベーションを生成することを確実にしたい」という作者の状態。そのため、バッチ正規化レイヤーは、実際にはConvレイヤー/完全接続レイヤーの直後に挿入されますが、ReLu(またはその他の種類の)アクティブ化にフィードする前に挿入されます。詳細については、約53分後にこのビデオを参照してください。

ドロップアウトに関しては、ドロップアウトはアクティベーションレイヤーの後に適用されると思います。ドロップアウト紙 Y(L)は、活性化関数fを適用した後の結果である図3b、隠された層のためのドロップアウト率/確率行列R(L)Lは、Y(L)にそれに適用されます。

要約すると、バッチ正規化とドロップアウトを使用する順序は次のとおりです。

-> CONV / FC-> BatchNorm-> ReLu(または他のアクティベーション)->ドロップアウト-> CONV / FC->


63
現在、Christian Szegedyでさえ、ReLUのに(その前ではなく)BatchNormを実行するのが好きなようです。Kerasの作者であるF. Cholletは次のように述べています。でも議論の的だ」と語った。ソース
pseudomarvin 2017

3
プールについてはどうですか、それはbatchnormとアクティベーションの間に入りますか?
ワードフォーザワイズ

5
また、精度のようなルックスは、活性化後のBNと高いかもしれない:github.com/cvjena/cnn-models/issues/3
wordsforthewise

1
なんとか動画が削除されます!
blitu12345

10
このペーパーは、分散シフトのリスクを回避するために何らかの条件付けが行われない限り、通常BNでの脱落が悪い結果をもたらすことを示しています。
ハラモズ2018

37

コメントで述べたように、レイヤーの順序について読むための素晴らしいリソースがここにあります。私はコメントを調べました、そしてそれは私がインターネットで見つけたトピックに関する最高のリソースです

私の2セント:

ドロップアウトは、特定のニューロンからの情報を完全にブロックして、ニューロンが同時に適応しないようにすることを目的としています。そのため、バッチ正規化はドロップアウト後に行う必要があります。そうしないと、正規化統計を通じて情報が渡されます。

考えてみると、典型的なML問題では、これがデータ全体の平均と標準偏差を計算せずに、それをトレーニング、テスト、および検証セットに分割しない理由です。分割してから一連の統計を使用して統計を計算し、それらを使用して検証とテストのデータセットを正規化して中央に配置します

だから私はスキーム1を提案します(これは受け入れられた回答に関するpseudomarvinのコメントを考慮に入れます)

-> CONV / FC-> ReLu(または他のアクティベーション)->ドロップアウト-> BatchNorm-> CONV / FC

スキーム2とは対照的に

-> CONV / FC-> BatchNorm-> ReLu(または他のアクティベーション)->ドロップアウト-> CONV / FC->受け入れられた回答

これは、スキーム2のネットワークがスキーム1のネットワークと比較して過剰適合を示す必要があることを意味しますが、OPは問題のあるテストを実行し、それらはスキーム2をサポートします。


BatchNormの配置に関する関連のredditの議論:reddit.com/r/MachineLearning/comments/67gonq/...
saetch_g

3
しかし、ドロップアウトが適用された後にそれらを計算するので、これはBN統計を台無しにしませんか?これはテスト時には当てはまりませんか?
ZakJ

@ZakJ私はそうは思いません。ユニットあたりのBNを計算するため(内部機能ごとに)、さらにドロップアウトを補正するためにスケーリングされます。
熱意

@ZakJは正しいです。mohammed adelの回答とこのペーパー(arxiv.org/pdf/1801.05134.pdf)を参照してください。実際には、バッチ正規化レイヤーは、テスト時にドロップアウトがオフになっているときに存在しなくなったデータの共変量シフトを相殺することを学習します。
skeller88

@ skeller88私は論文を読んだことがありません。私の頭の上では、ドロップアウトの前にBNがある場合、BNの機能は次のレイヤーに標準化されたデータを提供することなので、BNレイヤーの意図を本質的に台無しにすると思います。
MiloMinderbinder

12

通常、Dropout(ある場合)をドロップするだけですBN

  • 「BNを使用する必要がなくなるDropout場合があるため、BNはドロップアウトと同様の正則化の利点を直感的に提供します。」
  • 「ResNet、DenseNetなどのアーキテクチャは使用していません。 Dropout

詳細については、@ Haramozがコメントですでに述べたように、この文書[ 分散シフトによるドロップアウトとバッチ正規化の不調和について ]を参照してください。


MLPを組み合わせると便利です。
DINA TAKLIT

1
@DINATAKLITあなたが本当に十分なトレーニングデータを持っていないとき、私の意見では、はい。
xtluo

@xtuloは、いったん小さな日付になると、この作業を意味しますか?バッチの正規化が大きなデータセットでうまく機能することを読んだようです!私は少し混乱しています:!
DINA TAKLIT

1
@DINATAKLIT以前のコメントでwhat about MLPs is it useful to combine them、それはどういう意味Is it useful to combine Dropout and BN when using MLPsですか?これについての私の考えは、それは主にモデルのサイズとあなたが持っている訓練データの量に依存しているということです。
xtluo

@xtuloはい、私はDroupoutとBNを組み合わせることが有用であることを意味します。はい、あなたの最後の答えに同意します。
DINA TAKLIT

6

DropoutとBatch Norm(BN)の不調和について説明した論文を見つけました。重要なアイデアは、彼らが「分散シフト」と呼ぶものです。これは、ドロップアウトの動作がトレーニングフェーズとテストフェーズで異なるため、BNが学習する入力統計がシフトするためです。主な考え方は、この論文から引用したこの図にあります。 ここに画像の説明を入力してください

この効果の小さなデモがこのノートブックにあります。


3
これはどのように質問に答えますか?
nbubis

1
このペーパーは2つの潜在的な戦略を提供します
。-

@nbubis間接的に答えると思います。これらを一緒に使用しないことをお勧めします(「ドロップアウトとバッチノルム(BN)の不一致について説明します」)。
NelsonGon

3

パフォーマンスを向上させるためのリサーチペーパーに基づいて、ドロップアウトを適用する前にBNを使用する必要があります


質問で尋ねられた答えは、完全なスタックに対処していません。
salehinejad


2

Conv-Activation-DropOut-BatchNorm-Pool-> Test_loss:0.04261355847120285

Conv-Activation-DropOut-Pool-BatchNorm-> Test_loss:0.050065308809280396

Conv-Activation-BatchNorm-Pool-DropOut-> Test_loss:0.04911309853196144

Conv-Activation-BatchNorm-DropOut-Pool-> Test_loss:0.06809622049331665

Conv-BatchNorm-Activation-DropOut-Pool-> Test_loss:0.038886815309524536

Conv-BatchNorm-Activation-Pool-DropOut-> Test_loss:0.04126095026731491

Conv-BatchNorm-DropOut-Activation-Pool-> Test_loss:0.05142546817660332

Conv-DropOut-Activation-BatchNorm-Pool-> Test_loss:0.04827788099646568

Conv-DropOut-Activation-Pool-BatchNorm-> Test_loss:0.04722036048769951

Conv-DropOut-BatchNorm-Activation-Pool-> Test_loss:0.03238215297460556


MNISTデータセット(20エポック)で2つの畳み込みモジュール(以下を参照)でトレーニングし、毎回

model.add(Flatten())
model.add(layers.Dense(512, activation="elu"))
model.add(layers.Dense(10, activation="softmax"))

たたみ込み層のカーネルサイズは(3,3)、デフォルトのパディングで、アクティブ化はeluです。プーリングは、プールサイドのMaxPoolingです(2,2)。損失とはcategorical_crossentropy、オプティマイザですadam

対応するドロップアウト確率はそれぞれ0.2または0.3です。特徴マップの量はそれぞれ32または64です。

編集: 一部の回答で推奨されているように、ドロップアウトをドロップすると、収束が速くなりましたが、BatchNorm ドロップアウトを使用する場合よりも一般化能力が劣っていました。


NNの確率論的な性質のため、1つのトレーニングで遊ぶだけでは十分ではありません。約100のトレーニングを行い、平均を取る場合-結果はより正確になります。
GensaGames

0

ConV / FC-BN-シグモイド/タン-ドロップアウト。アクティベーション関数がReluまたはそれ以外の場合、正規化とドロップアウトの順序はタスクによって異なります


0

https://stackoverflow.com/a/40295999/8625228からの回答とコメントで推奨される論文を読んだ

Ioffe and Szegedy(2015)の観点から、ネットワーク構造ではBNのみを使用します。リーら (2018)実施者がBNの前にドロップアウトを使用すると分散シフトがあることを統計的および実験的に分析します。したがって、Li et al。(2018)すべてのBNレイヤーの後にドロップアウトを適用することをお勧めします。

Ioffe and Szegedy(2015)の観点から見ると、BNは 内部/以前にありますアクティベーション機能のあります。しかしながら、Chen等。(2019)ドロップアウトとBNを組み合わせたICレイヤーを使用します。(2019)ReLUの後にBNを使用することをお勧めします。

安全の背景として、私はネットワークでのみドロップアウトまたはBNを使用しています。

Chen、Guangyong、Pengfei Chen、Yujun Shi、Chang-Yu Hsieh、Benben Liao、Shengyu Zhang。2019.「ディープニューラルネットワークのトレーニングにおけるバッチ正規化とドロップアウトの使用法の再考」CoRR abs / 1905.05928。http://arxiv.org/abs/1905.05928

Ioffe、Sergey、およびChristian Szegedy。2015.「バッチ正規化:内部共変量シフトを削減してディープネットワークトレーニングを加速する。」CoRR abs / 1502.03167。http://arxiv.org/abs/1502.03167

Li、Xiang、Shuo Chen、Xiaolin Hu、Jian Yang。2018.「分散シフトによるドロップアウトとバッチ正規化の不調和について」CoRR abs / 1801.05134。http://arxiv.org/abs/1801.05134

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.