训练准确率高时如何提高测试准确率?

人工智能 神经网络 机器学习 深度学习 过拟合
2021-11-14 08:29:43

跟进我关于我的过度拟合网络的问题

我的深度神经网络过度拟合: 在此处输入图像描述

我尝试了几件事:

  • 简化架构
  • 应用更多(和更多!)辍学
  • 数据增强

但我总是得到类似的结果:训练准确率最终会上升,而验证准确率从未超过 ~70%。

我认为我对架构进行了足够的简化/应用了足够的 dropout,因为我的网络太笨了,无法学习任何东西并返回随机结果(3 类分类器 => 33% 是随机准确度),即使在训练数据集上也是如此: 在此处输入图像描述

我的问题是:这个 70% 的准确率是我的模型所能达到的最好的吗?

如果是 :

  • 为什么训练准确率达到这么高的分数,为什么这么快,知道这个架构似乎不兼容?
  • 我提高准确性的唯一选择是更改我的模型,对吗?

如果不 :

  • 我有什么选择来提高这种准确性?

我尝试了一堆超参数,而且很多时候,取决于这些参数,准确率没有太大变化,总是达到 ~70%。但是我不能超过这个限制,即使我的网络似乎很容易达到它(收敛时间短)

编辑

这是混淆矩阵:

在此处输入图像描述

我不认为数据或类的平衡是这里的问题,因为我使用了一个众所周知/探索的数据集:SNLI Dataset

这是学习曲线:

在此处输入图像描述

注意:正如 Martin Thoma 的资源所指出的那样,我使用了准确性而不是错误率

实在是太丑了 我想这里有一些问题。也许问题是我对每个值都使用了 25 个 epoch 之后的结果。因此,在数据很少的情况下,训练准确率并没有时间真正收敛到 100% 的准确率。对于更大的训练数据,如前面的图表中所指出的,模型过拟合,所以准确度不是最好的。

2个回答

我确定了这种过度拟合的根源..

起源

我尝试了很多模型,放置了越来越多的 dropout,尽可能地简化。

不管我做什么,经过几个时期的良好学习,我的损失函数总是在上升。我尝试了越来越简单的模型,总是相同的过拟合行为。那一刻让我烦恼的是,无论我使用什么样的模型,多深或多复杂,准确性总是很好,稳定在某个不错的水平。

所以我尝试了我能想象到的最简单的模型:输入 => 带有 3 个隐藏单元的密集 => 输出。最后我得到了随机结果,准确率为 33%!从这里开始,我再次对我的网络感到内疚,一层一层地,看看是哪一个导致了过度拟合。

它是嵌入层

即使使用像 Input => Embeddings => Dense with 3 hidden units => Output 这样的简单网络,模型还是过拟合。

如何解决

在 Keras 中,只需使用trainable=False. 完成此操作后,不再过度拟合。

在我看来,这很违反直觉:我希望我的嵌入随着我向网络显示的数据而发展。不过好像不能...

我认为有时它也可以帮助检查您的测试和训练集。从根本上说,您的数据是由具有某些属性的底层流程/系统生成的。系统可以有许多“状态”,所有可能的状态形成状态空间。如果你真的尝试过像 dropout 和正则化这样的东西,我的猜测是测试集与你的训练集有所不同。您的训练集可能仅从状态空间的一部分中获取样本(AKA,您的样本在训练集中可能都相似,而测试集中有不同的样本 - 假设您正在对人类进行分类,并且您的所有训练样本都有类标签 1 表示所有训练样本中都有人类 -> 并且所有测试样本中都没有人类 祝你好运!)。一些问题要问:

  1. 您是否正在组合来自不同来源的数据集?如果是这样:如果您有“n”个数据源,则需要确保您的训练集有来自“n”个数据源中的每个数据源的许多样本,并且您的测试集有来自每个“n”个数据源的样本。

  2. 您是否对数据进行了足够的洗牌,并将样本随机放入训练和测试集中?这与我给出的人类示例有关,确保您的训练集包含所有内容(输入和/或输出的不同组合),并且您的测试集包含所有内容(输入和/或输出的不同组合) .