计算张量流梯度

Calculating tensorflow gradients

我对 tensorflow gradient documentation 中计算梯度的示例感到困惑。

a = tf.constant(0.)
b = 2 * a
g = tf.gradients(a + b, [a, b])

with tf.Session() as sess:
    print(sess.run(g))

这给出 [3.0, 1.0]

我觉得我确实遗漏了一些明显的东西,但如果 a 本质上是 0,那么 b,因此 a+b =0。那么关于 a 和 b 的微分零如何给你类似 [3.0, 1.0].

的东西

我相信我在这里误解了 tensorflows structure/syntax。

为了比较,考虑实值函数 f : RR 的一个实数变量,由 f(x) = 10 x 给出。这里,f'(x) = 10,与x的值无关,所以特别f'(0) = 10.

类似地,正如教程中所解释的,或多或少的定义,total derivative of (a, b ) ↦ a + b 对于 b(a) = 2 a是(3, 1),与a.

无关

举一个不那么简单的例子,让我们考虑一下

a = tf.constant(5.)
b = 2 * a
g = tf.gradients(a**3 + 2*b**2, [a, b])

with tf.Session() as sess:
    print(sess.run(g))

这里,关于a的全导数是a的导数↦a³ + 2(2 a)² = a³ + 8 a² 变成 a ↦ 3 a² + 16 a, 而关于 b[ 的导数=53=] 是 a ↦ 4 b(a) = 8 a 。因此,在 a = 5 处,我们期望结果为 (3 · 5² + 16 · 5, 8 · 5) = (155, 40),并且 运行代码正是您所得到的。

文档描述了您编写的符号计算全导数。您有 2 个变量来计算导数:ab。所以对于 a 的导数,函数 a+b = a + 2a = 3a w.r.t a 的导数是 3。对于 ba+b 的导数 w.r.t b 即 1。 tf.constant(0.) 表示您将 a 声明为常量值。如果您将 a 声明为 tf.variable,您可能会想到会发生什么。