如何在TensorFlow中使用tf.assign计算梯度?

3
假设以下简化代码:
x = tf.Variable(...)
y = tf.Variable(...)  # y can also be some tensor computed from other variables
x_new = tf.assign(x, y)
loss = x_new * x_new

如果我优化损失函数,损失函数的梯度会反向传播到x还是y?
1个回答

3

通常来说,在这个讨论中可以找到一个相当不错的给赋值操作(assign op)的解释。

针对你的具体问题,损失函数的梯度将不会反向传播到 x 或 y:

# Your example.
tf.gradients(x_new * x_new, [x, y]) #output: [None, None]

# Some other related examples.
tf.gradients(x_new * y, [x, y]) #output: [None, x_new_value]
tf.gradients(x * x_new, [x, y]) #output: [x_new_value, None]

谢谢您的解释。但我还是有些困惑。虽然tf.gradients(x_new, [x,y])是[None, None],但x_new和x都指向同一个基础变量/参数(assign op的输出是 ref 类型)。在优化过程中,x和x_new的梯度将累加在一起更新基础参数吗? - x10000year
不,x_new和x指的是不同的事情。虽然x指的是变量,但x_new指的是将x和y作为输入的assign_op。正如推荐的讨论中所述,该操作不会将其梯度反向传播到其输入中。因此,来自x和x_new的梯度不会一起累积。这有意义吗? - Max

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接