テンソルフローでドロップアウトがこのように機能する理由を理解できません。 CS231n のブログには、"dropout is implemented by only keeping a neuron active with some probability p (a hyperparameter), or setting it to zero otherwise."
と書かれています。また、これはpicture(同じサイトから取得)からも見ることができます
テンソルフローサイトから、With probability keep_prob, outputs the input element scaled up by 1 / keep_prob, otherwise outputs 0.
では、なぜ入力要素が1/keep_prob
だけ拡大されるのでしょうか?入力要素をそのままの状態で保持し、1/keep_prob
でスケーリングしないのはなぜですか?
このスケーリングにより、トレーニング(_keep_prob < 1.0
_を使用)および評価(_keep_prob == 1.0
_を使用)に同じネットワークを使用できます。 ドロップアウト紙 から:
アイデアは、テスト時にドロップアウトなしで単一のニューラルネットを使用することです。このネットワークの重みは、トレーニングされた重みの縮小バージョンです。トレーニング中にユニットが確率pで保持される場合、そのユニットの出力ウェイトにp図2に示すテスト時。
TensorFlow実装は、opsを追加してテスト時に_keep_prob
_で重みを縮小するのではなく、opを追加してトレーニング時に_1. / keep_prob
_で重みを拡大します。パフォーマンスへの影響は無視でき、コードは単純です(同じグラフを使用し、_keep_prob
_を tf.placeholder()
として扱います。ネットワークをトレーニングしているか評価しているか)。
ネットワークにn
ニューロンがあり、ドロップアウト率1/2
を適用したとしましょう
トレーニングフェーズ、n/2
ニューロンが残ります。したがって、すべてのニューロンでx
の出力を期待している場合、x/2
にアクセスできます。したがって、すべてのバッチについて、ネットワークの重みはこのx/2に従って訓練されます
テスト/推論/検証フェーズ、ドロップアウトを適用しないため、出力はxです。したがって、この場合、出力はx/2ではなくxになり、誤った結果が得られます。そのため、テスト中にx/2にスケーリングすることができます。
上記のテスト段階に固有のスケーリングではなく。 Tensorflowのドロップアウトレイヤーが行うことは、ドロップアウトの有無にかかわらず(トレーニングまたはテスト)、合計が一定になるように出力をスケーリングすることです。
cs231n を読み続けると、dropoutとinverted dropoutについて説明します。
テスト時にフォワードパスをそのままにしておきたい(そしてトレーニング中にネットワークを微調整する)ので、tf.nn.dropout
は、値をスケーリングするinverted dropoutを直接実装します。