Ваша проблема в том, что вы не обнуляете градиенты при расчете каждого цикла.Вместо этого, установив retain_graph=True
и не вызывая opt.zero_grad()
на каждом шаге цикла, вы фактически добавляете вычисленные градиенты к ALL вычисленным ранее градиентам.Таким образом, вместо того, чтобы сделать шаг в градиентном спуске, вы делаете шаг в отношении всех накопленных градиентов, что, конечно, НЕ то, что вы хотите.
Вместо этого вы должны обязательно позвонить opt.zero_grad()
в начале вашего цикла и переместите z=x*x
внутри вашего цикла, чтобы вам не нужно было retain_graph
.
Я сделал эти небольшие изменения:
import torch
from torch.autograd import Variable
tns = torch.FloatTensor([3])
x = Variable(tns, requires_grad=True)
opt = torch.optim.Adam([x], lr=.01, betas=(0.5, 0.999))
for i in range(3000):
opt.zero_grad()
z = x*x
z.backward() # Calculate gradients
opt.step()
print(x)
И мой окончательный x
- 1e-25
.