我正在尝试计算 TensorFlow 神经网络输出相对于其输入的雅可比行列式。这很容易通过该tf.GradientTape.jacobian
方法实现。TensorFlow 文档中提供的简单示例如下:
with tf.GradientTape() as g:
x = tf.constant([1.0, 2.0])
g.watch(x)
y = x * x
jacobian = g.jacobian(y, x)
如果我只想计算输入张量的单个实例的雅可比行列式,这很好x
。但是,我需要针对x
. 对于非平凡的雅可比计算(例如,对于具有非线性激活函数的深度卷积神经网络),重复重新运行 GradientTape 计算并评估该jacobian
方法是非常昂贵的。我从TensorFlow 文档中知道梯度(以及雅可比行列式)是通过自动微分计算的。我不得不想象在给定的输入下评估网络的分析梯度(通过自动微分计算)有一些内部存储。
我的问题:假设 TensorFlow 构建和存储(至少部分)计算雅可比行列式所需的分析梯度,我是否正确?如果是这样,有没有办法保存这个分析梯度并用新的输入重新评估雅可比矩阵,而不必通过 GradientTape 方法重建它?
“持久的” GradientTape 似乎无法解决这个问题:它只允许针对计算的多个内部参数重复评估单个 GradientTape 实例。