【问题标题】:Gradient computations in Tensorflow 2.0Tensorflow 2.0 中的梯度计算
【发布时间】:2019-11-22 17:10:32
【问题描述】:

这是我在 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)

它返回:

tf.Tensor([[2.]], shape=(1, 1), dtype=float32)
tf.Tensor([[3.]], shape=(1, 1), dtype=float32)

以上是正确的系数,但grad_2 也应该表明我们有 3w^2。如何检索w^2 部分?

【问题讨论】:

    标签: tensorflow derivative gradienttape


    【解决方案1】:

    渐变结果不代表这个意思。如果您采用函数 f(w) = w2 和 g(w) = w3,则它们各自关于 w 的导数函数为 f'(w) = 2w 和 g'(w) = 3w2。梯度函数给你的是这些函数对于当前 w 值的值。因此,由于 w 被初始化为 1,它给你 f'(1) = 2 和 g'(1) = 3。TensorFlow 在某种程度上可以计算符号导数函数,但作为 TensorFlow 操作的序列,所以从中提取一个好的数学表达式并不简单。并且在您使用的急切执行中,它甚至不可用,操作会根据需要执行,中间会被丢弃。

    【讨论】:

    • 放弃导数计算听起来效率低下。它只发生在急切执行中还是总是发生?
    • @user1700890 老实说,我不确定它是如何在急切执行中完成的,在图形模式下,梯度操作被添加到图形中,然后对每个请求进行评估。对于tf.GradientTape,我认为它最初只是跟踪执行的操作,然后当gradients被调用时,它会找到依赖图并一次一步进行反向传播,反复查找梯度梯度注册表,计算它并丢弃之前的中间梯度。
    猜你喜欢
    • 2019-11-16
    • 1970-01-01
    • 2020-03-16
    • 2022-01-04
    • 2020-03-27
    • 1970-01-01
    • 2021-09-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多