神经网络训练过程中验证集损失小于训练集损失的三大主要原因

       相信不少人都发现过,在训练自己搭建的神经网络的过程中,验证集的损失居然会小于训练集(见图1)。按照我个人的理解,理论上讲,验证集的损失应该是不小于训练集的。那么为什么会出现这种违背常规认知的现象呢?

神经网络训练过程中验证集损失小于训练集损失的三大主要原因
图1

 

本文参考网络其他资料,总结了三个主要的原因:

  • 1. 在训练的过程中应用了正则化,但是在对验证集计算损失的时候没有采用正则化。比如在损失函数中加入了L1,L2等正则项,或者dropout。正则化会牺牲训练精度,但是可以通过提高验证集和测试集的精度防止过拟合。如果在验证集中也加入正则项,那么会改善验证集损失小于训练集损失这种情况。如下图2所示:
神经网络训练过程中验证集损失小于训练集损失的三大主要原因
图2

 

从上图可以看到,计算验证集损失时如果考虑的正则项损失,那么就改善了两者的差别。

  • 2. 在计算训练集的损失时,它是边训练边计算的,不是等训练完一轮(epoch)后再计算总的训练集损失的。实际上,我们的数据是一个batch一个batch的输入到模型中训练的。在一轮训练中,每训练完一个batch就计算一下该batch在当前模型参数条件下的损失值,最后该轮的损失值是由这些batch分别计算得到的损失值的平均。先进去的batch的损失值往往要比后进去的大,这是因为,每输入一个batch,模型参数就更新一次,通常越往后的模型就越精确,所以越往后输入的batch其损失值就越小。但是对于验证集,它是等模型训练完一轮后再对所有的验证集数据计算损失值的,由于训练完一轮后的模型通常是该轮训练过程中的最佳模型,自然地,它的损失值也更可能比训练集小一些。从这个角度上讲,其实我们可以认为训练集的损失的计算比验证集的损失的计算提前了0.5个epoch。这样,如果训练集的损失曲线在损失值-迭代轮数图上往左移动0.5个epoch,那么这种现象也会改善。见下图3所示:
神经网络训练过程中验证集损失小于训练集损失的三大主要原因
图3

 

  • 3.验证集可能比训练集更加简单,或者它们俩的数据分布有差别。这里也包含可能的几种情况:(1)验证集的数据量不够多;(2)验证集中的样本类别要比训练集更容易分类或者识别等;(3)训练集中的一些信息泄露(leak)给了验证集;(4)训练集做了数据增强

 

本文参考资料:https://www.pyimagesearch.com/2019/10/14/why-is-my-validation-loss-lower-than-my-training-loss/

如果本文对您有帮助,请在右上角点赞。谢谢!