在PyTorch中,当一个张量中的一个元素被用于计算该张量中的另一个元素时,如何计算该元素的梯度?

3
在这个 PyTorch 代码中:
import torch
a = torch.tensor([2.], requires_grad=True)
y = torch.zeros((10))
gt = torch.zeros((10))

y[0] = a
y[1] = y[0] * 2
y.retain_grad()

loss = torch.sum((y-gt) ** 2)
loss.backward()
print(y.grad)

我希望y[0]的梯度由两部分组成:

  1. 向后传播损失到y[0]本身。
  2. y[0]被用于计算y[1],因此它应该具有y[1]梯度的一部分。

但是当我运行这段代码时,y[0]的梯度中只有第一部分。

那么如何使y[0]的梯度包含这两个部分呢?

编辑:输出为:

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

但我期望:

tensor([20., 8., 0., 0., 0., 0., 0., 0., 0., 0.])

我是一个初学者 - 你好 @Shai @Decarbonized formaldehyde - a.grad = (y[0] - 0) ^ + (y[1] - 0)^2 这个怎么样? - undefined
1个回答

2

y[0]y[1]是两个不同的元素,因此它们具有不同的grad。唯一将它们"绑定"在一起的是它们与a之间的基础关系。如果您检查agrad,您会看到:

print(a.grad)
tensor([20.])
也就是说,梯度的两个部分在 a.grad 中合并。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,