【问题标题】:why is my simple feedforward neural network diverging (pytorch)?为什么我的简单前馈神经网络发散(pytorch)?
【发布时间】:2017-11-26 20:41:25
【问题描述】:

我正在用 pytorch 试验一个简单的 2 层神经网络,只输入三个大小为 10 的输入,一个值作为输出。我已经标准化了输入并降低了学习率。据我了解,两层全连接神经网络应该能够轻松适应这些数据

Features:

0.8138  1.2342  0.4419  0.8273  0.0728  2.4576  0.3800  0.0512  0.6872  0.5201
1.5666  1.3955  1.0436  0.1602  0.1688  0.2074  0.8810  0.9155  0.9641  1.3668
1.7091  0.9091  0.5058  0.6149  0.3669  0.1365  0.3442  0.9482  1.2550  1.6950
[torch.FloatTensor of size 3x10]


Targets
[124, 125, 122]
[torch.FloatTensor of size 3]

代码改编自一个简单的示例,我使用 MSELoss 作为损失函数。只需几次迭代,损失就会发散到无穷大:

features = torch.from_numpy(np.array(features))

x_data = Variable(torch.Tensor(features))
y_data = Variable(torch.Tensor(targets))

class Model(torch.nn.Module):
    def __init__(self):
        super(Model, self).__init__()
        self.linear = torch.nn.Linear(10,5)
        self.linear2 = torch.nn.Linear(5,1)

    def forward(self, x):
        l_out1 = self.linear(x)
        y_pred = self.linear2(l_out1)
        return y_pred

model = Model()

criterion = torch.nn.MSELoss(size_average = False)
optim = torch.optim.SGD(model.parameters(), lr = 0.001)

def main():
    for iteration in range(1000):
        y_pred = model(x_data)
        loss = criterion(y_pred, y_data)

        print(iteration, loss.data[0])
        optim.zero_grad()

        loss.backward()
        optim.step()

任何帮助将不胜感激。谢谢

编辑:

确实,这似乎只是因为learning rate 太高了。设置为 0.00001 可以解决收敛问题,尽管收敛速度很慢。

【问题讨论】:

  • 在运行梯度下降之前对特征进行归一化可能是个好主意。归一化提供更快的收敛(通常),并且由于每次迭代的梯度基于特征的大小,这将允许您提高学习率。请注意,在测试时,您需要以与训练集相同的方式对测试数据集的特征进行标准化。
  • 嗨 raryeng,这些特征实际上已经以减去均值和除以标准差的标准方式进行了归一化。原始数据分布在 0 到大约 10,000 之间。

标签: python machine-learning neural-network pytorch


【解决方案1】:

这是因为您没有在层之间使用非线性,并且您的网络仍然是线性的。

您可以使用 Relu 来使其成为非线性的。您可以像这样更改转发方法:

...
y_pred = torch.nn.functional.F.relu(self.linear2(l_out1))
...

【讨论】:

    【解决方案2】:

    也许您可以尝试预测 log(y) 而不是 y 以进一步提高收敛性。此外,Adam 优化器(自适应学习率)应该有助于 + BatchNormalization(例如在您的线性层之间)。

    【讨论】:

      猜你喜欢
      • 2018-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-11
      • 2015-06-04
      • 1970-01-01
      • 2017-12-17
      相关资源
      最近更新 更多