python - 为什么 Pytorch autograd 需要另一个向量来向后而不是计算雅可比行列式?

标签 python optimization pytorch backpropagation automatic-differentiation

执行 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/

相关文章:

python - 使用 django 设置 sqlite3 时遇到问题! :/

python - Tensorflow DecodeJPEG : Expected image (JPEG, PNG 或 GIF),以 '\000\000\000\000\000\000\000\00' 开头的格式未知

MySQL - 1 个包含 100 列的大表或拆分为 5 个表并 JOIN

c++ - Eclipse 项目引用 C

python - Pytorch 嵌入 RuntimeError : Expected object of type torch. LongTensor 但发现参数类型 torch.cuda.LongTensor #3 'index'

python - PyTorch ValueError : Target size (torch. Size([64])) 必须与输入大小相同 (torch.Size([15]))

python - banshee:我如何通过 DBus 为 Banshee 上的特定轨道设置评级?

python - 使用 Datashader 从 NumPy 数组绘制数据的最佳方法是什么?

optimization - PostgreSQL 查询优化和 Postmaster 进程'

python - 在 Torch 1.7.1 中模拟 fmin