Tensorflow是否正确计算了这些偏导数/梯度?

Tensorflow是否正确计算了这些偏导数/梯度?,tensorflow,Tensorflow,我刚开始学习Tensorflow,遇到了一个对我来说毫无意义的例子: >>> import tensorflow as tf >>> a=tf.Variable(1.) >>> b=2*a >>> c=a+b >>> g=tf.gradients(c, [a,b]) >>> sess=tf.Session() 2018-09-20 13:50:59.616341: I tensorflow

我刚开始学习Tensorflow,遇到了一个对我来说毫无意义的例子:

>>> import tensorflow as tf
>>> a=tf.Variable(1.)
>>> b=2*a
>>> c=a+b
>>> g=tf.gradients(c, [a,b])
>>> sess=tf.Session()
2018-09-20 13:50:59.616341: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1195] Creating TensorFlow device (/device:GPU:0) -> (device: 0, name: GeForce GTX 1080, pci bus id: 0000:01:00.0, compute capability: 6.1)
2018-09-20 13:50:59.616400: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1195] Creating TensorFlow device (/device:GPU:1) -> (device: 1, name: GeForce GTX 1080, pci bus id: 0000:02:00.0, compute capability: 6.1)
>>> print sess.run(g)
[3.0, 1.0]
由于
c=3a
,我希望第一个部分(相对于a的部分c)是
3.0
。但是,
c=1.5b
,这也是事实,所以我期望二阶偏导数是
1.5
,而不是
1.0

另一方面,如果我执行以下操作:

>>> b = tf.Variable(2.)
>>> a = 0.5*b
>>> c = a+b
>>> g = tf.gradients(c,[a,b])
我得到这个结果:

>>> print sess.run(g)
[1.0, 1.5]
我对这个答案也有类似的问题

另外,在这两种情况下,我会认为我正在寻找关于同一点上同一函数的相同信息,具有相同的约束。我希望得到同样的答案

我是否忘记了一些关于偏导数或代数的真正令人尴尬的事情?或者,我是否从根本上误解了我可以从张量流梯度中得到什么


是否与图形构造有关,最终会造成这样一种情况:
b
依赖于
a
,而
a
独立于
b
?或者,真正的问题是梯度应该只针对彼此严格独立的变量吗?

首先,代码和描述中的数字不匹配。。。你有
c=a+b
b=2*a
,因此,对于
a
,你有
c=3*a
,对于
b
c=constant+b
3和
1是这里正确的导数。@jdehesa-但是,如果
b=2a
,那么
a=0.5b
也是正确的,所以
c=1.5b
不像
c=3a
那样合理吗?为什么
=
关系在这里不被视为完全对称的?我明白你的意思,但它不是那样工作的。假设你有
g(x)=x+f(x)
,其中
f(x)=2*x
。导数wrt
x
为3,另一个导数wrt
f(x)
,为1。这里你把
f(x)
“当作”它是一个自变量,导数为1意味着“如果
f(x)
增加
t
,那么
g(x)
将增加
t*1
”。但是
f(x)
增加
t
并不一定意味着
x
增加
t/2
,你可以说现在
f(x)
2*x+t
(因为你把
f(x)
看作是独立的,所以你可以给它赋值)。