深度学习算法都希望有大量的训练数据
要使它运转在最佳状态
训练集中要有足量已标记训练数据
这导致很多团队将能找到的任何数据
都塞进训练集只为有更多的训练数据
即使有些 甚至很多这种数据
来自于与开发集和测试集不同的分布
因此在深度学习时代越来越多的团队正在使用的
训练数据并非来自与开发集和测试集相同的分布
针对这种情况
这里有一些需要了解的微妙之处和一些最好的实践方法
让我们一起来看看让我们一起来看看
假设你正在做一个移动应用
用户将从他们的手机上传图片
你想要识别这些图片是不是猫的图片
那么你现在有2个数据源
一个是你真正关心的数据分布
来自于移动应用通常拍摄和构图都不怎么专业
甚至可能是糊的因为他们来自业余用户
另一个数据源是你可以抓取网页 然后下载大量的
在这个例子中是说
你可以下载大量的构图专业的分辨率高的 专业拍摄的猫的图片
假设你的移动应用还没有很多用户
也许你有10,000张从移动应用上传的照片
但是通过网页抓取你能下载海量的猫的图片
也许你有200,000张从网络下载的猫的图片
但是你真正期待的是最终系统
处理移动应用上传的图片的分布的表现
因为最终你的用户将会上传如图右所示的图片
你需要你的分类器在这些图片上表现足够好
但是现在你有些为难
因为你的数据集比较小只有10,000个样例来自这个分布
而大得多的数据集来自于另外的分布
它的图片与你的目标分布看上去并不一样
所以你不希望只用10,000个图片
因为这意味着一个较小的数据集
使用这总共200,000个图片会对这个问题有帮助
两难的是200,000个图片并非来自你的目标分布
那么你能怎么做呢？
这里有个方案
你可以将这些数据集放在一起
这样就有了210,000个图片
然后将这210,000个图片随机混合
得到训练/开发/测试集
为讨论方便 假设你的
开发集和测试集各包含2,500个样例
那么训练集则包含205,000个样例
这样的数据分配有其优点和缺点
优点是这样一来你的训练/开发/测试集
都来自于同一分布 易于管理
而缺点 一个巨大的缺点是
仔细看看你的开发集它有2,500个样例
但是大部分来自网页图片的分布
而不是你真正关心的来自移动应用图片的分布
也就是说210,000个样例中的200,000个
我将200,000简写为200k210,000简写为210k
来自于网页
那么2,500个样例中
来自于网页的数量的期望值是2381
这是期望 确切的数字将取决于
随机混合的结果
但是平均只有119个样例来自于移动应用上传
请记住 设置开发集的目的是
告诉你的团队该往哪里瞄准
现在你正在瞄准的目标
正在花费大量的时间优化的是
网页图片的分布而这其实不是你想要的
所以我建议不要采用方案一
因为它设置的开发集使你的团队致力于
优化一个与你实际关心的目标并不相同的数据分布
与其这样
我建议你改用另一个方案
假设训练集仍然包含205,000个图片
所有来源于网络的200,000个图片都放进训练集
如果你想 还可以加入来自于移动应用的5,000个图片
你的开发集和测试集
则不必依照这个比例
你的开发集和测试集将包含所有的移动应用图片
所以训练集包含200,000个网络图片
和5,000个移动应用图片
开发集包含2,500个移动应用图片
测试集也包含2,500个移动应用图片
按照这种方式划分训练/开发/测试集
其优点是你瞄准的是正确的目标
你在向你的团队表明我的开发集数据来自于移动应用
而这正是你真正关心的图片的分布
让我们来建立一个机器学习系统
它在移动应用图片分布的表现的确很好
当然其缺点就是你的训练集的分布
不同于您的开发和测试集分布
但事实证明这样划分训练/开发/测试集
长期来说性能更好
我们稍后将讨论一些具体的技术来处理
训练集与开发/测试集出自不同分布的问题
我们来看另一个例子
假设你正在打造一个全新的产品
一款语音激活的后视镜
这是中国的一款真实产品
它正在进入其他国家的市场但是你也可以自己做一个
来把这个小东西换掉 这样你就可以跟后视镜说话了
只要对它说 亲爱的后视镜
请帮我导航到最近的加油站它就会帮你导航
所以这是一个真实的产品 现在假设你
想给自己的国家也开发一个
那么你要怎样取得数据
来为这款产品训练语音识别系统呢
也许你已经在语音识别领域工作很长时间了
你有大量来自其他语音识别应用的数据
只是没有来自语音识别后视镜的数据
那么 划分训练集/开发集/测试集的方法是这样的
对于训练集 你可以使用所有
你在过去的语音识别工作中所积累的数据 比如
你多年来从各种语音识别数据供应商处购买的数据
如今你的确可以从供应商那里购买形如(x,y)的数据
其中x是音频 y是文字
也许你有在智能语音激活扬声器领域的工作经验
所以有一些这方面的数据
也许你有语音激活键盘或者其他类似的工作经历
为方便讨论 假设你有500,000个
从这些来源收集的话语(utterance)片段
而你的开发/测试集可能是小得多的数据集
他们来自于语音激活后视镜
因为用户要求导航查询或
试图找到去各种地方的方向
这个数据集将包含更多的街道地址 对吗
请帮我导航到这个街道地址
或请帮我导航到这个加油站
所以这个数据分布和左边的有很大区别
但是这才是你关心的数据因为这才是你需要你的产品
能处理好的数据所以应该由它来组成开发和测试集
那么在这个例子中你要做的是
将训练集设为左边的500,000个话语
而开发集和测试集 简写为D和T
分别包含大约10,000个话语
来自语音激活后视镜的真实话语
或者 如果你认为你不需要把所有来自于
语音激活后视镜的全部20,000个语音样例
都放到开发/测试集也可以分出一半来放到训练集
那么训练集有510,000个话语样例
包括那边的500,000个和来自后视镜的10,000个
而开发/测试集分别包含5,000个话语样例
因此 20,000个话语也许训练集分到10k
开发集和测试集分别分到5k
这是另一种将你的数据分配到训练集
开发集和测试集的合理方案
而且比起单纯的使用语音激活后视镜提供的数据
它提供大得多的训练集有大于500k的话语样例
在这节你看到一系列例子
如果允许训练集和开发/测试集的数据来自不同的分布
那么你将拥有一个大得多的训练集
这些例子中它能使你的算法表现得更好
现在你可能会问一个问题是否应该总是使用所有的数据
答案是微妙的 它并不总是肯定的
我们将在下一节看到一些反例 GTC字幕组翻译