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

问题描述

要在Pytorch中执行backward,我们可以使用可选参数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不想给我们雅可比矩阵呢?

解决方法

当您调用向后()时,PyTorch将每个可学习参数的const arr = [1,2,3],arr2 = [...arr,4],arr3 = [...arr,5]; console.log(arr2); console.log(arr3);加上带有某些损失函数grad w.r.t的梯度到该参数。在设计时考虑了Gradient Descent [GD](及其变体)。计算完梯度后,您可以使用L更新每个参数。确实,在后台必须计算雅可比行列式,但这并不是应用GD优化时通常需要的。向量x = x - learning_rate * x.grad使您可以将输出缩减为一个标量,以便x.grad将成为一个向量(如果您不进行缩减,则不是矩阵),因此GD定义明确。但是,您可以通过向后使用一热向量来获得雅可比行列式。例如,在这种情况下:

[0.1,1.0,0.0001]