Нахождение коэффициентов многочлена через линейную регрессию с помощью Pytorch - PullRequest
0 голосов
/ 25 февраля 2020

Я на самых ранних этапах обучения Python, Pytorch и нейронных сетей. Я хотел в простом примере, как найти коэффициенты полинома, который будет "1021 *" как можно точнее, в терминах наименьших квадратов, набора "интерполирующих точек". Я попытался повторить следующую модель, где x3 будет х к степени 3. Поэтому я пытаюсь найти коэффициенты линейной модели, линейные по ее коэффициенту. Мы знаем явное решение этой проблемы как решение с максимальным правдоподобием, но я хотел немного поэкспериментировать с Pytorch. Здесь мы делаем крутой градиент спуска для нашего оптимизатора и MSE для потери.

Когда я пытался без инициализации модели классов, конвергенция была намного быстрее, а результат - намного лучше. С этим кодом потери после 10000 итераций по-прежнему составляют около 1. Принимая во внимание отсутствие модели классов и «более уродливый» код, я уже достигал 10 до минус 6, и предполагаемый многочлен был действительно хорошим.

Кроме того, в этом коде, если я ставлю скорость обучения больше 10 на минус 4, она мгновенно расходится в бесконечность. В то время как в моем другом коде 0,01 хорошо.

В чем может быть причина этой потери сходимости? Пожалуйста, извините, если мой код выглядит грубым.

Model

import pdb
import torch
from numpy import *
import matplotlib
from pylab import *
import torch.nn.functional as F
from torchsummary import summary

inputs = []
labels = []
N = 6 # Number of sampling points
deg = 4 # Degree of our model polynomial

def truef(x): # True polynomial on which the data is based
   return sin(x)
   # return truef(x)

for x in np.linspace(2,5,N): # Create the sample inputs and their labels
   # y = np.random.randn()
    y = truef(x)
    s = []
    for i in np.arange(deg):
        s.append(x**(deg-i))

    inputs.append(s)
    labels.append([y])

class Net(torch.nn.Module): # Initiate the network
    def __init__(self):
        super(Net,self).__init__()
        self.fc1 = torch.nn.Linear(deg,1)

    def forward(self,x):
        x = self.fc1(x)
        return x

model = Net()
criterion = torch.nn.MSELoss(reduction='sum')
optimizer = torch.optim.SGD(model.parameters(),lr=10**(-6))


y_data = torch.tensor(labels,requires_grad=False)
x_data = torch.tensor(inputs,requires_grad=False)


scatter(np.linspace(2,5,N),y_data)


for epoch in range(1000):
    y_pred = model(x_data)
    loss = criterion(y_pred,y_data)
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()
    print(f'{loss}')


def predf(x):
    s = 0
    N = len(model.fc1.weight.tolist()[0])
    for i in np.arange(deg):
        s = s + model.fc1.weight.tolist()[0][i]*x**(deg-i)

    return s+model.fc1.bias.item()

plot(np.linspace(1.9,5.1,100),predf(np.linspace(1.9,5.1,100)))
plot(np.linspace(1.9,5.1,100),truef(np.linspace(1.9,5.1,100)))

Estimated function in orange

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...