Вы должны напечатать ваши градиенты по пути, так будет проще. Я прокомментирую, что происходит в коде:
import torch
w = torch.tensor([2.0, 1.0, 3.0], requires_grad=True)
x = torch.tensor([0.5], requires_grad=True)
y = w[0] * x + w[1]
y.backward()
l = x.grad
l.requires_grad = True
print(w.grad) # [0.5000, 1.0000, 0.0000] as expected
w.grad.zero_()
print(w.grad) # [0., 0., 0.] as you cleared the gradient
z = w[2] * x + l ** 2
z.backward()
print(w.grad) # [0., 0., 0.5] - see below
Last print(w.grad)
работает так, потому что вы используете последний элемент тензора, и это единственное участие в уравнении z
, оно умножается на x
, что 0.5
, следовательно, градиент 0.5
. Вы очистили градиент раньше, выдав w.grad_zero_()
. Я не вижу, как ты мог получить [4., 0., 0.5]
. Если вы не очистите градиент, вы получите: tensor([0.5000, 1.0000, 0.5000])
, первые два из первого y
уравнения, второе и последнее из z
уравнения.