卷积神经网络损失和性能

数据挖掘 机器学习 深度学习 神经网络 张量流 卷积神经网络
2021-09-15 03:19:47

我有一组大约 100,000 个训练示例。正例与反例的比例大致为 1:2。真实比率更像是 1:100,因此这代表了负类的主要下采样。它也是一个非常嘈杂的数据集——示例是通过远程监督自动生成的。每个示例代表一组句子,有 700 列。行数可能从 10 到 100(甚至更多)不等。

我在 Tensorflow 中使用卷积神经网络来训练我的模型(模型架构类似于此处描述的模型),仅使用 2 个 epoch,并每 10 步存储损失、f-score、精度和召回率。我在验证集上评估了模型(它也是通过远程监督自动生成的,负类下采样导致 pos:neg 比率约为 1:2)每 100 步。以下是超参数:

batch size: 60 for train, 100 for validation 
epochs: 2
convolution filter sizes: 700x5, 700x6, 700x7, 700x8, 700x9, 700x10 
number of convolution filters per filter size: 125 (so total of 750 filters)
dropout: 0.5
l2reg: 0.001
lr: 0.001

我看到模型有一些奇怪的行为,我不明白为什么。

我的训练精度、召回率和 f 分数在大约 100 步(6000 个示例)中超过 0.95,然后进入平稳期。损失在大约 200 步内从 0.8 下降到 0.2,然后在 0.1 和 0.4 之间波动。

在验证集上,从我第一次在第 100 步评估它开始,我的准确率、召回率和 f 分数都超过了 0.95。损失从 0.3 小幅下降到 0.2。

当我在真实世界的测试集上进行评估时(没有对负类进行下采样,因此它具有 pos:neg 的真实比率),实际精度和召回率为 0.37 和 0.85。

我的结果对我没有任何意义。我使用 tensorflow 指标来计算训练精度、召回率和 fscore,并使用 scikit-learn 指标来计算验证精度、召回率和 fscore。我在代码中找不到任何错误,但我不明白为什么我应该得到这样的结果,除非有错误。我会理解低精度和召回率 - 类不平衡有利于负类,我的集合很嘈杂。但是,我很困惑为什么我一直有如此误导性的高分……

鉴于我的开发数据集也很嘈杂,并且以与训练集相同的方式生成,开发结果可能只是无用的,并且模型可能过度拟合噪声集。但是我还是不明白为什么这么快分数就这么高了。另外,如果过拟合是问题,你认为我应该让辍学率更高吗?

我附上了图表的截图,非常感谢您对此的想法。蓝色是火车,红色是开发。非常感谢! 在此处输入图像描述

1个回答

精确

你在精度上的阶跃变化看起来几乎完全可以用正类频率的变化来解释。当增加负例的比例时,期望误报的比例增加是合理的。即使你假设你的简历结果是完美的,你也会看到一些增加。

例如,假设您有代表测试结果的 cv 结果 - 这意味着在随机欠采样之前分布相同,并且没有过度拟合 cv 集。

假设您测量精度为 0.97,at:f 比率为 1:2,为简单起见,这是由于以下混淆表:

      Predicted:  T    F
Real T           97    3
Real F            3  197

在进行实际分布时,您应该期望什么精度?这与将混淆表的底行乘以 50 相同。精度为TPTP+FP,因此您的预期精度为 9797+1500.39

记起

同样的效果不会影响召回率,因为它是关于真阳性和假阴性之间的比率。所以当你改变正负类的比例时,理论上召回率应该不受影响。

在您的情况下,召回率受到了影响,但远低于精度。这是有希望的。cv 和 test 之间从 0.95 下降到 0.85 可能不是很好,但这并不表示存在真正的重大问题,只是有改进的余地。

有几个可能的原因。我能想到的有:

  • 您的测试集可能太小,因此对精度和召回率的估计有很大的误差。所以实际上是没有问题的。. .

  • 测试分布可能与训练和 cv 集不同。

  • 训练/CV 集拆分可能会导致一些数据泄漏(例如,它们共享一些共同特征,例如关于同一个人的数据,并且应该按照该共同特征进行拆分)。在这种情况下,CV 估计值可能过高。

  • 您对负类进行欠采样的机制可能存在偏差。

该怎么办?

首先,这些结果不太可能与模型中的错误有任何直接关系,而且训练曲线也不会提供太多信息。它们在上下文之外也没有那么糟糕(即它们比简单地猜测哪些项目属于正面类别要好得多) - 问题更多的是你是否可以改进它们,以及不同类型的成本对你来说是什么错误。实际上,您可能值得为每种类型的错误分配现实世界的可比成​​本,以帮助确定您的模型是否成功/有用,并在以后选择最佳模型。

训练曲线中的一件事是您的 cv 和训练损失看起来非常接近。这意味着您没有过度拟合训练数据(或者您应该检查训练/简历数据泄漏)。您可能有空间添加更多参数并总体上改进模型。

有可能你可以通过不同的超参数选择、特征工程等使模型变得更好,从而提高分数。但是,没有一般性的建议,这取决于你有什么可用的。

可能值得尝试在不平衡的训练集上进行训练(在没有欠采样的情况下获取原始数据),而不是对损失函数进行加权,这样对于正类的不准确分类成本会更大。这不能保证解决您的问题,但会增加您用于训练的数据量。

否则,您应该调查上面列出的任何可能原因是否可能,并尝试应用修复程序。

最后,在这种情况下,进行四路数据拆分并非闻所未闻:

  • 比率调整集分为两种方式:

    • 训练数据
    • CV 或“开发”集 A
  • 与生产集相同的拆分方式有两种:

    • CV 或“开发”集 B
    • 测试集

CV 集 A 用于执行提前停止和低级模型选择。

CV 集 B 用于针对生产指标执行高级模型选择。

测试集用于评估选择的“最佳”模型,没有偏差。