为了完成学校的项目,我自行设计了一个非常简单的神经网路:这个网路是个二分类神经网路,用来分辨红外热成像图中的人脸和非人脸。

为了更好地测试自己设计神经网路的性能,我想要观察一下训练集样本数的大小对验证集识别准确率的影响。

最终的结果如下图:

可以看到,随著训练集样本数的增加,网路对训练集的拟合效果越来越差

损失函数:0.002-&>0.010-&>0.020-&>0.050-&>0.070-&>0.070

识别准确率:99.5%-&>99.5%-&>99.0%-&>98.0%-&>97.0%-&>97.0%

这些都是在情理之中的。

但是,网路对测试集的预测结果十分诡异。

随著训练集样本数的增加,损失函数先是下降到0.180,然后又上升到了0.340,准确率也是缓缓下降。(60.0%-&>85.0%-&>95.0%-&>93.0%-&>92.0%-&>91.0%)

这到底是为什么呢?验证集自始至终都是相同的验证集,训练集越大,准确度为什么越低呢?QAQ

==================分割线==========================

问题已解决:由于样本分布不均匀导致随著训练集样本数的增加,验证集准确率不升反降。

我认真阅读了各位知友的回答,最终觉得@霍华德的回答最有道理。于是,我做了下述实验:

由于我添加的数据有可能分布不均匀,所以我将2401张非人脸照片和2180张人脸照片随机打乱了顺序。

之后,再800张,800张地向训练集添加照片,最终训练结果如下:

可以看到,随著训练集样本数的增加,识别准确率:

88.5%-&>91.0%-&>90.5%-&>88.0%-&>91.0%-&>92.0%

一直在90%上下徘徊,并没有明显的单调趋势,这说明这一次:训练集样本数的增加并不会使识别准确率降低。

也就是说,我第一次实验的结果是样本分布不均匀导致的,我把样本随机打乱顺序之后,进行第二次实验之后,准确率就没有明显的下降了。QWQ


这可能是传说中的covariate shift

一开始你把数据分为训练集和测试集,这时候训练集和测试集是可以保证同分布的

而你后面加入的数据是否能保证和测试集同分布还需要验证。

吴恩达举过一个非常有趣的例子,一个城市有一套鸟类识别系统,有一种新鸟从地区迁徙到这座城市,分类器从来没有见过这种鸟,导致系统性能下降。因为这时候数据的分布已经发生了变化。

在现实生活中,数据分布是完全可以随时间变化的,你新添加的数据是否与原数据用相同的设备在相同的条件下拍摄,明暗杂讯快门iso解析度等指标是否一致?一点不一致都可以造成数据分布的偏移。

对于covariate shitf,吴恩达给出的建议是,在新训练集中再采样出一个train-dev集来测试,看看train-dev集上与原本测试集上的区别,从而可以分析出造成性能下降的原因到底是什么。


你可以看看哪些样本分类错了,然后把测试集里分错了的换进训练集,把训练集里分对的换进测试集,然后重新训练。不断重复这个过程,直到精度满足要求。。。

这是我听来的大招,当时惊为天人。你们听听就好,千万不要用,否则被开除不要来找我。。。


我也觉得有点奇怪。猜测一下,也许是你的模型规模太小。在你的训练数据比较少的时候,模型能够学到训练数据中的全部有用信息,所以训练集上的准确率逼近 100%。训练数据增加之后,模型就无法学到训练数据中的全部有用信息了,所以训练集和验证集上的准确率都降低了。你可以增大模型规模再试一试。


建议按照以下顺序检查看看呢:

  1. 检查测试集和训练集的分布情况。 可能是随著训练集的扩充,训练集和测试集的分布偏差更大了。
  2. 检查测试集选取是否有问题,这里可以用交叉检验来测试是否是选择了不那么具有代表性的测试集数据。毕竟简单的train/dev测试没有交叉检验来得可靠。
  3. 适当扩充测试集。当测试集相比训练集过小时往往会出现测试集结果不稳定,这里可以适当从当前的~400扩充到800。或者建议训练集和测试集的数量遵循一个比例如8:2。完全固定测试集数目的做法一般用在数据集数量在 [公式] 级别以上的场景。
  4. 一种比较魔性的做法是利用Adaboost的思想,来根据学习情况调整样本的权重。需要注意的是,仅仅在训练集上调整权重没有太大问题;但是如果使用类似 @解浚源 提到的大招,其实是等于偷看答案的做法,一般开发没有必要做,因为并不能提高泛化,肝论文实验调参的时候可以当作不是办法的办法(真香~)。
  5. 如果以上措施都没有较好的解决问题,时间允许的话不妨看一下分类错误的项做case study,也许能有新的突破。


可能模型太简单了,如果是cnn可以多加点conv kernel,或者多加几层。data augmentation也可以搞起来,比如elastic transformation,色彩变换

有没有可能是过拟合了呢?


step变长点试试。


这个网路的名字啊,excited。

我也觉得是训练集和测试集数据可能没有同分布。我觉得似乎没有理由让测试集一直不变。这个训练结果是跑一次的还是多次平均?其实每次都按同样比例划分训练集和测试集,多从头跑几次看下平均结果更好一些。有时候跑出来有问题,可以做的第一件事就是什么也不改(除了种子),重跑一遍。


从两个角度上来说。

第一个是数据的问题,有可能你后加入的训练数据与之前的数据分布不一致。从而导致加入后的训练集和验证集的分布是不同的。

第二个是模型的问题,有可能模型规模较小,导致模型无法很好地拟合新的训练集。

针对这两个问题,建议第一步先对加入新数据后的数据集进行重新采样,得到新的训练集和验证集来进行训练。如果效果不理想则进行第二步:扩大模型规模,再进行训练。


我做adaboost的时候遇到过类似问题,简单说就是样本不平衡,大多数正样本的特征非常集中,导致数量上升时边缘的少量正样本被忽略,从而召回率下降。按理说几千个样本不至于降这么明显,估计还是模型的容量小了或参数设置问题。其实可以通过多轮迭代的方式,把每一轮的模型过一遍正样本,挑出漏检的作为最终正样本来训练,相当于精选特征信息


就是你一开始训练的数据刚好和验证集特征比较相似吧。建议随机顺序再试试。


同觉得是样本分布变化的问题,可以考虑一下从训练数据选取测试集,然后这部分数据不参与训练,看看测试结果吧。也有可能是样本类别不均衡。这两种可能,应该没跑了


应该是训练集和验证集数据分布不完全一致。

多次随机划分再试下吧。


还有就是模型比较简单,碰到这么多模式不统一的样本不能很好的拟合,所以训练精度下降了,验证集的样本和开始的训练样本分布是相似的,网路为了拟合新来的样本参数变化比较大,导致验证精度下降的很快。我觉得还是对图片做一些翻转之类的充分训练几轮,如果真的是模型极限了还是改进一下结构,针对你的数据集。
推荐阅读:
相关文章