torch.autograd.functional.jacobian#
- torch.autograd.functional.jacobian(func, inputs, create_graph=False, strict=False, vectorize=False, strategy='reverse-mode')[source]#
计算给定函数的雅可比矩阵。
- 参数
func (function) – 一个 Python 函数,接受 Tensor 输入并返回一个 Tensor 元组或一个 Tensor。
create_graph (bool, optional) – 如果为
True
,则将以可微分的方式计算雅可比矩阵。请注意,当strict
为False
时,结果不能要求梯度或与输入断开连接。默认为False
。strict (bool, optional) – 如果为
True
,当检测到存在某个输入使得所有输出都与该输入无关时,将引发错误。如果为False
,我们将返回一个零张量作为该输入的雅可比矩阵,这是预期的数学值。默认为False
。vectorize (bool, optional) – 此功能为实验性的。如果您正在寻找实验性较低且性能更好的功能,请考虑使用
torch.func.jacrev()
或torch.func.jacfwd()
。在计算雅可比矩阵时,通常我们会为雅可比矩阵的每一行调用一次autograd.grad
。如果此标志为True
,我们将只进行一次autograd.grad
调用,并设置batched_grad=True
,后者使用了 vmap 原型功能。虽然这在许多情况下应该能提高性能,但由于此功能仍处于实验阶段,可能存在性能瓶颈。有关更多信息,请参阅torch.autograd.grad()
的batched_grad
参数。strategy (str, optional) – 设置为
"forward-mode"
或"reverse-mode"
以确定雅可比矩阵是使用前向模式还是后向模式 AD 计算的。目前,"forward-mode"
要求vectorized=True
。默认为"reverse-mode"
。如果func
的输出多于输入,"forward-mode"
通常性能更好。否则,建议使用"reverse-mode"
。
- 返回
如果只有一个输入和输出,这将是一个包含线性化输入和输出雅可比矩阵的单个张量。如果其中一个是元组,则雅可比矩阵将是一个张量元组。如果两者都是元组,则雅可比矩阵将是一个张量元组的元组,其中
Jacobian[i][j]
将包含第i
个输出和第j
个输入的雅可比矩阵,其大小是相应输出和相应输入的连接大小,并且具有与相应输入相同的 dtype 和 device。如果策略是forward-mode
,则 dtype 将是输出的 dtype;否则是输入的 dtype。- 返回类型
雅可比矩阵 (Tensor 或张量嵌套元组)
示例
>>> def exp_reducer(x): ... return x.exp().sum(dim=1) >>> inputs = torch.rand(2, 2) >>> jacobian(exp_reducer, inputs) tensor([[[1.4917, 2.4352], [0.0000, 0.0000]], [[0.0000, 0.0000], [2.4369, 2.3799]]])
>>> jacobian(exp_reducer, inputs, create_graph=True) tensor([[[1.4917, 2.4352], [0.0000, 0.0000]], [[0.0000, 0.0000], [2.4369, 2.3799]]], grad_fn=<ViewBackward>)
>>> def exp_adder(x, y): ... return 2 * x.exp() + 3 * y >>> inputs = (torch.rand(2), torch.rand(2)) >>> jacobian(exp_adder, inputs) (tensor([[2.8052, 0.0000], [0.0000, 3.3963]]), tensor([[3., 0.], [0., 3.]]))
>>> def linear_model(x): ... W = torch.tensor([[2.0, -1.0], [0.0, 1.0]]) ... b = torch.tensor([1.0, 0.5]) ... return x @ W.T + b
>>> x = torch.randn(4, 2, requires_grad=True) >>> jac = jacobian(linear_model, x, vectorize=True) >>> jac.shape torch.Size([4, 2, 4, 2])