2017-02-23 24 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