训练时间过长,Adam优化器的行为异常


11

我正在尝试在64个随机生成的数据点上训练单个感知器(1000个输入单元,1个输出,没有隐藏层)。我正在使用Adam优化器使用Pytorch:

import torch
from torch.autograd import Variable

torch.manual_seed(545345)
N, D_in, D_out = 64, 1000, 1

x = Variable(torch.randn(N, D_in))
y = Variable(torch.randn(N, D_out))

model = torch.nn.Linear(D_in, D_out)
loss_fn = torch.nn.MSELoss(size_average=False)

optimizer = torch.optim.Adam(model.parameters())
for t in xrange(5000):
  y_pred = model(x)
  loss = loss_fn(y_pred, y)

  print(t, loss.data[0])

  optimizer.zero_grad()
  loss.backward()
  optimizer.step()

最初,损耗迅速降低,如预期的那样:

(0, 91.74887084960938)
(1, 76.85824584960938)
(2, 63.434078216552734)
(3, 51.46927261352539)
(4, 40.942893981933594)
(5, 31.819372177124023)

大约进行300次迭代,误差接近零:

(300, 2.1734419819452455e-12)
(301, 1.90354676465887e-12)
(302, 2.3347573874232808e-12)

这进行了数千次迭代。但是,训练时间过长后,错误又开始增加:

(4997, 0.002102422062307596)
(4998, 0.0020302983466535807)
(4999, 0.0017039275262504816)

为什么会这样呢?


我不认为过度拟合可以解释这一点-培训损失在增加,而不是验证损失。例如,只有在使用Adam时,才使用SGD不会发生这种情况。
白黎

该模型有1000个参数,并且只有1个数据点,因此模型应准确拟合数据,且损失应为零。
白黎

哦,对不起,你是对的。有64个数据点。
白黎

有64个数据点(即约束)和1000个参数,因此可以找到参数的选择,以使误差为零(这很容易进行分析)。我的问题是亚当为什么找不到这个。
白黎

Answers:


19

收敛结束时的这种较小的不稳定性是Adam(和RMSProp)的一个特征,因为它如何估计最近步骤的平均梯度幅度并除以它们。

1010105

实际上,假设您希望在数值上尽可能接近零损失,并且计算考虑到您的问题,这会使Adam对于您的问题的稳定性和稳定性下降,而不是更基本的梯度下降。

在深度学习问题的实践中,您不会达到收敛的目的(对于某些正则化技术(如提前停止),无论如何您都不想这样做),因此通常不实际考虑问题的类型亚当是专为。

通过比较不同的优化器,您实际上可以看到RMSProp发生了这种情况(RMSProp是黑线-在到达目标时观察最后一步):

在此处输入图片说明

您可以通过降低学习率来使Adam更加稳定,并能够更接近真正的融合。例如

optimizer = torch.optim.Adam(model.parameters(), lr=1e-5)

lr=1e-5107


Neil,这是一个壮观的可视化。实际尺寸是多少?x和y代表什么?每帧的帧数是Δt还是n个历元?我猜想这颗星是相对于两个选定参数的视差(误差)的地形表示的全局最优值。我的猜测正确吗?
道格拉斯·达西斯科

这不是我的想象,您会在许多地方找到它。尺寸是测试功能的输入参数的任意单位,并且图形显示了该功能的轮廓线(再次以任意单位,可能是按比例缩放的,以便NN可以正常工作)。每帧都是权重更新步骤。它可能等效于小批量更新,并且由于SGD的行为,我希望实际上可以使用测试函数的真实梯度来完全解决它-即,没有数据集或采样。
尼尔·斯莱特

1

原因正好与其他答案中提到的一样,建议使用较小的学习率来避免在小梯度附近出现此问题。

我可以想到几种方法:

  1. 您可以使用上/下限来裁剪渐变,但这不能保证收敛,并且可能会因为陷入某些局部最小值而永远不会脱离该最小值而导致训练冻结。

  2. 以更高的批次大小,更多的时期和更低的学习速度进行训练。现在,我没有任何实际的证据可以证明增加批次大小会产生更好的渐变,但是从我面对类似问题所观察到的结果来看,这样做几乎总是有帮助的。

我确信还有其他方法(例如周期性学习率等)试图根据统计数据找到最佳学习率。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.