Я пытаюсь вручную реализовать градиентный спуск в PyTorch как учебное упражнение.У меня есть следующее для создания моего синтетического набора данных:
import torch
torch.manual_seed(0)
N = 100
x = torch.rand(N,1)*5
# Let the following command be the true function
y = 2.3 + 5.1*x
# Get some noisy observations
y_obs = y + 2*torch.randn(N,1)
Затем я создаю свою прогностическую функцию (y_pred
), как показано ниже.
w = torch.randn(1, requires_grad=True)
b = torch.randn(1, requires_grad=True)
y_pred = w*x+b
mse = torch.mean((y_pred-y_obs)**2)
, которая использует MSE для выведения весовw,b
.Я использую блок ниже, чтобы обновить значения в соответствии с градиентом.
gamma = 1e-2
for i in range(100):
w = w - gamma *w.grad
b = b - gamma *b.grad
mse.backward()
Однако цикл работает только в первой итерации. Вторая итерация вперед w.grad
установлена на None
. Я вполне уверен, что причина этого в том, что я устанавливаю w как функцию самого себя (я могу ошибаться).
Вопрос в том, как правильно обновить веса с помощью информации о градиенте?