2017-07-08 92 views
3
mean_sqr = tf.reduce_mean(tf.pow(y_ - y, 2)) 
optimizer = tf.train.AdamOptimizer(LEARNING_RATE) 
gradients, variables = zip(*optimizer.compute_gradients(mean_sqr)) 
opt = optimizer.apply_gradients(list(zip(gradients, variables))) 

init = tf.global_variables_initializer() 
sess = tf.Session() 
sess.run(init) 

for j in range(TRAINING_EPOCHS): 
    sess.run(opt, feed_dict={x: batch_xs, y_: batch_xs}) 

我不明白compute_gradients返回什麼?它是否返回由batch_xs指定的給定x值的總和(dy/dx),並更新apply_gradients函數中的梯度,如:
theta < - theta - LEARNING_RATE * 1/m * gradients?compute_gradients在張量流中返回什麼

或者它已經返回給定批次中每個x值的總和的梯度平均值,例如sum(dy/dx)* 1/m,m被定義爲batch_size?

回答

1

compute_gradients(a,b)返回d [sum a]/db。所以在你的情況下,這將返回mean_sq/d theta,其中theta是所有變量的集合。在這個等式中沒有「dx」,你不計算梯度wrt。投入。那麼批量維度會發生什麼?你自己刪除它在mean_sq的定義:

mean_sqr = tf.reduce_mean(tf.pow(y_ - y, 2)) 

這樣(我假設y是一維的簡單)

d[ mean_sqr ]/d theta = d[ 1/M SUM_i=1^M (pred(x_i), y_i)^2 ]/d theta 
         = 1/M SUM_i=1^M d[ (pred(x_i), y_i)^2 ]/d theta 

所以你在它是否總結了批量控制,取平均值或者做一些不同的事情,如果你要定義mean_sqr來使用reduce_sum而不是reduce_mean,那麼漸變將會是批次的總和等等。

在另一方面apply_gradients簡單的「應用漸變」,應用精確的規則是優化器依賴,對GradientDescentOptimizer這將是

theta <- theta - learning_rate * gradients(theta) 

對於亞當,你正在使用的公式當然是更復雜。

注意然而,tf.gradients在數學意義上比真實梯度更像是「backprop」 - 意味着它依賴於圖形依賴性,並且不能識別處於「相反」方向的相關性。

+0

謝謝,你解釋得很好。 – user3104352