我正在经历一个基本的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的损失,在大约四分之一的时间后,损失迅速降至低值。然而对于亚当来说,即使在10个时代之后,损失也没有下降。我很好奇为什么会这样;在我看来,这些应该具有几乎相同的性能。
我在Win10 / Py3.6 / PyTorch1.01 / CUDA9上运行了这个
为了节省一些代码挖掘,这里是hyperparams:
Adam以其默认的参数开箱即用,它在几乎所有框架中都包含0.001的学习率(参见Keras,PyTorch和Tensorflow中的默认值),这确实是Adam paper中建议的值。 。
所以,我建议改为
optimizer = optim.Adam(model.parameters(), lr=0.001)
或者干脆
optimizer = optim.Adam(model.parameters())
为了让lr
保持其默认值(虽然我会说我感到很惊讶,因为现在MNIST因为你可能投入的任何东西而实际工作)。