微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么我的学习曲线会出现尖峰或波动?

如何解决为什么我的学习曲线会出现尖峰或波动?

我的学习曲线给出了一个 3 类分类问题的波动。我正在使用 resnet 50 进行训练 第 1 类,共 899 张图片 第 2 类,共 899 张图片 第 3 类,共 690 张图像。 我的模型给出了一个 训练准确率 99.5% 验证准确率 93% 测试准确率 88% Epochs = 300,Batch 大小为 32,学习率为 0.1。 我尝试将参数调整为 50、100、200、300、批量大小 16,32 和学习率 0.1、0.01、0.001、0.0001,但仍然存在尖峰。我的模型或数据集有问题吗?我怎么知道我的模型真的在学习?

enter image description here

解决方法

在训练任何模型时都会出现“尖峰”——尤其是在批量较小的情况下。

要理解为什么会这样,假设 batch_size 为 1,并且在每个 epoch 中,我们从一个随机数据点开始梯度下降,并随机选择以下数据点。

这个数据点帮助我们(优化器)找到移动的方向以找到最接近的最小值。现在我们继续下一个数据点,它再次指向最近的最小值。在整个 epoch 中,我们使用来自每个数据点的方向来找到最小值,并赋予每个数据点相同的权重。

因此,我们寻找最小值所经过的数据点的顺序将对我们得到的最小值产生巨大影响。

通常,使用较小的batch_sizes,我们可能会陷入局部最小值(这会给我们带来巨大的损失),有时我们会以更佳的最小值(这会给我们带来较小的损失)中奖。

这是您在某些时期损失良好而在其他时期损失惨重的可能原因之一。

要回答您的模型是否真的在学习任何东西的问题,您应该查看平滑的损失图。如果损失(或您的指标)随着时间的推移而改善,那么这意味着您的模型肯定在学习。但是,如果损失在两个值之间波动,则您的模型没有在学习 - 因为权重没有通过反向传播得到改善。这可能是因为您的数据集只是噪声,您的梯度没有反向传播,或者您可以找到 here 的其他原因。

从你的图表来看,虽然没有提到batch_size,但损失似乎正在减少wrt epochs。这意味着您的模型正在学习。

如果您想平滑曲线或消除尖峰,您应该尝试的一种方法是使用更大的 batch_size 训练模型,前提是您的 VRAM 可以适应它。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。