python-3.x – compute_gradients在tensorflow中返回什么

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值返回sum(dy / dx),并在apply_gradients函数中更新渐变,例如:
theta< – theta – LEARNING_RATE * 1 / m *渐变? 或者它是否已经返回给定批次中每个x值求和的梯度平均值,例如sum(dy / dx)* 1 / m,m定义为batch_size?

最佳答案 compute_gradients(a,b)返回d [sum a] / db.所以在你的情况下,这将返回d mean_sq / d theta,其中theta是所有变量的集合.在这个等式中没有“dx”,你没有计算渐变.投入.那么批量维度会发生什么?您可以在mean_sq的定义中自行删除它:

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

因此(为了简单起见,我假设y是1D)

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)

对于Adam来说,你使用这个等式当然更复杂.

但请注意,在数学意义上,tf.gradients更像是“backprop”而不是真正的渐变 – 这意味着它依赖于图形依赖性并且不识别处于“相反”方向的依赖性.

点赞