何时在不同的分布上训练与测试
假设用户已经向你的猫咪图片程序上传了 10000 张图片,且图片已被人为标记为含有猫与不含猫两类。同时你也从互联网上下载了规模更大的 200000 张图片集,此时训练集、测试集与开发集应该如何定义呢?
由于用户的 10000 张图片密切地反映了你想要处理的数据的实际概率分布,因此你可以将它们作为开发集与测试集。如果你正在训练一个数据量饥渴的深度学习算法,则可能需要使用额外的 200000 张网络图片来进行训练。这样的话,你的训练集与开发集/测试集将服从不同的概率分布。这对你的工作会有什么影响呢?
除了将数据集直接划分为训练集、开发集和测试集这一做法外,我们还能将所有的 210000 张已有图片先进行整合,接着随机打乱它们,再进行划分。经过这样的处理,所有的数据都将服从相同的分布。但我建议你不要使用这种方法,因为这样大约 97.6%(205,000/210,000)的开发/测试数据将来自于互联网图像,这并不能反映出你想要处理数据的实际分布。请记住我们关于选择开发/测试集的建议:
选择开发集和测试集以反映你在将来想要正确处理的数据。
大多数关于机器学习的学术文献都假定训练集、开发集和测试集都来自于相同的分布。在机器学习的早期,数据是稀缺的。我们通常只有一个服从某些概率分布的数据集。因此,我们会随机地将这些数据分割成训练/开发/测试集,并且假设所有的数据来源相同且满足要求。
有一些在不同的分布上进行训练和测试的学术研究。例子包括“域适应”、“迁移学习”和“多任务学习”。但理论与实践之间仍存在巨大差距。如果你在数据集A上进行训练,并测试一些类型很不一样的数据B,运气成分可能会对你的算法的性能产生巨大的影响。(在这里,“运气”包括了研究人员为特定任务人为设计的特征,以及其他我们还不了解的因素。)这使得对不同分布的训练和测试的学术研究难以系统地进行。
但在大数据时代,我们现在可以使用大型的训练集,比如猫的网络图像。即使训练集的分布不同,我们仍然希望使用它来学习,因为它可以提供大量的信息。
对于猫咪检测器的示例,我们不会将用户上传的所有 10000 个图像放到开发/测试集合中,而是将其中 5000 张放入。 这样的话,训练集中的 205000 个样本的分布将来自现有的开发/测试集,以及 200000 张网络图片。我们将在后面的章节中讨论为什么这个方法是有帮助的。
让我们考虑第二个例子。假设你正在建立一个语音识别系统,将某个街道地址转换为一个语音控制的移动地图/导航应用程序。现在你有 20000 个“用户说出街道地址”的样本,但是你也有 500000 个其他音频片段的样本,内容是“用户谈论其他话题”。你可能会为开发/测试集合选取 10000 个街道地址样本,并使用剩下的 10000 个样本,再加上 50 万个其它音频内容的样本进行训练。
我们将继续假设你的开发数据和测试数据来自相同的分布。但重要的是你要明白,不同的训练和开发/测试集分布将带来一些特殊的挑战。