为什么Pytorch autograd需要另一个向量来反向而不是计算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用某个损失函数Lw.r.t的梯度更新每个可学习参数的grad。它的设计考虑到了梯度下降[GD](及其变体(。计算出梯度后,可以使用x = x - learning_rate * x.grad更新每个参数。事实上,在后台必须计算雅可比,但在应用GD优化时,这不是(通常(所需要的。向量[0.1, 1.0, 0.0001]可以将输出减少为标量,因此x.grad将是一个向量(如果不减少,则不是矩阵(,因此GD定义良好。然而,您可以使用backward with one hot向量来获得Jacobian。例如,在这种情况下:

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)

最新更新