如何在PyTorch中获得衍生物的完整雅可比矩阵?

时间:2019-08-06 14:17:03

标签: python pytorch autograd

让我们考虑一个简单的张量x,然后定义另一个依赖于x并具有多个维度的张量:y = (x, 2x, x^2)

如何获得完整的渐变dy/dx = (1,2,x)

例如,让我们获取代码:

import torch
from torch.autograd import grad

x = 2 * torch.ones(1)
x.requires_grad = True
y = torch.cat((x, 2*x, x*x))
# dy_dx = ???

这是我到目前为止未能尝试的内容:

>>> dy_dx = grad(y, x, grad_outputs=torch.ones_like(y), create_graph=True)
(tensor([7.], grad_fn=<AddBackward0>),)
>>> dy_dx = grad(y, x, grad_outputs=torch.Tensor([1,0,0]), create_graph=True)
(tensor([1.], grad_fn=<AddBackward0>),)
>>> dy_dx = grad(y, [x,x,x], grad_outputs=torch.eye(3), create_graph=True)
(tensor([7.], grad_fn=<AddBackward0>),)

每次我只得到渐变的一部分或累积版本...

我知道我可以像第二个表达式一样使用for循环

dy_dx = torch.zeros_like(y)
coord = torch.zeros_like(y)
for i in range (y.size(0)):
    coord[i] = 1
    dy_dx[i], = grad(y, x, grad_outputs=coord, create_graph=True)
    coord[i] = 0

但是,当我处理高维张量时,此for循环可能会花费太多时间来计算。而且,必须有一种方法可以在不累积梯度的情况下执行完整的jacobian ...

有人可以解决吗?还是其他选择?

1 个答案:

答案 0 :(得分:1)

PyTorch中的torch.autograd.grad被汇总。要使向量相对于输入自动区分,请使用torch.autograd.functional.jacobian