首页 > 解决方案 > 计算权重的输出梯度

问题描述

从张量流模型开始,我希望能够检索输出相对于权重的梯度。反向传播旨在计算权重的损失梯度,为了在代码中的某处执行此操作,必须计算权重的输出梯度。

但我想知道如何在 API 级别获得这个雅可比行列式,有什么想法吗?

我知道我们可以访问磁带,但我不确定如何处理它,实际上我不需要整个雅可比行列式我只需要能够计算 J^{*} v 的矩阵向量积,其中 J ^{ } 是给定向量的 jacobian 和 va 的转置。

谢谢,问候。

标签: tensorflowmachine-learninggradienttensorflow2.0automatic-differentiation

解决方案


如果您只需要计算向量雅可比乘积,那么只这样做将比计算完整的雅可比要高效得多。计算 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]

推荐阅读