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
或者它是否已经返回给定批次中每个 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 是一维)
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 来说,你使用的方程当然更复杂。
Note然而,tf.gradients 在数学意义上更像是“反向传播”而不是真正的梯度 - 这意味着它取决于图依赖性并且不识别“相反”方向的依赖性。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)