张量流图中的梯度是否计算不正确?

Is gradient in the tensorflow's graph calculated incorrectly?

tensorflow 中的一个非常简单的示例:min (x + 1)^2 其中 x 是一个标量。代码是:

import tensorflow as tf

x = tf.Variable(initial_value=3.0)
add = tf.add(x, 1)
y = tf.square(add)
optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.01)
train = optimizer.minimize(y)

然后将图表写入磁盘:

graph = tf.get_default_graph()
writer = tf.summary.FileWriter("some/dir/to/write/events")
writer.add_graph(graph=graph)

最后在tensorboard中可视化,看起来是这样的:

问题来了,为什么“Add”节点连接的是梯度?我想因为我试图最小化 y,所以“Square”节点应该是。这是一个错误吗?谁能解释一下?

不涉及任何错误。您只需要了解什么是梯度并知道如何自己计算梯度。所以(x+1)^2' = 2*(x+1)。这意味着您不需要计算 (x+1)^2 来计算梯度。如果你放大渐变部分,你会看到它计算了你的正方形的渐变,并计算出它在那里需要图形的哪一部分:

这里有一个更有趣也更直观的例子:

import tensorflow as tf

x = tf.Variable(initial_value=3.0)
y = tf.cos(x)

train = tf.train.GradientDescentOptimizer(learning_rate=0.01).minimize(y)

with tf.Session() as sess:
    writer = tf.summary.FileWriter('logs', sess.graph)
    writer.close()

你应该知道cos(x)' = - sin(x)。这意味着只需要 x 来计算梯度。这就是您在图表中看到的: