Почему Pytorch не минимизирует х * х для меня? - PullRequest
0 голосов
/ 29 мая 2018

Я ожидаю, что х сходится к 0, что является минимумом х * х.Но этого не происходит.Что я делаю не так в этом небольшом примере кода:

import torch
from torch.autograd import Variable
tns = torch.FloatTensor([3])
x = Variable(tns, requires_grad=True)
z = x*x
opt = torch.optim.Adam([x], lr=.01, betas=(0.5, 0.999))
for i in range(3000):
    z.backward(retain_graph=True) # Calculate gradients
    opt.step()
    print(x)

1 Ответ

0 голосов
/ 29 мая 2018

Ваша проблема в том, что вы не обнуляете градиенты при расчете каждого цикла.Вместо этого, установив 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.

...