如果训练损失减少但验证损失没有减少怎么办?

数据挖掘 深度学习 nlp
2021-10-05 10:50:10

我正在训练一个 LSTM 模型来进行问答,即给出一个解释/上下文和一个问题,它应该从 4 个选项中预测正确答案。

我的模型架构如下(如果不相关请忽略):我通过相同的 lstm 传递解释(编码)和问题,以获得解释/问题的向量表示,并将这些表示加在一起以获得组合表示解释和问题。然后我通过 LSTM 传递答案以获得相同长度的表示(50 个单位)作为答案。在一个示例中,我使用了 2 个答案,一个正确答案和一个错误答案。由此我计算了 2 个余弦相似度,一个用于正确答案,一个用于错误答案,并将我的损失定义为铰链损失,即我尝试最大化正确和错误答案的余弦相似度之间的差异,

我发现的问题是模型,对于我尝试的各种超参数(例如隐藏单元的数量、LSTM 或 GRU),训练损失减少了,但验证损失仍然很高(我使用 dropout,我使用的比率是 0.5),例如

在此处输入图像描述

我的数据集包含大约 1000 多个示例。关于做什么的任何建议,或者什么是错的?

2个回答

欢迎来到数据科学。这看起来像是典型的过度拟合场景:在这种情况下,您的 RNN 是在记住正确答案,而不是理解语义和逻辑来选择正确答案。

验证这一点的一个典型技巧是手动改变一些标签。例如,您可以通过使用相同的文档(或您的单词的解释)和问题来生成一个假数据集,但对于一半的问题,将错误答案标记为正确。如果你在这个假数据集上重新训练你的 RNN 并获得与真实数据集相似的性能,那么我们可以说你的 RNN 正在记忆。

请注意,在训练 RNN 时,降低模型复杂度(通过 hidden_​​size、层数或词嵌入维度)不会改善过拟合的情况并不少见。

如果它确实在记忆,最好的做法是收集更大的数据集。我知道这可能不可行,但通常数据大小是成功的关键。如果您还没有这样做,您可以考虑使用一些基准数据集,例如SQuADbAbI

我遇到了这个问题——虽然训练损失在减少,但验证损失并没有减少。我在使用 LSTM 时检查并发现:

  • 我简化了模型——我选择了 8 层而不是 20 层。
  • (-1,1)我选择不是在范围内缩放,而是(0,1)将我的验证损失减少了一个数量级
  • 我将批量大小从 500 减少到 50(只是反复试验)
  • 我添加了更多功能,直觉上我认为这些功能会为 X->y 对添加一些新的智能信息。虽然这高度依赖于数据的可用性。