web-dev-qa-db-ja.com

テンソルフローのtf.nn.dropoutで入力がスケーリングされるのはなぜですか?

テンソルフローでドロップアウトがこのように機能する理由を理解できません。 CS231n のブログには、"dropout is implemented by only keeping a neuron active with some probability p (a hyperparameter), or setting it to zero otherwise."と書かれています。また、これはpicture(同じサイトから取得)からも見ることができます enter image description here

テンソルフローサイトから、With probability keep_prob, outputs the input element scaled up by 1 / keep_prob, otherwise outputs 0.

では、なぜ入力要素が1/keep_probだけ拡大されるのでしょうか?入力要素をそのままの状態で保持し、1/keep_probでスケーリングしないのはなぜですか?

33
Shubhashis

このスケーリングにより、トレーニング(_keep_prob < 1.0_を使用)および評価(_keep_prob == 1.0_を使用)に同じネットワークを使用できます。 ドロップアウト紙 から:

アイデアは、テスト時にドロップアウトなしで単一のニューラルネットを使用することです。このネットワークの重みは、トレーニングされた重みの縮小バージョンです。トレーニング中にユニットが確率pで保持される場合、そのユニットの出力ウェイトにp図2に示すテスト時。

TensorFlow実装は、opsを追加してテスト時に_keep_prob_で重みを縮小するのではなく、opを追加してトレーニング時に_1. / keep_prob_で重みを拡大します。パフォーマンスへの影響は無視でき、コードは単純です(同じグラフを使用し、_keep_prob_を tf.placeholder() として扱います。ネットワークをトレーニングしているか評価しているか)。

48
mrry

ネットワークにnニューロンがあり、ドロップアウト率1/2を適用したとしましょう

トレーニングフェーズn/2ニューロンが残ります。したがって、すべてのニューロンでxの出力を期待している場合、x/2にアクセスできます。したがって、すべてのバッチについて、ネットワークの重みはこのx/2に従って訓練されます

テスト/推論/検証フェーズ、ドロップアウトを適用しないため、出力はxです。したがって、この場合、出力はx/2ではなくxになり、誤った結果が得られます。そのため、テスト中にx/2にスケーリングすることができます。

上記のテスト段階に固有のスケーリングではなく。 Tensorflowのドロップアウトレイヤーが行うことは、ドロップアウトの有無にかかわらず(トレーニングまたはテスト)、合計が一定になるように出力をスケーリングすることです。

4
Trideep Rath

cs231n を読み続けると、dropoutinverted dropoutについて説明します。

テスト時にフォワードパスをそのままにしておきたい(そしてトレーニング中にネットワークを微調整する)ので、tf.nn.dropoutは、値をスケーリングするinverted dropoutを直接実装します。

0
Tommaso Di Noto