为什么当新纪元开始时我的火车损失会大幅下降?

问题描述 投票:0回答:1

当我在 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)
        )

当通过显着减少每层通道数来简化模型时,问题几乎完全消失,我标记了纪元以获得更清晰的视图。

deep-learning pytorch classification sampling loss
1个回答
0
投票

正如评论中指出的,这个数字可能表明存在过度拟合问题。当模型过度拟合时,每次训练迭代只会减少当前正在训练的批次的损失,而不是下一批的损失。这就是为什么你在一个时期内看不到损失减少的原因。然而,在下一个时期,模型对所有样本的损失都较低,因为它已经“记住”了前一个时期的样本。

换句话说,在模型没有过度拟合的情况下,它会从当前批次中学习一些有用的特征,然后可以在遇到的下一个批次中使用这些特征。否则,它只是记住了样本的标签,而没有找到更多有用的特征。

© www.soinside.com 2019 - 2024. All rights reserved.