【问题标题】:pytorch: compute vector-Jacobian product for vector functionpytorch:计算向量函数的向量-雅可比积
【发布时间】:2021-01-23 09:14:29
【问题描述】:

美好的一天!

我正在尝试掌握 torch.autograd 的基础知识。特别是我想从https://pytorch.org/tutorials/beginner/blitz/autograd_tutorial.html#sphx-glr-beginner-blitz-autograd-tutorial-py测试这个语句



所以我的想法是构造一个向量函数,比如说:

(y_1; y_2; y_3) = (x_1*x_1 + x_2; x_2 * x_2 + x_3; x_3 * x_3)

然后计算点 (1,1,1) 处的雅可比矩阵,并将其与向量 (3, 5, 7) 相乘。

雅可比 = (2x_1; 1. ; 0. ) (0. ; 2x_2 ; 1. ) (0. ; 0. ; 2x_3)

我期待结果 Jacobian(x=(1,1,1)) * v = (6+5, 10 + 7, 2 * 7) = (11, 17, 14)。

下面是我在 pytorch 中的尝试:

import torch

x = torch.ones(3, requires_grad=True)
print(x)

y = torch.tensor([x[0]**2 + x [1], x[1]**2 + x[2], x[2]**2], requires_grad=True)
print(y)

v = torch.tensor([3, 5, 7])

y.backward(v)
x.grad

没有给出预期的结果(2., 2., 1.)。我认为我以错误的方式定义了张量 y。如果我简单地做 y = x * 2,那么梯度会起作用,但是在这种情况下创建更复杂的张量呢?

谢谢。

【问题讨论】:

    标签: python pytorch


    【解决方案1】:

    你不应该用torch.tensor()定义张量,torch.tensor()是张量构造函数,不是算子,所以在操作图中是不可追踪的。你应该改用torch.stack()

    只需将该行更改为:

    y = torch.stack((x[0]**2+x[1], x[1]**2+x[2], x[2]**2))
    

    x.grad 的结果应该是tensor([ 6., 13., 19.])

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-28
      • 1970-01-01
      • 2010-09-19
      • 1970-01-01
      • 1970-01-01
      • 2023-01-20
      • 2021-11-24
      • 2017-02-08
      相关资源
      最近更新 更多