张量流图中的梯度是否计算不正确?
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
来计算梯度。这就是您在图表中看到的:
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
来计算梯度。这就是您在图表中看到的: