我正在尝试在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个参数,因此可以找到参数的选择,以使误差为零(这很容易进行分析)。我的问题是亚当为什么找不到这个。
—
白黎