有时,数据科学家会遇到验证损失小于训练损失的情况。这是一个奇怪的观察结果,因为模型是从训练集中学习的,所以它应该能够更好地预测训练集,但我们观察到训练损失更高。这可能是由于以下几个原因,本文将介绍其中常见的原因。
原因1:L1或L2正则化
症状:验证损失始终低于训练损失,但它们之间的差距随着时间的推移而缩小。
无论你使用L1还是L2正则化,你都是通过将模型权重加入到误差函数中来使其膨胀:
正则化项只在训练集上训练模型时应用,从而使训练损失膨胀。在验证和测试期间,你的损失函数仅包括预测误差,因此通常比训练集损失要低。
请注意,在每个时期之后,验证和训练损失之间的差距会缩小。这是因为随着网络学习数据,它也会缩小正则化损失(模型权重),从而导致验证和训练损失之间的差异变小。然而,模型在训练集上仍然更准确。
让我们比较模型在训练集和验证集上的R2得分:
请注意,我们不谈论损失,只关注模型在训练集和验证集上的预测。正如预期的那样,模型在训练集上的预测比在验证集上的预测更好。
原因2:Dropout
症状:验证损失始终低于训练损失,它们之间的差距大小基本相同,而训练损失有波动。
Dropout通过在模型训练期间随机冻结层中的神经元来惩罚模型方差。与L1和L2正则化一样,Dropout仅适用于训练过程中,并影响训练损失,从而导致验证损失小于训练损失的情况。
在这种情况下,模型在训练集上的表现也更好:
这是可以预期的。当你的网络中也有正则化或Dropout时,较低的损失并不总是意味着更高的准确性。
原因3:训练损失在每个时期计算,但验证损失在每个时期结束时计算
症状:最初验证损失低于训练损失,但后来具有类似或更高的值。
请记住,当所有训练数据都通过网络精确地传递一次时,每个时期都已完成。如果你以小批量的方式传递数据,每个时期可能会有多个反向传播。每个反向传播步骤都可以显着改善模型,特别是在权重相对未经训练的前几个时期。
因此,在前几个时期中,每个反向传播更新模型时,你可能会得到较低的验证损失。
原因4:纯属运气!(适用于所有ML模型)
症状:验证集的损失比训练集低,准确性比训练集高。你也没有那么多数据。
请记住,噪声是因变量中独立变量无法解释的变化。当你进行训练/验证/测试拆分时,你可能会发现在某些迭代中,训练集中的噪声比测试或验证集中的噪声要大。如果模型没有过拟合,这会使模型在训练集上的准确性降低。
如果你在使用train_test_split函数,则可以通过更改随机种子来解决这个问题(不适用于时间序列分析)。
请注意,当数据集很大时,由于大数定律,这种结果不太可能发生。
让我们进行一个实验,观察validation准确性对train_test_split函数中随机种子的敏感性。我将在for循环中运行模型训练和超参数调整,并仅更改train_test_split中的随机种子并可视化结果: (代码块已省略)
在10次实验中,有3次模型在验证集上的R2得分略高于训练集。在这种情况下,将随机种子更改为在验证集和训练集之间均匀分布噪声的值将是一个合理的下一步。
这个图还有更多要说的。数据科学家通常会专注于超参数调整和模型选择,而忽视了诸如随机种子这样极大地影响我们结果的简单事情。不过,我将在未来的文章中写到这一点!
总结
我们讨论了导致验证损失小于训练损失的四种情况,并解释了根本原因。我们看到,通常情况下,较低的验证损失并不一定转化为更高的验证准确性,但当它确实转化时,重新分配训练和验证集可以解决问题。我们进行了这项研究,基于这样一个假设,即我们并没有遭受数据泄露或抽样偏差等其他问题的影响,因为它们也可能导致类似的观察结果。
评论(0)