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

Posted

技术标签:

【中文标题】张量流图中的梯度是不是计算不正确?【英文标题】:Is gradient in the tensorflow's graph calculated incorrectly?张量流图中的梯度是否计算不正确? 【发布时间】:2017-11-04 15:53:31 【问题描述】:

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 中可视化,如下所示:

问题是,为什么“添加”节点与渐变相连?我认为既然我试图最小化 y,那么“Square”节点应该是。这是一个错误吗?谁能解释一下?

【问题讨论】:

【参考方案1】:

不涉及任何错误。您只需要了解什么是梯度并知道如何自己计算。所以(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 来计算梯度。这就是你在图中看到的:

【讨论】:

非常酷的例子!终于可以理解所谓的symbolic渐变了!非常感谢! @Jie.Zhou 是的,我认为这是一个很好的问题,它揭示了许多重要的主题:1)图形是如何构建的,2)梯度是如何在数学中计算的,以及如何计算适用于TF 这是否允许获取我无法手动计算的梯度/粗麻布的表达式?

以上是关于张量流图中的梯度是不是计算不正确?的主要内容,如果未能解决你的问题,请参考以下文章

如何解决权重矩阵维度较大的张量流梯度问题?

用在张量流中具有变量依赖性的自定义操作替换图中的节点

理解 pytorch 中的雅可比张量梯度

当目标不是单热时,如何计算 Pytorch 中 2 个张量之间的正确交叉熵?

张量流中的条件图和访问张量大小的for循环

如何计算张量流模型中可训练参数的总数?