2016-10-08 7 views
3

私はTensorflowで書かれた非常に単純なNNスクリプトを持っていますが、いくつかの「ランダム性」がどこから来ているのかを調べるのは苦労しています。テンソルフロー勾配の決定の決定性?

私が訓練し、そして最初の反復のために、すべてが始まることは明らかであるように私は

  • ウェイト、
  • グラデーション、
  • Logits私のネットワークの

を記録しています同じものを外す。私は、データの読み込み方法とネットの重みを初期化するためのSEED値の両方のSEED値を持っています。私は決して変化しません。

私の問題は、すべての再実行の2回目の繰り返しで、私はの勾配が発散する(少しずつ、例えば1e-6程度のように)見えることです。しかし、時間が経つと、これはもちろん反復不可能な振る舞いにつながります。

これは何故ですか?私は、中にシングルスレッドで、あなたはCPU(export CUDA_VISIBLE_DEVICES=)にネットワークを実行する場合は、確定的な結果を得ることができる良いチャンスがあります...ランダムのいずれかの可能なソースから来るかもしれない場所を知る

おかげ

+0

GPUを使用していますか? GPUのさまざまなオペレーションは、CUDAアトミック(tf.reduce_sumなど)の使用により非決定的です –

+0

また、非決定的な結果をもたらすいくつかのSSE最適化があります。最適化せずにTensorFlowをコンパイルしてみることもできますケース(詳細 - http://blog.nag.com/2011/02/wandering-precision.html) –

+0

こんにちは@YaroslavBulatovはい、私は確かにGPUを使用しています。 – Spacey

答えて

5

いけません固有のスレッドプール(tf.Session(config=tf.ConfigProto(intra_op_parallelism_threads=1))、1つのPythonスレッド(のようなopsから得られるマルチスレッドキューランナーはありません)、1つの明確な操作命令また、inter_op_parallelism_threads=1を使用すると、いくつかのシナリオで役立つ場合があります。

浮動小数点の加算/乗算は非連想であるため、決定論的な結果を得るには、整数算術または量子化された値を使用することが愚かな方法です。

これを除いて、どの操作が非決定的であるかを特定して、その操作を使用しないようにすることができます。たとえば、tf.add_n opがあります。これは値を合計する順序については何も言いませんが、異なる注文によって異なる結果が生成されます。

決定論的な結果を得ることは、決定論がパフォーマンスと矛盾し、パフォーマンスが通常より重要視されるため、ややこしい戦いです。アルゴリズムが安定していれば、正確なパラメータ値がわずかに異なるかもしれないが、再現性のある結果(つまり、誤った分類数)を返すだろう

+0

(1/2 )ありがとうYaroslav、カップルのこと:1)ただし、TFにCPUを使用させる簡単な方法はありますか? (私はおそらく(エクスポートCUDA_VISIBLE_DEVICES =))にいくぶん展開?それを逐語的にコマンドラインに入力すべきですか?2)整数/浮動小数点値に関して、私ができる1つの実験は、今のところtf.float32の代わりに、すべてのパラメータ(および関連する値)をtf.int16に変更することです整数演算は浮動小数点の問題を強調しないので、再現性を得ることができますか? – Spacey

+0

(2/2)再現性に関して、はい、私は底に達することを試みているバグのためにこれを得ようとしました。基本的には、私のトレーニングが進むにつれて、私の(データ)損失は非常に高い値(時にはNaN)にまで爆発します。しかしこれは、(データ)損失が極端に低い値に達したときに起きるように見えるだけです。時にはネットが回復することもありますが、時にはそうではないので、実際はこれが主な問題です。 : - 私はすべてのTF関数を使用していますが、奇妙なのはグラフです(https://www.tensorflow.org/versions/r0.11/tutorials/deep_cnn/index.html)のスケルトン版でもあります。 – Spacey

+0

「損失の爆発」は一般的な現象であり、確率的勾配降下の特性です。一般的な解決法は、学習率を下げること、および/または正則化を加えることである。 –