元の質問は、特にTensorFlowの実装に関するものでした。ただし、回答は一般的な実装に関するものです。この一般的な答えは、TensorFlowの正しい答えでもあります。
TensorFlowでバッチの正規化とドロップアウトを使用する場合(具体的にはcontrib.layersを使用)、順序について心配する必要がありますか?
ドロップアウトを使用してすぐにバッチの正規化を行うと、問題が発生する可能性があります。たとえば、バッチ正規化のシフトがトレーニング出力のより大きなスケール番号にトレーニングされますが、テスト中にドロップアウトすることなく、より小さなスケール番号(より多くの出力を有するため)に同じシフトが適用される場合、シフトがオフになる場合があります。 TensorFlowバッチ正規化レイヤーはこれを自動的に補正しますか?または、私が行方不明になっている何らかの理由でこれは起こりませんか?
また、これら2つを一緒に使用するときに注意すべき他の落とし穴はありますか?たとえば、上記に関して正しい順序でそれらを使用していると仮定すると(isが正しい順序であると仮定して)、複数の連続するレイヤーでバッチ正規化とドロップアウトの両方を使用するのに問題がありますか?すぐに問題が発生することはありませんが、何かが欠けている可能性があります。
どうもありがとう!
更新:
実験的なテストseems順序付けを示唆するdoes問題。同じネットワークを2回実行し、バッチ標準とドロップアウトのみを逆にしました。ドロップアウトがバッチ標準の前にある場合、トレーニングの損失が減少するにつれて検証の損失が増加するようです。他のケースでは両方ともダウンしています。しかし、私の場合は動きが遅いため、トレーニングを重ねると状況が変わる可能性があります。これは単なるテストです。より決定的で情報に基づいた答えがあれば、まだありがたいです。
Ioffe and Szegedy 2015 で、著者は「すべてのパラメーター値に対して、ネットワークが常に望ましい分布でアクティベーションを生成するようにしたい」と述べています。したがって、バッチ正規化レイヤーは、実際にはConvレイヤー/完全に接続されたレイヤーの直後に挿入されますが、ReLu(またはその他の種類の)アクティベーションにフィードする前に挿入されます。詳細については、53分頃の このビデオ を参照してください。
ドロップアウトに関する限り、ドロップアウトはアクティベーションレイヤーの後に適用されると思います。 ドロップアウトペーパー 図3bでは、隠れ層lのドロップアウト係数/確率行列r(l)がy(l)に適用されます。ここで、y(l)は、アクティベーション関数fを適用した後の結果です。
要約すると、バッチの正規化とドロップアウトを使用する順序は次のとおりです。
-> CONV/FC-> BatchNorm-> ReLu(または他のアクティベーション)->ドロップアウト-> CONV/FC->
コメントに記載されているように、レイヤーの順序を読むための素晴らしいリソースは here です。私はコメントを経て、それは私がインターネットで見つけたトピックに関する最高のリソースです
私の2セント:
ドロップアウトは、特定のニューロンからの情報を完全にブロックして、ニューロンが共適応しないようにすることを目的としています。したがって、バッチの正規化はドロップアウト後に行う必要があります。そうしないと、正規化統計を通じて情報を受け渡します。
考えてみると、典型的なML問題では、これがデータ全体の平均と標準偏差を計算せず、それを訓練、テスト、検証セットに分割しない理由です。トレインセット全体の統計を分割して計算し、それらを使用して検証データセットとテストデータセットを正規化して中央に配置します
だから私はスキーム1をお勧めします(これは pseudomarvin's 受け入れられた答えを考慮に入れます)
-> CONV/FC-> ReLu(または他のアクティベーション)->ドロップアウト-> BatchNorm-> CONV/FC
スキーム2とは対照的に
-> CONV/FC-> BatchNorm-> ReLu(または他のアクティベーション)->ドロップアウト-> CONV/FC->受け入れられた回答
これは、スキーム2のネットワークはスキーム1のネットワークと比較して過剰適合を示すはずですが、OPは問題のようにいくつかのテストを実行し、スキーム2をサポートしていることに注意してください
Dropout
をドロップします(BN
がある場合):Dropout
の必要性を排除し、場合によってはBNはDropoutと同様の正規化の利点を直感的に提供します」Dropout
を使用しないResNet、DenseNetなどのアーキテクチャ詳細については、コメントで@Haramozがすでに述べたように、このペーパー[ 分散シフトによるドロップアウトとバッチ正規化の不一致について ]を参照してください。
研究論文 に基づいて、パフォーマンスを向上させるには、ドロップアウトを適用する前にBNを使用する必要があります
正しい順序は次のとおりです。Conv> Normalization> Activation> Dropout> Pooling