【问题标题】:What does compute_gradients return in tensorflowtensorflow中的compute_gradients返回什么
【发布时间】:2017-12-12 10:03:41
【问题描述】:
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?

【问题讨论】:

    标签: python-3.x tensorflow deep-learning gradient


    【解决方案1】:

    compute_gradients(a,b) 返回 d[ sum a ]/db。因此,在您的情况下,这将返回 d mean_sq / d theta,其中 theta 是所有变量的集合。这个等式中没有“dx”,你没有计算梯度wrt。输入。那么批量维度会发生什么?你自己在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 在数学意义上更像是“反向传播”而不是真正的梯度 - 这意味着它依赖于图形依赖关系并且不识别“相反”方向的依赖关系。

    【讨论】:

    • 谢谢,你解释的很好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-23
    • 2023-03-14
    • 2020-08-04
    • 2018-05-21
    • 2017-05-09
    • 2021-10-22
    • 1970-01-01
    相关资源
    最近更新 更多