我正在查看一个基本的 PyTorch MNIST 示例 here并注意到当我将优化器从 SGD 更改为 Adam 时,模型没有收敛。具体来说,我将第 106 行更改为
optimizer = optim.SGD(model.parameters(), lr=args.lr, momentum=args.momentum)
至
optimizer = optim.Adam(model.parameters(), lr=args.lr)
我认为这不会对模型产生影响。使用 SGD,损失在大约四分之一个纪元后迅速降至较低值。然而对于 Adam,即使在 10 个 epoch 之后,损失也根本没有下降。我很好奇为什么会发生这种情况;在我看来,它们应该具有几乎相同的性能。
我在Win10/Py3.6/PyTorch1.01/CUDA9上运行了这个
为了节省您一点点代码挖掘的时间,这里是超参数:
- lr=0.01
- 动量=0.5
- batch_size=64
最佳答案
Adam 以其开箱即用的默认参数而闻名,在几乎所有框架中,学习率都为 0.001(请参阅 Keras 、 PyTorch 中的默认值) ,和 Tensorflow ),这确实是 Adam paper 中建议的值.
所以,我建议更改为
optimizer = optim.Adam(model.parameters(), lr=0.001)
或者简单地
optimizer = optim.Adam(model.parameters())
为了将 lr
保留为默认值(尽管我会说我很惊讶,因为 MNIST 如今以实际处理您可能放入的任何内容而闻名)。
关于python - 模型使用 SGD 进行学习,但不使用 Adam,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55770783/