您的位置:首页 > 其它

吴恩达新书-机器学习学习笔记-(六)在不同的分布上训练与测试

2018-11-05 14:11 239 查看

书籍资料可以在以下链接中找到:中文版,英文版

1.何时在不同的分布上训练与测试

假设用户已经向你的猫咪图片程序上传了 10000 张图片,且图片已被人为标记为含有猫与不含猫两类。同时你也从互联网上下载了规模更大的 200000 张图片集,此时训练集、测试集与开发集应该如何定义呢?

用户的10000张图片反应的是实际概率分布,你可以将它们作为开发集与测试集。如果我们现在又需要大量的数据,那我们可能会需要互联网上的200000张图片进行训练,。这样的话,你的训练集与开发集/测试集将服从不同的概率分布。

除了将数据集直接划分为训练集、开发集和测试集这一做法外,我们还能将所有的 210000 张已有图片先进行整合,接着随机打乱它们,再进行划分。这样的话,所有数据将满足同一分布。因为这样大约 97.6%(205,000/210,000)的开发/测试数据将来自于互联网图像,这并不能反映出你想要处理数据的实际分布。

对于猫咪检测器的示例,我们不会将用户上传的所有 10000 个图像放到开发/测试集合中,而是将其中 5000 张放入。这样的话,训练集中的 205000 个样本的分布将来自现有的开发/测试集,以及 200000 张网络图片。

假设你正在建立一个语音识别系统,将某个街道地址转换为一个语音控制的移动地图/导航应用程序。现在你有 20000 个“用户说出街道地址”的样本,但是你也有500000 个其他音频片段的样本,内容是“用户谈论其他话题”。你可能会为开发/测试集合选取10000 个街道地址样本,并使用剩下的 10000 个样本,再加上 50 万个其它音频内容的样本进行训练。

2.如何决定是否使用你所有的数据

假设你的猫咪检测器的训练集包括 10000 张用户上传的图片,这些数据来自相同的数据分布且将作为单独的开发/测试集,同时也代表着你关心的将要处理的数据分布。你还从互联网下载了额外的 20000 张图片。那这个时候是否用上全部的数据进行训练呢?

在使用早期的学习算法(比如人为设计的计算机视觉特征,然后使用一个简单的线性分类器)时,真正的风险在于:合并这两种类型的数据会导致算法的表现更差。因此,一些工程师会警告你不要加入 20000 张互联网图片。

但是有了现代强大而灵活的学习算法——比如大型的神经网络——这种风险已经大大降低了。如果你能够构建一个有足够多的隐藏单元/层的神经网络,你可以安全地将 20000 张图片添加到你的训练集。此时添加图片则更有可能提升算法的性能。

添加额外的20000张图片会产生以下影响:

1.它给你的神经网络提供了更多关于猫咪外貌的样本。这是很有帮助的,因为互联网图片和用户上传的移动应用图片确实有一些相似之处。你的神经网络可以从互联网图像中获得的一些知识应用到移动应用图像中。如果这些属性与移动应用图像有很大的不同,那么它将“耗尽”神经网络的一些表征能力,导致从移动应用图像的分布识别数据的能力就会降低,而这正是你真正关心的东西。从理论上讲,这可能会损害算法的性能。

3.如何决定是否添加不一致的数据

假设你想要学习预测纽约市的房价。考虑房子的大小(输入特征 x),你需要预测价格(目的标签 y)。纽约市的房价非常高。假设你在密歇根州的底特律有第二个住房价格数据集,就会发现那里的房价要低得多。应该把这些数据包含在你的训练集里吗?

房子的大小 x 相同,而价格 y 明显不同,这取决于它是在纽约还是在底特律。如果你只关心预测纽约市的房价,把这两个数据集放在一起会影响算法的表现。在这种情况下,最好忽略不一致的底特律数据。有一种方法可以解决底特律的数据与纽约市数据不一致的问题,即在每一个显示城市的训练样本中增加一个额外的特征。给定一个输入 x ——代表所在的城市—— 此时目标值 y 是明确的。然而在实践中,我并不经常看到这种情况。

4.给数据添加权重

假设你有 20 万张来自互联网的图片,还有来自移动应用用户的 5000 张照片。数据集的大小之间有一个 40:1 的比率。从理论上讲,只要你建立了一个庞大的神经网络,并在所有205000 张图片上进行足够长的时间训练,那么在网络图像和移动图像上将算法都训练得很好是没有害处的。

但在实际操作中,拥有 40 倍的网络图像可能意味着,相比只使用 5000 张图片,你需要花费40 倍(或更多)的计算资源来对两者进行建模。

我们可以采用取不同的权值来对上述最小化目标做优化:

通过对额外的网络图像赋予更少的权重,你不需要构建一个庞大的神经网络来确保算法在这两种类型的任务上都能很好地完成。只有当你怀疑这些额外的数据(网络图像)与开发/测试集分布不一致,或者额外的数据规模比与相同分布的开发/测试集(手机图像)数据规模大得多时,这种类型的权重加权才需要。

5.从训练集泛化到开发集

当我们将我们训练好的数据用于不用分布的训练集和开发集上。例如,训练集包含了互联网图像+移动应用图像,而开发/测试集只包含移动应用图像。然而,该算法运行得不太好:它的开发/测试集误差比想要的要高得多。以下是一些可能出现问题的情况:

1.它在训练集上表现不佳,这属于训练集分布上的高(可避免)偏差的问题。

2.它在训练集上做得很好,但是不能很好地泛化到与训练集分布相同的未知数据,这是高方差问题。

3.它能够很好地泛化到与训练集相同分布的未知数据,但不能很好地泛化到与开发/测试集相同分布的未知数据。我们将这种情况称之为​数据不匹配,因为训练集的数据与开发/测试集的数据匹配得相当地糟糕。

为了诊断一个算法在上面 1 到 3 个问题受到了多大程度的影响,存在另一个数据集将是很有用的。具体地说,与其给算法提供所有可用的训练数据,你还可以把它分成两个子集:算法将进行训练的实际训练集,以及一个单独的集合,我们称之为“训练开发”集,我们将不会对它进行训练。

你现在有四个数据子集:

1.训练集:这是算法将学习的数据(例如,互联网图像+移动应用图像)。这并不需要我们从与真正关心的相同分布(开发/测试集分布)的数据中提取。

2.训练开发集:这些数据来自与训练集相同的分布(例如,互联网图像+移动应用图像)。它通常比训练集要小;它只需要足够大到来评估和跟踪我们的学习算法的进展。

3.开发集:这是从与测试集相同分布的数据中抽取出来的,它反映了我们最终关心的数据的分布(例如,移动应用图像) 。

4.测试集:这是从与开发集相同分布的数据中抽取出来的(例如,移动应用图像)。

之后的话,我们就可以对其进行评估:

训练误差,对训练集进行评估。

该算法能够泛化到与训练集相同分布数据的能力,并对训练开发集进行评估。

算法在你实际关心的任务上的性能,通过对开发集 和/或 测试集评估。

6.解决数据不匹配问题

假设你已经开发了一个语音识别系统,它在训练集和训练开发集上都做得很好。但是,它在你的开发集上做得很差:这表明有一个数据不匹配的问题。

遇到这种问题,我建议你:(I)尝试理解数据属性在训练集和开发集分布之间的差异。(ii)尝试找到更多的训练数据,以便更好地匹配你的算法碰到的开发集样本。

假设你在语音识别的开发集中进行误差分析:手动地遍历 100 个样本,并尝试理解算法错出在哪。你会发现你的系统做得的确很差,因为在开发集中,大部分的音频剪辑都是在一辆车里录制的,而大多数的训练样本都是在一个安静的环境下录制的。

引擎和道路噪音极大地恶化了你的语音系统的性能。在这种情况下,你可能会尝试获得更多的训练数据,包括在汽车里拍摄的音频片段。误差分析的目的是了解训练集和开发集之间的显著差异,这正是导致数据不匹配的原因。

7.人工合成数据

你的语音系统需要更多的数据,它们听起来就像是从车里录制得到的。与其在开车的时候收集大量的数据,不如通过人工合成数据来获取这些数据。

比如我们将在安静房间中说话的数据集加入一点点嘈杂的汽车声,这样的话我们就合成了大量的数据,听起来就像是在汽车里收集的一样。

但有时这种方法会出现一些问题,例如,假设你有 1000 小时的语音训练数据,但只有 1 小时的汽车噪音。如果你反复使用相同的 1 小时的汽车噪音,从最初的 1000 小时的训练数据中,你将会得到一个合成的数据集,然而同样的汽车噪音会不断重复。

听这段音频的人可能无法分辨——所有的汽车噪音对我们大多数人来说都是一样的——但是某种学习算法可能会“过拟合”
一小时的汽车噪音。因此,它可能无法很好地泛化到一个新的音频剪辑片段,里面汽车的噪音听起来是不同的。

另一种情况,假设你有 1000 个小时的汽车噪音片段,但所有的噪音都是从 10 辆不同的车上提取的。在这种情况下,一种算法可能会“过拟合”这 10 辆车,如果在不同的汽车上进行音频测试,性能则会很差。不幸的是,这些问题很难被发现。

当你在合成数据时,请考虑一下你是否真的在合成一组具有代表性的样本。尽量避免给出合成数据的属性,这将使学习算法有可能将合成和非合成的样本区分开来。

在处理数据合成过程时,我的团队有时会花上几周的时间来生成带有细节的数据,这些数据与实际的数据分布非常接近,从而产生显著的效果。但如果你能够正确地获取这些细节,你可以突然获得比以前更大的训练集。

 

阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐