为什么 Pytorch autograd 需要另一个向量来向后而不是计算 Jacobian?

Why Pytorch autograd need another vector to backward instead of computing Jacobian?

要在 Pytorch 中执行 backward,我们可以使用可选参数 y.backward(v) 来计算雅可比矩阵乘以 v:

x = torch.randn(3, requires_grad=True)
y = x * 2

v = torch.tensor([0.1, 1.0, 0.0001], dtype=torch.float)
y.backward(v)

print(x.grad)

我认为计算雅可比矩阵的成本相同,因为计算雅可比矩阵所需的 AD 图中的每个节点仍然被计算。那么为什么 Pytorch 不想给我们雅可比矩阵呢?

当您调用 backward() 时,PyTorch 将每个可学习参数的 grad 更新为该参数的某些损失函数 L w.r.t 的梯度。它的设计考虑了梯度下降 [GD](及其变体)。计算出梯度后,您可以使用 x = x - learning_rate * x.grad 更新每个参数。实际上,在后台必须计算雅可比行列式,但在应用 GD 优化时,它并不是(通常)需要的。向量 [0.1, 1.0, 0.0001] 允许您将输出减少为标量,这样 x.grad 将是一个向量(而不是矩阵,以防您不减少),因此 GD 定义明确。但是,您可以向后使用 one-hot 向量来获得雅可比行列式。例如,在这种情况下:

x = torch.randn(3, requires_grad=True)
y = x * 2
J = torch.zeros(x.shape[0],x.shape[0])
for i in range(x.shape[0]):
    v = torch.tensor([1 if j==i else 0 for j in range(x.shape[0])], dtype=torch.float)
    y.backward(v, retain_graph=True)
    J[:,i] = x.grad
    x.grad.zero_()
print(J)