Train Loss保持下降,Valid Loss大幅度波动下降

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Train Loss保持下降,Valid Loss大幅度波动下降相关的知识,希望对你有一定的参考价值。

参考技术A 在使用PyTorch进行PointCNN的构建和实现中,发现模型在训练过程中Loss保持稳定下降,但是在验证过程中,出现完全不合理的10e9级别的Loss。考虑到训练集和验证集是完全从同一数据集中采样出来的,不可能会在数据分布上出现明显的差异,因此排除数据不一致的原因。
详细检查了模型在训练和验证过程中的输出,发现由于最后的一层 BatchNormalization ,模型在训练过程中的输出是接近均值为零,方差为一的。而验证过程中,模型的输出完全没有遵从这个分布。因此,可以认为, BatchNormalization 在验证过程中,没有发挥它的作用。
考虑到模型内部,显式对数据分布进行调整的计算,还是主要在 BatchNormalization 层,因此首先调查这一方面。
结果发现,PyTorch Forum上有人提到了相似的问题 Model.eval() gives incorrect loss for model with batchnorm layers 。在这里,PyTorch Dev, Facebook AI Research的smth提到

即, BatchNormalization 层内的,随训练而不断更新的拟合的数据分布,没有能匹配真实的batch数据分布。
推荐将 BatchNorm 内的 momentum 项设置的比较高,或是在将模型调到 model.eval() 模式前,先将部分测试的数据在模型内前向传播一下,让 BatchNorm 层可以更新一下这个估计。
本文试验了一下调高momentum项,但没有明显的效果。
本文解决这个问题通过另一位网友cakeeatingpolarbear提出的方法,将 BatchNorm 函数内的 track_running_stats 设置为 False ,则模型会在任何模式下保持进行对数据分布的拟合。

深度学习训练集和测试集loss损失值关系

train_loss是训练集的损失值,test_loss是测试集的损失值

train_loss不断下降,test_loss不断下降,说明模型仍有训练空间;
train_loss不断下降,test_loss趋于不变,说明模型过拟合;
train_loss趋于不变,test_loss不断下降,说明数据集有问题;
train_loss趋于不变,test_loss趋于不变,说明需要减小学习率或调整步长;

以上是关于Train Loss保持下降,Valid Loss大幅度波动下降的主要内容,如果未能解决你的问题,请参考以下文章

深度学习训练集和测试集loss损失值关系

python 画图像训练结果的loss图

matplotlib绘图

keras中accuracy是怎么算出来的,为啥loss下降,accuracy不变甚至减小

PyTorch:随机数据加载器

cnn训练准确率很高,测试准确率很低(loss有一直下降)是为啥?