Torch.Tensor.backward()如何工作?

时间:2019-06-28 00:04:48

标签: pytorch gradient torch

我最近研究了Pytorch和程序包的向后功能。 我知道如何使用它,但是当我尝试

x = Variable(2*torch.ones(2, 2), requires_grad=True)
x.backward(x)
print(x.grad)

我希望

tensor([[1., 1.],
        [1., 1.]])

因为它是一个身份函数。但是,它返回

tensor([[2., 2.],
        [2., 2.]]).

为什么会这样?

2 个答案:

答案 0 :(得分:0)

实际上,这就是您要寻找的:

情况1:当z = 2 * x ** 3 + x

import torch
from torch.autograd import Variable
x = Variable(2*torch.ones(2, 2), requires_grad=True)
z = x*x*x*2+x
z.backward(torch.ones_like(z))
print(x.grad)

输出:

tensor([[25., 25.],
        [25., 25.]])

情况2:当z = x * x

x = Variable(2*torch.ones(2, 2), requires_grad=True)
z = x*x
z.backward(torch.ones_like(z))
print(x.grad)

输出:

tensor([[4., 4.],
        [4., 4.]])

案例3:当z = x(您的情况)

x = Variable(2*torch.ones(2, 2), requires_grad=True)
z = x
z.backward(torch.ones_like(z))
print(x.grad)

输出:

tensor([[1., 1.],
        [1., 1.]])

要了解更多有关如何在pytorch中计算梯度的信息,请选中this

答案 1 :(得分:0)

我认为您误解了如何使用tensor.backward()backward()中的参数不是dy / dx的x。

例如,如果通过某种操作从x获得y,则y.backward(w),首先pytorch将获得l = dot(y,w),然后计算dl/dx。 因此,对于您的代码,l = 2x首先由pytorch计算,然后dl/dx是您的代码返回的内容。

当您执行y.backward(w)时,如果y不是标量,只需使backward()的参数全为1。否则就没有参数。