Вы используете Tensor.backward
неправильно. Чтобы получить запрошенный результат, вы должны использовать
x = torch.ones(1,requires_grad=True)
y = 2*x
z = y**2
z.backward() # <-- fixed
print(x.grad)
. Вызов z.backward()
вызывает алгоритм обратного распространения, начиная с z
и возвращаясь к каждому конечному узлу в графе вычислений. В этом случае x
является единственным листовым узлом. После вызова z.backward()
граф вычислений сбрасывается, и элемент .grad
каждого конечного узла обновляется с градиентом z
относительно конечного узла (в данном случае dz / dx).
Что на самом деле происходит в вашем оригинальном коде? Что ж, вы сделали, примените обратное распространение, начиная с x
. Без аргументов x.backward()
просто приведет к тому, что для x.grad
будет установлено значение 1
, поскольку dx / dx = 1. Дополнительный аргумент (gradient
) фактически является шкалой, применяемой к результирующему градиенту. В этом случае z=4
, поэтому вы получите x.grad = z * dx/dx = 4 * 1 = 4
. Если вам интересно, вы можете проверить this для получения дополнительной информации о том, что делает аргумент gradient
.