深度学习算法都希望有大量的训练数据 要使它运转在最佳状态 训练集中要有足量已标记训练数据 这导致很多团队将能找到的任何数据 都塞进训练集
只为有更多的训练数据 即使有些 甚至很多这种数据 来自于与开发集和测试集不同的分布 因此在深度学习时代
越来越多的团队正在使用的 训练数据并非来自
与开发集和测试集相同的分布 针对这种情况 这里有一些需要了解的微妙之处
和一些最好的实践方法 让我们一起来看看让我们一起来看看 假设你正在做一个移动应用 用户将从他们的手机上传图片 你想要识别这些图片是不是猫的图片 那么你现在有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简写为200k
210,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字幕组翻译