从张量流模型开始,我希望能够检索输出相对于权重的梯度。反向传播旨在计算权重的损失梯度,为了在代码中的某处执行此操作,必须计算权重的输出梯度。
但我想知道如何在 API 级别获得这个雅可比行列式,有什么想法吗?
我知道我们可以访问磁带,但我不确定如何处理它,实际上我不需要整个雅可比行列式我只需要能够计算 J^{*} v 的矩阵向量积,其中 J ^{ } 是给定向量的 jacobian 和 va 的转置。
谢谢,问候。
从张量流模型开始,我希望能够检索输出相对于权重的梯度。反向传播旨在计算权重的损失梯度,为了在代码中的某处执行此操作,必须计算权重的输出梯度。
但我想知道如何在 API 级别获得这个雅可比行列式,有什么想法吗?
我知道我们可以访问磁带,但我不确定如何处理它,实际上我不需要整个雅可比行列式我只需要能够计算 J^{*} v 的矩阵向量积,其中 J ^{ } 是给定向量的 jacobian 和 va 的转置。
谢谢,问候。
如果您只需要计算向量雅可比乘积,那么只这样做将比计算完整的雅可比要高效得多。计算 N 个变量的函数的 Jacobian 将花费 O(N) 时间,而向量-Jacobian 乘积需要 O(1) 时间。
那么如何在 TensorFlow 中计算向量雅可比积呢?诀窍是在函数中使用output_gradients
关键字 arg 。gradient
您将 的值设置为output_gradients
向量雅可比积中的向量。让我们看一个例子。
import tensorflow as tf
with tf.GradientTape() as g:
x = tf.constant([1.0, 2.0])
g.watch(x)
y = x*x # y is a length 2 vector
vec = tf.constant([2.0,3.0]) # vector in vector jacobian product
grad = g.gradient(y,x,output_gradients = vec)
print(grad) # prints the vector-jacobian product, [4.,12.]
注意:如果您尝试在没有设置的情况下计算 tensorflow 中向量值(而不是标量)函数的梯度output_gradients
,它会计算向量-雅可比积,其中向量设置为全一。例如,
import tensorflow as tf
with tf.GradientTape() as g:
x = tf.constant([1.0, 2.0])
g.watch(x)
y = x*x # y is a length 2 vector
grad = g.gradient(y,x)
print(grad) # prints the vector-jacobian product with a vector of ones, [2.0,4.0]