2016-03-01 38 views
12

如果在張量流中mnist上存在一個簡單的小批量梯度下降問題(如在此tutorial中),如何單獨檢索批處理中每個示例的梯度。張量流中每個示例的未聚集的梯度/梯度

tf.gradients()似乎返回批處理中所有示例的平均值的梯度。有沒有辦法在聚合之前檢索漸變?

編輯:邁向這個答案的第一步是確定tensorflow在批處理中的例子上的平均梯度。我認爲這發生在_AggregatedGrads,但似乎並非如此。有任何想法嗎?

+1

這聽起來像你想有一個雅可比,而不是一個梯度。 –

回答

5

tf.gradients返回關於損失的梯度。這意味着如果您的損失是每個示例損失的總和,那麼該梯度也是每個示例損失梯度的總和。

總結是隱含的。例如,如果要將Wx-y錯誤的平方規範的總和最小化,則關於W的梯度是2(WX-Y)X',其中X是觀察的批次,而Y是批次的標籤。你永遠不會明確地形成你後來總結的「每個示例」漸變,所以在漸變流水線中去除某個階段並不是一個簡單的問題。

獲得k每個示例損失梯度的簡單方法是使用批次1和k通過批次。伊恩·古德費洛wrote up如何讓所有k梯度在一個單一的傳球,這個你就需要明確指定梯度,而不是依靠tf.gradients方法

+4

您可以使用tf.gradients來完成大部分工作。假設您需要針對X的每個示例漸變。您可以在X的消費者上調用tf.gradients。例如,假設您有一個變量Z,它乘以某個矩陣W.然後,您需要自己的邏輯來執行per-通過矩陣乘法來區分示例,但是您可以使用tf.gradients來獲得關於Z的導數。 –

+0

謝謝!只是爲了確保我正確理解這一點:這隻會影響後傳播鏈中的第一個矩陣乘法,對嗎?意思是計算MLP中第一層權重的導數將需要實現back prop的幾乎所有步驟。無論如何? – Bas

+0

如果損失是每個示例損失的總和,那麼tf.gradients不計算正確的東西,即每個示例損失梯度的總和。事情是,當「損失」是一個函數,爲每個例子返回一個標量。 –

1

部分地回答我的問題與此擺弄了一會兒之後。看來,它是可以操縱每例如梯度,同時仍然在批量做的工作如下:

  • 創建接受與例如特定因素
  • 額外張/佔位符)tf.gradients的副本(
  • 創建_AggregatedGrads(副本),並添加使用例如特有的因素,一個自定義的聚集方法
  • 調用定製tf.gradients功能,讓你的損失切片的列表:

custagg_gradients( ys=[cross_entropy[i] for i in xrange(batch_size)],
xs=variables.trainable_variables(), aggregation_method=CUSTOM, gradient_factors=gradient_factors )

但是,這可能會有與每個示例單獨傳遞相同的複雜性,並且我需要檢查漸變是否正確:-)。