Я на самых ранних этапах обучения Python, Pytorch и нейронных сетей. Я хотел в простом примере, как найти коэффициенты полинома, который будет "1021 *" как можно точнее, в терминах наименьших квадратов, набора "интерполирующих точек". Я попытался повторить следующую модель, где x3
будет х к степени 3. Поэтому я пытаюсь найти коэффициенты линейной модели, линейные по ее коэффициенту. Мы знаем явное решение этой проблемы как решение с максимальным правдоподобием, но я хотел немного поэкспериментировать с Pytorch. Здесь мы делаем крутой градиент спуска для нашего оптимизатора и MSE для потери.
Когда я пытался без инициализации модели классов, конвергенция была намного быстрее, а результат - намного лучше. С этим кодом потери после 10000 итераций по-прежнему составляют около 1. Принимая во внимание отсутствие модели классов и «более уродливый» код, я уже достигал 10 до минус 6, и предполагаемый многочлен был действительно хорошим.
Кроме того, в этом коде, если я ставлю скорость обучения больше 10 на минус 4, она мгновенно расходится в бесконечность. В то время как в моем другом коде 0,01 хорошо.
В чем может быть причина этой потери сходимости? Пожалуйста, извините, если мой код выглядит грубым.
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)))