43. 人工合成数据

你的语音系统需要更多的数据,这些数据需要听起来需要像是录制自汽车里的。与其在开车时来收集数据,还不如通过人工合成的方法来更高效地获得数据。

假设你从一些网站下载得到了大量的纯粹的汽车/道路噪音音频剪辑数据。同时,你还有大量的关于人在安静的房间里讲话的训练集数据。方法是这样的:你将一个人在安静的房间里说话的训练集音频剪辑数据添加到汽车/道路噪音音频剪辑数据中,这样你就合成了一条新的音频数据,该数据听起来就像是有一个人在很吵的汽车里或者道路边上讲话一样。通过这种方法,我们就可以合成大量的数据,使得这些数据就好像是在车内录制的一样。

更一般地说,在一些情况下,人工数据合成允许您创建一个与开发集合理匹配的大型数据集。作为数据合成的第二个例子,我们回到我们的猫咪检测器案例中来,你注意到了在开发集中有相当一部分数据存在运动模糊的问题,因为它们都是来着用户手机上传的图片,手机拍摄加上用户的习惯导致了这些图片在拍摄的一瞬间发生了抖动。你该如何使用互联网上的那些高清图片去合成上述效果的图片呢?简单!为高清图片添加运动模糊滤镜,从而人为地使这些高清图片变的和开发集上的模糊图片差不多。

请记住,人工数据合成有一定的挑战性:有时合成出让人感觉真实的数据比合成出让计算机感觉真实的数据更容易。例如,假设您有 1000 小时的语音训练数据,但只有 1 小时的汽车噪音数据。如果你重复地利用这 1 个小时的汽车噪声数据去和这 1000 个小时语音训练数据的不同部分来合成数据,你最终会得到一个同一段噪音重复出现的合成数据集。当我们找一个人来听这段合成数据集中的音频时,他可能没法察觉出什么不同(其实所有的汽车噪声对于我们大多数人来说都是一样的),但是学习算法可能就会“过拟合”这 1 个小时的汽车噪声。这样的话,一旦新的音频片段里的汽车噪声和这 1 小时的汽车噪声不一样的话,泛化性能就会变得很差。

或者,假设你有 1000 小时的汽车噪音,但所有的这些噪音都来自 10 辆不同的汽车。在这种情况下,算法有可能“过拟合”这 10 辆车的噪声,导致如果我们对来自其他不同汽车的音频进行测试的时候算法表现就会变得很差。不幸的是,这些问题很难被发现。

再举一个例子,你正在构建一个识别汽车的计算机视觉系统,假设你与一家视频游戏公司合作,该公司拥有多辆汽车的计算机图形模型。为了训练您的算法,您可以使用这些模型生成汽车的合成图像,即使合成图像看起来非常逼真,但最终你会发现这种方法实际使用效果不好。这款游戏在整个视频游戏中可能有大约 20 辆汽车的模型——制作一辆汽车的 3D 模型的成本是非常大的。如果你在玩这个游戏,你可能不会注意到在游戏里你看到的汽车其实都是同一个模型(20 个当中的某一个),也许只是模型表面的喷漆不一样而已。换句话说,就是这些数据在你看来是很真实的。但与现实道路上的所有汽车的集合相比较,你就能发现这些来自于 20 个汽车模型生成的汽车数据对于整个世界的汽车分布来说只是其中极小的一部分。也就是说,如果你的如果您的 10 万个训练样本都基于这 20 辆汽车模型合成的话,那么很明显你的算法将“过拟合”这 20 个特定汽车模型,也就是意味着你的算法将无法泛化到有其他车型组成的开发/测试集中。

当综合数据时,考虑一下你是否真的合成了一组有代表性的样本。尽量避免在给出合成数据属性的情况下,使学习算法能够区分合成和非合成样本——然而如果所有合成数据都来自 20 辆汽车模型中的某一辆,或者所有合成音频都利用了这 1 小时的汽车噪音的话,这个建议将很难被遵循。

在进行数据合成时,我的团队有时会花上数周的时间,才能合成出一些与实际分布非常接近数据,从而更好的发挥出合成数据的效果来。但是一旦如果你能把细节弄清楚,你就能得到一个比以前大得多的训练集了。