grad() 在 PyTorch 中如何工作?

How does grad() works in PyTorch?

我需要 Pytorch grad() 函数的输入在概念上更加清晰。 请看以下代码:

import torch
a = torch.tensor([2., 3.], requires_grad=True)
b = torch.tensor([6., 4.], requires_grad=True)
Q = 1/3*a**3 - 1/2*b**2

在这里,我定义了 3 个张量,我试图计算 Q w.r.t a 的导数。 下面一行将简单地计算一阶和二阶导数。

Q_a = torch.autograd.grad(Q.sum(), a, create_graph=True)[0]
Q_aa = torch.autograd.grad(Q_a.sum(), a, create_graph=True)[0]
print('Q_a =',Q_a.detach().numpy())
print('Q_aa =',Q_aa.detach().numpy())

输出为:

Q_a = [4. 9.]
Q_aa = [4. 6.]

我想知道,为什么我需要传递 Q.sum()Q_a.sum() 这只是 1 个值,而第二个参数 a 有两个值。

>>> print(Q.sum())
>>> tensor(-14.3333, grad_fn=<SumBackward0>)
>>> print(a)
>>> tensor([2., 3.], requires_grad=True)

谁能给我解释一下 Q.sum() 如何帮助计算正确的梯度。是否可以仅使用 Q 而不是 Q.sum() 来计算导数?

嗯,你的问题是基于错误的假设。你说..

I was trying to compute the derivative of Q w.r.t a

没有。你不是。在您提供的代码示例中,您正在尝试计算 Q.sum() w.r.t a 的导数 - 它们是不同的东西。

Q w.r.t a 的导数”是 矩阵 称为 Jacobian,而 ..

Q.sum() w.r.t a 的导数”是一个 向量,称为 gradient

两者都可以计算出来,用在不同的地方,达到不同的目的。想要哪一个由你决定。