2017-02-23 10 views
5

TensorFlowランダムシードを同じにしても、私のモデルが訓練されるたびに異なることに気付きました。非決定性勾配計算

私はそれを検証:

  • 初期化が決定的です。最初の更新前にウェイトは同じです。
  • 入力は確定的です。事実、損失を含む様々な順方向計算は、最初のバッチについては全く同じです。
  • 最初のバッチの勾配が異なります。具体的には、tf.gradients(loss, train_variables)の出力を比較しています。 losstrain_variablesの値は同じですが、変数の一部では勾配が、時にはです。違いは非常に重要です(単一の変数の勾配の絶対値の合計が1より大きい場合があります)。

これは、非決定論を引き起こすのは勾配計算であると結論づけます。 私はthis questionを見て、intra_op_parallelism_thread=1inter_op_parallelism_thread=1のCPUで動作させても問題は解決しません。

フォワードパスがない場合、バックワードパスはどのように非決定論的になりますか?どうすればこれをさらにデバッグできますか?

答えて

0

この回答は少しはっきりしているように見えるかもしれませんが、ドロップアウトのような何らかの非決定論的正則化を使用していますか?訓練の際に、ドロップアウトがランダムにいくつかの接続を「ドロップ」すると、勾配にその違いが生じている可能性があります。

編集:同様の質問:

+0

それが事実だった場合、前方の計算は右、あまりにも違うでしょうか?また、(静的な)シードで、どの接続が切断されるのかを判断するべきではありませんか? – Georg

+0

トレーニング中または評価中に前方計算を意味しますか?通常の方法は、検証時にドロップアウトを無効にすることです。あなたのコードでどのように実装されていますか?そして、はい、ランダムシードは、どの接続が落とされるかを判断する必要があります。おそらくあなたは[this](http://stackoverflow.com/a/36289575/3941813)の質問に似た問題を抱えているでしょう。 – jabalazs

+0

私はトレーニング中に前方計算を意味します。私は 'tf.nn.dropout()'を使っていますが、 'keep_prob == 1 'であっても問題は解決しています。私は、グラフの中には一つのグラフしかインスタンス化されていないことも確認しました( 'tf.Graph()'は実際にはコード内で呼び出されません)。 – Georg

関連する問題