首页 > 解决方案 > 为什么新纪元开始时我的火车损失会下降?

问题描述

当我在 MNIST 手写数字任务上训练由 2 个卷积层和 2 个全连接层组成的神经网络时,我收到以下训练损失曲线:

在此处输入图像描述

数据集包含 235 个批次,我在每个批次之后绘制了总共 1500 个批次的损失,因此对模型进行了 6 个多一点的训练。使用以下 PyTorch 代码对批次进行采样:

            sampler = torch.utils.data.RandomSampler(train_dataset, replacement=False)
            train_dataloader = torch.utils.data.DataLoader(train_dataset, batch_size=batch_size, sampler=sampler)

因此,在每个 epoch 中,每个批次都会被查看一次,并且每个 epoch 都会对批次进行新的洗牌。正如您在图中看到的,损失在每个时期的开始都迅速减少。我以前从未见过这种行为,我想知道为什么会这样。

为了比较,当我运行相同的代码,但我选择替换采样时,我得到以下(正常外观)损失曲线:

在此处输入图像描述

到目前为止,我的想法是:由于在每个 epoch 开始时,之前已经查看了特定的样本,因此如果网络记住特定的批次,它可能会更容易完成任务。尽管如此,由于在每个时期都有不同的洗牌,因此网络必须记住所有批次,根据我的经验,这在 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-learningpytorchclassificationsamplingloss

解决方案


推荐阅读