4

backward在 Pytorch 中执行,我们可以使用可选参数y.backward(v)来计算 Jacobian 矩阵乘以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 不想给我们雅可比矩阵呢?

4

1 回答 1

3

当您调用backward() PyTorch 更新grad每个可学习参数的某个损失函数Lwrt 到该参数的梯度。它的设计考虑了梯度下降 [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)
于 2020-09-09T19:19:36.250 回答