目录
2.1、开发集数据比训练集更难识别,噪声较多,因此更需要对开发集进行人工错误分析
2.3、人工合成语音的方式创造更多的训练集, 让训练集数据更接近你的开发集,这样训练而来的系统能更好的识别开发集
2.4、人工合成语音的录制噪声时间短,可能导致学习算法对合成的语音过拟合
第一章、简介
- 本文基于吴恩达人工智能课程做学习笔记、并融入自己的见解(若打不开请复制到浏览器中打开)https://study.163.com/courses-search?keyword=吴恩达。
- 本文第二章将介绍 定位数据不匹配问题,即训练集与开发集的数据分布不一样的情况下带来的问题(过拟合问题)及其解决方法(人工合成数据)。
- 对本文的总结如下表:
第二章、定位数据不匹配
2.1、开发集数据比训练集更难识别,噪声较多,因此更需要对开发集进行人工错误分析
- 如果您的训练集来自和开发集、测试集不同的分布,如果错误分析显示你有一个数据不匹配的问题,该怎么办?
- 这个问题没有完全系统的解决方案,但我们可以看看一些可以尝试的事情。
- 如果我发现有严重的数据不匹配问题,我通常会亲自做错误分析,尝试了解训练集和开发集、测试集的具体差异。
- 技术上,为了避免对测试集过拟合,要做错误分析,你应该人工查看开发集而不是测试集。但作为一个具体的例子,如果你正在开发一个语音激活的后视镜应用,你可能要亲自查看看一下来自开发集的样本的效果,尝试弄清楚开发集和训练集到底有什么不同。
- 所以,比如说你可能会发现很多开发集样本噪音很多——有很多汽车噪音,这是你的开发集和训练集差异之一。
- 也许你还会发现其他错误,比如在你的车子里的语言激活后视镜,你发现它可能经常识别错误街道号码,因为很多导航请求都有街道地址,所以得到正确的街道号码真的很重要。
2.2、 解决开发集数据比训练集数据更难识别的方法思路
- 当你了解开发集错误的性质时,你就知道开发集有可能跟训练集不同或者更难识别。
- 那么,如何解决开发集数据更难识别问题?你可以尝试把训练数据变得更像开发集一点,或者你也可以收集更多类似你的开发集和测试集的数据。
- 比如说,如果你发现车辆背景噪音是主要的错误来源,那么你可以模拟车辆噪声数据,我会在下一张幻灯片里详细讨论这个问题(解决方法一)。
- 或者你发现很难识别街道号码,也许你可以有意识地收集更多数字音频数据(日常我们说的0123456789的数字音频数据)加到你的训练集里(解决方法二)。
- 现在我知道这张幻灯片只给出了粗略的指南,列出一些你可以做的尝试,这不是一个系统化的过程。
- 我想这不能保证你一定能取得进展,但我发现这种人工见解,我们可以一起尝试收集更多和真正重要的场合相似的数据,这通常有助于解决很多问题。
2.3、人工合成语音的方式创造更多的训练集, 让训练集数据更接近你的开发集,这样训练而来的系统能更好的识别开发集
- 所以,如果你的目标是让训练数据更接近你的开发集,那么你可以怎么做呢? 你可以利用的其中一种技术——人工合成数据技术来解决。我们讨论一下,在解决汽车噪音问题的场合下,通过语音合成技术达到我们的目标。
- 我们要建立语音识别系统,也许实际上你没那么多实际在汽车背景噪音下录得的音频,或者在高速公路背景噪音下录得的音频。
- 但是,我们发现可以合成你想要的数据,假设你录制了大量清晰的音频,不带车辆背景噪音的音频,比如说这可能是你的训练集里的一段音频(如图2-1所示,这段录音“the quick brown fox jumps over the lazy dog”)。
- 顺便说一下这个句子在 AI 测试中经常使用,因为这个短句包含了从 a 到 z 所有字母,所以你会经常见到这个句子。
- 但是有了这段录音之后,你也可以收集一段这样的汽车噪音(如图2-1所示),这就是汽车内部的背景噪音,如果你一言不发开车的话,就是这种声音。
- 如果你把两个音频片段放到一起,你就可以合成出这段录音的句子“the quick brown fox jumps over the lazy dog”在汽车背景噪音中的效果。
- 所以这是一个相对简单的音频合成例子,在实践中你可能会合成其他音频效果,比如混响,就是声音从汽车内壁上反弹叠加的效果。
- 所以,通过人工数据合成,你可以快速制造更多的训练集数据,就像真的在车里录的那样,那就不需要花时间实际出去收集数据,比如说在实际行驶中的车子,录下上万小时的音频。
- 所以,如果误差分析显示你应该尝试让你的数据听起来更像在车里录的(即训练集数据要接近开发集数据,开发集数据包含有噪声,更加接近实际数据),那么人工合成那种音频,然后喂给你的机器学习算法这样做,是合理的。
图 2-1
2.4、人工合成语音的录制噪声时间短,可能导致学习算法对合成的语音过拟合
- 现在我们要提醒一下,人工数据合成有一个潜在问题。
- 比如说你在安静的背景里录得 10000 小时音频数据,然后你只录了一小时车辆背景噪音,那么你可能将这 1 小时汽车噪音,回放10000次并叠加到在安静的背景下录得的 10000 小时数据。
- 如果你这么做了,听起来这个音频没什么问题,但是可能有一个风险就是你的学习算法对这 1 小时汽车噪音过拟合。
- 特别是如果这组汽车里录的噪声音频,可能是你可以想象的所有汽车噪音背景的集合,如果你只录了一小时汽车噪音,那你可能只模拟了全部噪声的数据空间的一小部分,你可能只从汽车噪音的很小的子集来合成数据,而对于人耳来说,这些音频听起来没什么问题,因为一小时的车辆噪音对人耳来说,听起来和其他任意一小时车辆噪音是一样的。
- 但你有可能从这整个空间很小的一个子集出发合成数据,神经网络最后可能对你这一小时汽车噪音过拟合。
- 值得注意的另一种情况是,我不知道收集 10,000 小时的汽车噪音是否可行,这样你就不用一遍又一遍地回放那 1 小时汽车噪音,你就有 10,000 个小时永不重复的汽车噪音,来叠加到 10000 小时安静背景下录得的永不重复的语音录音。
- 这是可以做的,但不保证能做到(傻子才会录10000小时的噪声语音),但是使用 10000 小时永不重复的汽车噪音而不是 1 小时重复,学习算法有可能取得更好的性能。
- 人工数据合成的挑战在于,人耳是无法分辨这 10000 个小时听起来和那 1 小时没什么区别。所以你最后可能制造出占噪声空间的很少部分数据(即只录制了1个小时的噪声,一个小时的噪声只是噪声空间的很少一部分),但你自己没意识到。
2.5、汽车图像合成可能过拟合的案例
- 这里有人工合成数据的另一个例子,假设你在研发无人驾驶汽车,你可能希望,检测出如图2-2 A这样的车,然后用这样的框包住它。
- 很多人都讨论过的一个思路是,为什么不用计算机合成图像来模拟成千上万的车辆呢?
- 事实上,这里有几张车辆照片(如图2-2),其实是用计算机合成的,我想这个合成是相当逼真的。我想通过这样合成图片,你可以训练出一个相当不错的计算机视觉系统来检测车子。
- 不幸的是,2.4小结介绍的情况也会在这里出现,比如这是所有车的集合,如果你只合成这些车中很小的子集,对于人眼来说,也许这样合成图像没什么问题。
- 但你的学习算法可能会对合成的这一个小子集过拟合,特别是很多人都独立提出了一个想法,一旦你找到一个电脑游戏里面车辆渲染的画面很逼真,那么就可以截图得到数量巨大的汽车图片数据集。
- 事实证明,如果你仔细观察一个视频游戏,如果这个游戏只有20辆独立的车,那么这游戏看起来还行,因为你是在游戏里开车,你只看到这 20 辆车,这个模拟看起来相当逼真。
- 但是,现实世界里车辆的设计可不只20种,如果你用着 20 量独特的车合成的照片去训练系统,那么你的神经网络很可能对这 20 辆车过拟合,但人类很难分辨出来,即使这些图像看起来很逼真,你可能真的只用了所有可能出现的车辆的很小的子集。
图2-2
2.6、小结
- 所以,总而言之,如果你认为存在数据不匹配问题,我建议你做错误分析,或者看看训练集,或者看看开发集,试图找出、试图了解这两个数据分布到底有什么不同,然后看看是否有办法收集更多看起来像开发集的数据作训练。
- 我们谈到其中一种办法是人工数据合成,人工数据合成确实有效,在语音识别中,我已经看到人工数据合成,显著提升了已经非常好的语音识别系统的表现。所以人工合成数据这是可行的。
- 但是,当你使用人工数据合成时,一定要谨慎要记住你有可能从所有可能性的空间只选了很小一部分去模拟数据,所以这就是如何处理数据不匹配问题。
- 接下来,我想和你分享一些想法,就是如何从多种类型的数据同时学习。