我刚刚开始学习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]
这个答案我也有类似的问题。
此外,在这两种情况下,我想我正在同一点寻找具有相同约束的相同功能的相同信息。我希望得到同样的答案。
我忘记了偏导数或代数的真正尴尬之处吗?还是我从根本上误解了Tensorflow梯度中的期望值?
图的构造是否最终导致b
依赖于a
,但是a
却独立于b
的情况?还是真正的问题是,仅应对严格彼此独立的变量进行渐变?