你的猫咪图片的app用户已经上传了1万张图片,并且已经被你手动标注过是否包含猫咪。你还有一个更大的数据集,包含20万张从互联网下载下来的图片。你该如何定义训练/开发/测试集?
由于这1万张用户上传的图片密切地反映了你想要做好的数据实际的概率分布,你可以使用它们作为开发和测试集。如果你在训练一个数据饥渴的深度学习算法,可以给算法额外的20万张互联网图片用于训练。因此,你的训练和开发/测试集来自不同的概率分布。这对工作有什么影响?
我们可以将这21万图片随机划分到训练/开发/测试集中去,而不是将我们的20万张互联网图片分割成训练/开发/测试集。这种情况下,所有的数据来自相同的分布。但我不建议使用这种方法,因为约 200000/210000 = 95.2%的开发/测试数据可能来自互联网图片,这不能反映你想要做好的实际分布。回顾我们关于选择开发/测试集上的推荐:
选择开发测试集以反映你期望在未来获取并想做的更好的数据
大多数机器学习领域的学术文献都假定训练集、开发集和测试集都来自相同的分布。
有一些关于训练和测试在不同分布上的学术研究。包括“domain adaptation”,"tarnsfer learning"和"multitask learning"。但理论和实践还是存在很大的差距。如果你在数据集A上训练,并在分布大不相同的数据B上测试,运气会对你的算法表现产生巨大的影响。(这里的“运气”包含研究者对特定任务手动设计的特征,以及其他我们尚不了解的因素)这使得对不同分布上训练和测试的学术研究难以以一种系统的方式进行。
在机器学习的早期,数据严重不足。我们通常只能从某些概率分布中获取到一个数据集。所以我们会将数据随机划分为训练/开发/测试集,并且所有数据来自同一个来源的假设通常都是满足的。
但在大数据时代,我们现在能够访问到大量的训练集,例如互联网中的猫咪图片。即使训练集和开发/测试集来自不同的分布,我们仍希望将其用于学习,因为它能提供很多信息。
对于猫咪检测器的例子,我们可以将用户上传的5000张图片,而不是所有的1万张图片放入开发/测试集中,而将剩余的5000张用户上传的样例放入训练集。这样,你的训练集中有205000张图片,其中包含了一些来自开发/测试分布的数据,以及20万互联网图片。我们将在下一章中讨论为什么该方法有效。
我们来看第二个例子。假设你正在构建一个语音识别系统,来转录语音控制的移动地图/导航app的街道地址。你有2万个用户讲街道地址的样例。但你也有50万用户谈论其他话题的音频剪辑。你可以将其中1万个街道地址的样例作为开发/测试集,并使用剩下的1万个街道地址的样例以及额外的50万其他话题的样例用于训练。
我们将继续假设你的开发数据和测试数据来自相同的分布。但重要的是,要明白不同的训练和开发/测试分布提供了一些特殊的挑战。