【问题标题】:Pytorch: test loss becoming nan after some iterationPytorch:经过一些迭代后,测试损失变为 nan
【发布时间】:2021-03-17 01:22:39
【问题描述】:

我正在尝试训练深度学习架构,模型训练完美。我在每个时代之后进行测试。对于 7 epoch,所有损失和准确性似乎都还可以,但在测试期间的 8 epoch 测试损失变为 nan。我检查了我的数据,它没有nan。我的测试精度也高于火车,这很奇怪。训练数据大小为 37646,测试为 18932,所以应该足够了。在成为 nan 测试之前,在 1.6513713663602217e+30 附近开始变得非常高。这真的很奇怪,我不明白为什么会发生。非常感谢任何帮助或建议。

【问题讨论】:

  • 你的网络发散,降低学习率...
  • 不工作将学习率从 0.05 降低到 0.001,但仍然在测试损失中获得 nan,因为在测试我的架构的一个模块时,经过一些迭代后,在 epoch 3 给出了 nan 分数。单独的模块工作正常,但是当我将一个模块合并到另一个模块中以添加他们的分数时,这件事正在发生
  • 你是如何计算损失的?如果每次循环遍历batch中的数据时都添加loss,很可能会导致nan,相反,您需要在每次通过网络转发batch时添加它来计算loss。
  • 作为测试阶段,我不会在每个批次中添加损失,而是将它们附加到单独的变量中,以获得批次迭代结束后的最终平均损失。
  • @SaniaZahan,你能把你的代码添加到你的问题中吗?

标签: deep-learning pytorch


【解决方案1】:

假设非常高的学习率不是问题的原因,您可以在更新之前使用 PyTorch 的 gradient clipping 剪裁渐变。

例子:

optimizer.zero_grad()        
loss, hidden = model(data, hidden, targets)
loss.backward()

torch.nn.utils.clip_grad_norm_(model.parameters(), clip_value)
optimizer.step()

这是当您丢失 NaN 时要做的第一件事,当然,如果您确定在其他地方没有 NaN,例如在您的输入功能中。在增加学习率导致 NaN 的情况下,我使用了梯度裁剪,但仍想测试更高的学习率。降低学习率也可以解决你的问题,但我猜你已经尝试过了。

根据经验,我大部分时间都设置了clip_value = 5,然后看到它(通常不显着)对性能的影响。随意尝试不同的值。

【讨论】:

  • 您好,感谢您的建议。我确实尝试过降低学习率和梯度裁剪。仍然在测试中输掉了nan。然后我将我的 SGD(动量为 0.9)更改为 Adam。现在 nan 问题不再存在,现在一切似乎都很好。虽然我很困惑为什么会这样。我在某处读到,具有动量的 SGD 比 Adam 效果更好。
  • 另外,我想知道如果我将渐变剪辑值设置得太高,比如 25,那么它会不会对性能造成太大影响
  • 效果很好。我真的不知道为什么 SGD 产生了 nan 而没有产生 adam。关于性能,我认为在大多数情况下 ADAM 比 SGD 更好,但这取决于实验并取决于问题。关于您的渐变剪辑值,不,我不认为将其设置得太高会损害性能,而是相反;它的影响会更小(剪裁的值更少)。快乐编码。 ^^
  • 非常感谢。我真的很困惑如何设置剪辑值,因为 pytorch 文档并没有太大帮助。
猜你喜欢
  • 2020-09-27
  • 1970-01-01
  • 1970-01-01
  • 2016-03-04
  • 1970-01-01
  • 2021-06-13
  • 2021-05-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多