执行 backward
在 Pytorch 中,我们可以使用可选参数 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 不想给我们雅可比矩阵呢?
最佳答案
当您调用向后()时,PyTorch 更新 grad
每个可学习参数与一些损失函数的梯度 L
w.r.t 到那个参数。它的设计考虑了梯度下降 [GD](及其变体)。计算出梯度后,您可以使用 x = x - learning_rate * x.grad
更新每个参数.实际上,在背景中必须计算雅可比行列式,但这不是应用 GD 优化时(通常)所需要的。矢量 [0.1, 1.0, 0.0001]
允许您将输出减少到标量,以便 x.grad 将是一个向量(而不是矩阵,以防您不减少),因此 GD 是明确定义的。但是,您可以使用单热向量向后获得雅可比行列式。例如,在这种情况下:
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)
关于python - 为什么 Pytorch autograd 需要另一个向量来向后而不是计算雅可比行列式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63816321/