本文主要参考“吴恩达deeplearning.ai——机器学习训练秘籍”(https://accepteddoge.github.io/machine-learning-yearning-cn/)进行学习整理的笔记。
一、训练集、开发集、测试集
训练集(training set)用于运行你的学习算法。
开发集(development set)用于调整参数,选择特征,以及对学习算法作出其它决定。有时也称为留出交叉验证集(hold-out cross validation set)。
测试集(test set)用于评估算法的性能,但不会据此决定使用什么学习算法或参数。
机器学习中的,一种常见的启发式策略是将 30% 的数据用作测试集,这适用于数据量规模一般的情况(比如 100 至 10,000 个样本)。但是在大数据时代,实际上开发集和测试集的比例会远低30%。
开发集和测试集应该服从同一分布
举个例子,假设你的团队开发了一套能在开发集上运行性能良好,却在测试集上效果不佳的系统。如果开发集和测试集分布相同,那么你就会非常清楚地知道问题在哪:在开发集上过拟合了(overfit)。解决方案显然就是获得更多的开发集数据。但是如果开发集和测试集来自不同的分布,解决方案就不那么明确了。
在处理第三方基准测试(benchmark)问题时,提供方可能已经指定了服从不同分布的开发集和测试集数据。与数据分布一致的情况相比,此时运气带来的性能影响将超过你所使用的技巧带来的影响。找到能够在某个分布上进行训练,并能够推广到另一个分布的学习算法,是一个重要的研究课题。但如果你想要在特定的机器学习应用上取得进展,而不是搞研究,我建议你尝试选择服从相同分布的开发集和测试集数据,这会让你的团队更有效率。
特例:
比如大型的神经网络,对于猫咪检测器的示例,我们不会将用户上传的所有 10000 个图像放到开发/测试集合中,而是将其中 5000 张放入。 这样的话,训练集中的 205000 个样本的分布将来自现有的开发/测试集,以及 200000 张网络图片。
添加额外的 20000 张图片会产生以下影响:
它给你的神经网络提供了更多关于猫咪外貌的样本。这是很有帮助的,因为互联网图片和用户上传的移动应用图片确实有一些相似之处。你的神经网络可以将从互联网图像中获得的一些知识应用到移动应用图像中。
它迫使神经网络花费部分容量来学习网络图像的特定属性(比如更高的分辨率,不同画面结构图像的分布等等)。如果这些属性与移动应用图像有很大的不同,那么它将“耗尽”神经网络的一些表征能力,导致从移动应用图像的分布识别数据的能力就会降低,而这正是你真正关心的东西。从理论上讲,这可能会损害算法的性能。
训练集:这是算法将学习的数据(例如,互联网图像+移动应用图像)。这并不需要我们从与真正关心的相同分布(开发/测试集分布)的数据中提取。
训练开发集:这些数据来自与训练集相同的分布(例如,互联网图像+移动应用图像)。它通常比训练集要小;它只需要足够大到来评估和跟踪我们的学习算法的进展。
开发集:这是从与测试集相同分布的数据中抽取出来的,它反映了我们最终关心的数据的分布(例如,移动应用图像) 。
测试集:这是从与开发集相同分布的数据中抽取出来的(例如,移动应用图像)。
有了这四个独立的数据集,你现在可以评估:
训练误差,对训练集进行评估。
该算法能够泛化到与训练集相同分布数据的能力,并对训练开发集进行评估。
算法在你实际关心的任务上的性能,通过对开发集 和/或 测试集评估。
开发集的规模应该大到足以区分出你所尝试的不同算法间的性能差异。例如,如果分类器 A 的准确率为 90.0% ,而分类器 B 的准确率为 90.1% ,那么仅有 100 个样本的开发集将无法检测出这 0.1% 的差异。相比我所遇到的机器学习问题,一个样本容量为 100 的开发集的规模是非常小的。通常来说,开发集的规模应该在 1,000 到 10,000 个样本数据之间,而当开发集样本容量为 10,000 时,你将很有可能检测到 0.1% 的性能提升。
从理论上说,还可以检测算法的变化是否会在开发集上造成统计学意义上的显著差异。 然而在实践中,大多数团队并不会为此而烦恼(除非他们正在发表学术研究论文),而且我在检测过程中并没有发现多少有效的统计显著性检验。
用于选择开发集大小的大多数指导原则也适用于训练开发集。
拥有开发集、测试集和单值评估指标可以帮你快速评估一个算法,从而加速迭代过程。
在不同的分布上训练集与开发/测试集的选择?
- 如果有足够的计算能力来构建一个足够大的神经网络,可以考虑对训练集额外加入不同于开发集/测试集的数据。相反,应该更加关注训练数据,需要与开发/测试集的分布相匹配
- 考虑对开发/测试集额外加入不同于训练集的数据。例如,假设你的开发/测试集主要包含一些内容是人员、地点、地标、动物的任意图片。同时假设集合里面有大量的历史文档扫描图片,这些文件不包含任何类似猫的东西,它们看起来和开发/测试集的分布完全不同,没有必要将这些数据作为负样本,你的神经网络几乎没有任何东西可以从这些数据中学习,加入