当我在 MNIST 手写数字任务上训练由 2 个卷积层和 2 个全连接层组成的神经网络时,我收到以下训练损失曲线:
数据集包含 235 个批次,我绘制了总共 1500 个批次的每个批次之后的损失,并因此对模型进行了 6 个多于 epoch 的训练。使用以下 PyTorch 代码对批次进行采样:
sampler = torch.utils.data.RandomSampler(train_dataset, replacement=False)
train_dataloader = torch.utils.data.DataLoader(train_dataset, batch_size=batch_size, sampler=sampler)
因此,在每个纪元中,每个批次都会被查看一次,并且每个纪元都会对批次进行新的洗牌。正如您在图中看到的,损失在纪元的每个开始时都会迅速减少。 我以前从未见过这种行为,我想知道为什么会这样。
为了进行比较,当我运行相同的代码,但我选择替换采样时,我得到以下(正常的)损失曲线:
到目前为止我的想法: 由于在每个时期开始时,之前已经查看过特定样本,因此如果网络记住了特定批次,则任务可能会更容易。尽管如此,由于每个时期都有不同的洗牌,因此网络必须记住所有批次,根据我的经验,这在 2 个时期后不会发生。
我还在另一个数据集上尝试过,并且使用模型的变体,得到了相同的结果。
我的模型结构如下:
self.conv_part = nn.Sequential(
nn.Conv2d(1, 32, (5, 5), stride=1, padding=2),
nn.ReLU(),
nn.MaxPool2d((2, 2)),
nn.Conv2d(32, 64, (5, 5), stride=1, padding=2),
nn.ReLU(),
nn.MaxPool2d((2, 2))
)
self.linear_part = nn.Sequential(
nn.Linear(7*7*64, 1024),
nn.ReLU(),
nn.Linear(1024, 10)
)
当通过显着减少每层通道数来简化模型时,问题几乎完全消失,我标记了纪元以获得更清晰的视图。
正如评论中指出的,这个数字可能表明存在过度拟合问题。当模型过度拟合时,每次训练迭代只会减少当前正在训练的批次的损失,而不是下一批的损失。这就是为什么你在一个时期内看不到损失减少的原因。然而,在下一个时期,模型对所有样本的损失都较低,因为它已经“记住”了前一个时期的样本。
换句话说,在模型没有过度拟合的情况下,它会从当前批次中学习一些有用的特征,然后可以在遇到的下一个批次中使用这些特征。否则,它只是记住了样本的标签,而没有找到更多有用的特征。