Tensorflow 2.0 中的梯度计算
Gradient computations in Tensorflow 2.0
这是我在 Tensorflow 2.0 中的示例:
import tensorflow as tf
w = tf.Variable([[1.0]])
with tf.GradientTape() as tape_1:
loss_1 = w * w
with tf.GradientTape() as tape_2:
loss_2 = w * w * w
grad_1 = tape_1.gradient(loss_1, w)
grad_2 = tape_2.gradient(loss_2, w)
print(grad_1)
print(grad_2)
它returns:
tf.Tensor([[2.]], shape=(1, 1), dtype=float32)
tf.Tensor([[3.]], shape=(1, 1), dtype=float32)
以上是正确的系数,但是grad_2
应该也说明我们有3w^2。如何检索 w^2
部分?
梯度结果不是这个意思。如果你采用你的函数,f(w) = w2 和 g(w) = w3,它们各自关于 w 的导数函数将会
f'(w) = 2w 和 g'(w) = 3w2。梯度函数给你的是这些函数对于w的当前值的值。所以,由于 w 被初始化为 1,它给你 f'(1) = 2 和 g'(1) = 3。TensorFlow 可以在某种程度上计算符号导数函数,但是作为 TensorFlow 操作的序列,所以从中提取一个好的数学表达式并不简单。并且随着急切的执行,正如你所使用的,它甚至不可用,必要时执行操作并丢弃中间体。
这是我在 Tensorflow 2.0 中的示例:
import tensorflow as tf
w = tf.Variable([[1.0]])
with tf.GradientTape() as tape_1:
loss_1 = w * w
with tf.GradientTape() as tape_2:
loss_2 = w * w * w
grad_1 = tape_1.gradient(loss_1, w)
grad_2 = tape_2.gradient(loss_2, w)
print(grad_1)
print(grad_2)
它returns:
tf.Tensor([[2.]], shape=(1, 1), dtype=float32)
tf.Tensor([[3.]], shape=(1, 1), dtype=float32)
以上是正确的系数,但是grad_2
应该也说明我们有3w^2。如何检索 w^2
部分?
梯度结果不是这个意思。如果你采用你的函数,f(w) = w2 和 g(w) = w3,它们各自关于 w 的导数函数将会 f'(w) = 2w 和 g'(w) = 3w2。梯度函数给你的是这些函数对于w的当前值的值。所以,由于 w 被初始化为 1,它给你 f'(1) = 2 和 g'(1) = 3。TensorFlow 可以在某种程度上计算符号导数函数,但是作为 TensorFlow 操作的序列,所以从中提取一个好的数学表达式并不简单。并且随着急切的执行,正如你所使用的,它甚至不可用,必要时执行操作并丢弃中间体。