首页 > 解决方案 > 使用线性模型逼近平方函数时 PyTorch 不收敛

问题描述

我正在尝试学习一些 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)的代码行有问题吗?

标签: pythonmachine-learningneural-networkregressionpytorch

解决方案


您不能用线性函数拟合二次多项式。您不能期望超过随机(因为您有多项式中的随机样本)。
你可以做的是尝试有两个输入,xx^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])) 

推荐阅读