PyTorch не сходится при аппроксимации функции квадрата линейной моделью - PullRequest
1 голос
/ 30 апреля 2019

Я пытаюсь изучить некоторый PyTorch и ссылаюсь на это обсуждение здесь

Автор предоставляет минимальный рабочий фрагмент кода, который иллюстрирует, как вы можете использовать PyTorch для поиска неизвестноголинейная функция, которая была загрязнена случайным шумом.

Этот код работает нормально для меня.

Однако, когда я изменяю функцию так, что я хочу t = X ^ 2, параметр непохоже, сходятся.

import torch
import torch.nn as nn
import torch.optim as optim
from torch.autograd import Variable

# Let's make some data for a linear regression.
A = 3.1415926
b = 2.7189351
error = 0.1
N = 100 # number of data points

# Data
X = Variable(torch.randn(N, 1))

# (noisy) Target values that we want to learn.
t = X * X + Variable(torch.randn(N, 1) * error)

# Creating a model, making the optimizer, defining loss
model = nn.Linear(1, 1)
optimizer = optim.SGD(model.parameters(), lr=0.05)
loss_fn = nn.MSELoss()

# Run training
niter = 50
for _ in range(0, niter):
    optimizer.zero_grad()
    predictions = model(X)
    loss = loss_fn(predictions, t)
    loss.backward()
    optimizer.step()

    print("-" * 50)
    print("error = {}".format(loss.data[0]))
    print("learned A = {}".format(list(model.parameters())[0].data[0, 0]))
    print("learned b = {}".format(list(model.parameters())[1].data[0]))

Когда я выполняю этот код, новые параметры A и b кажутся случайными, поэтому он не сходится.Я думаю, что это должно сходиться, потому что вы можете аппроксимировать любую функцию с помощью функции наклона и смещения.Моя теория заключается в том, что я использую PyTorch неправильно.

Может ли кто-нибудь определить проблему с моей t = X * X + Variable(torch.randn(N, 1) * error) строкой кода?

1 Ответ

3 голосов
/ 30 апреля 2019

Вы не можете согласовать полином 2-й степени с линейной функцией.Вы не можете ожидать большего, чем случайный (так как у вас есть случайные выборки из полинома).
Что вы можете сделать, это попробовать и иметь два входа, x и x^2 и подходить из них:

model = nn.Linear(2, 1)  # you have 2 inputs now
X_input = torch.cat((X, X**2), dim=1)  # have 2 inputs per entry
# ...

    predictions = model(X_input)  # 2 inputs -> 1 output
    loss = loss_fn(predictions, t)
    # ...
    # learning t = c*x^2 + a*x + b
    print("learned a = {}".format(list(model.parameters())[0].data[0, 0]))
    print("learned c = {}".format(list(model.parameters())[0].data[0, 1])) 
    print("learned b = {}".format(list(model.parameters())[1].data[0])) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...