36. 当你不得不在不同分布中进行训练和测试

你将你的猫咪图片应用程序的用户上传的 1 万张图片,手动分类为 “猫” 和 “非猫” 两种。同时你也通过互联网下载了额外的 20 万张图片。这种情况下,你应该如何去定义训练/开发/测试集呢?

因为 1 万张来自于用户的猫咪图像密切反映了你的算法想要去拟合的数据概率分布,因此,你可以将这部分数据用于开发集和测试集。如果你正在训练对数据有大规模需求的算法(Data-Hungry Algorithm),你可以将取自互联网的那 20 万张猫咪图片用于训练你的算法。这样的话,你的训练集和开发/测试集的数据就不服从同一分布了。这会对你的算法性能产生什么影响呢?

与其将数据单纯的划分为训练/开发/测试集,不如将 21 万张图片混合然后随机分配到训练/开发/测试集中。这种情况下,所有的数据均来自相同的分布了。但是我不推荐使用这种方法,因为 20.5万/21万 ≈ 97.6% 的开发/测试集数据会来自互联网图片,这比例并不能很好的反映出你数据的真实分布。切记,我们对选择开发/测试集的忠告:

  • 选择能够映射出你在未来将要获得的数据,且表现出良好效果的开发集和测试集。

关于机器学习的大多数学术文献都认为训练集、开发集和测试集来自同一分布 [1] 。在机器学习的早期,数据很稀缺,我们通常只能从某个概率分布中获取一个数据集,所以我们会随机的将这些数据分割为训练/开发/测试集,并假设所有的数据来自于同一分布,上述做法效果不错。

[1]:有一些专门研究在不同分布下算法训练和测试的学术文献。例子包括:域适配(Domain Adaptation)、迁移学习(Transfer Learning)和多任务学习(Multitask Learning)等。但因为理论和实践之间仍存在巨大的差异,如果你的算法在数据集 A 上训练然后用一些不同类型的数据集 B 去测试,你的算法效果好坏可能会与你的运气密切相关(在这里,“运气”包括了研究人员为特定任务手工设计的特征,以及一些我们还不了解的因素),这使得对不同分布下算法训练和测试的学术研究难以系统的进行。

但在大数据时代,我们有能力获取到大量数据,例如猫的互联网图片。即使训练集的数据和开发/测试集的数据来源于不同分布,我们仍然希望用这些数据来用于算法学习,因为它可以为算法提供大量信息。

对于猫咪检测器的例子,与其将所有的用户上传的猫图分配给开发/测试集,不如将 5000 张(一半)分配给开发/测试集,然后将剩下的那 5000 张图片给训练集。这样,你的 205000 张训练集图片既包含了 5000 张来自用户上传的图片,也包含了那来自互联网的 20 万张图片,我们将在后续章节讨论为什么这种方法是有效的。

让我们来看第二个例子,假设你正在构建一个语音识别系统用来为语音控制的移动地图/导航应用程序转录街道地址。你有 2 万个用户口述街道名称的样本,同时你还有 50 万个用户讨论其他主题的音频样本。你可能将 10000 个街道相关的样本置入开发/测试集,并将剩下的 10000 个样本连同那 50 万个其他主题的样本用来进行算法的训练。

我们继续假设你的开发集数据和测试集数据来自同一分布。但是重要的是要明白不同的训练集和开发/测试集概率分布会带来一些额外的挑战。