人工合成数据
你的语音系统需要更多的数据,它们听起来就像是从车里录制得到的。与其在开车的时候收集大量的数据,不如通过人工合成数据来获取这些数据。
假设你获得了大量的汽车/道路噪音的音频剪辑。你可以从几个网站下载这些数据。假设你也有一群在安静的房间里说话的人。如果你把一个人的音频片段“添加”到一个汽车/道路噪音的音频片段,你会得到一个音频剪辑,听起来就好像那个人在嘈杂的汽车里说话一样。使用这个过程,你可以“合成”大量的数据,听起来就像是在汽车里收集的。
更一般的情况是,在一些情况下,人工合成数据允许你创建一个与开发集相当匹配的巨大数据集,让我们使用猫咪图像检测器作为第二个例子。你注意到,开发集的图像有更多的动态模糊,因为它们往往来自手机用户,他们在拍照时会微微地移动手机。你可以从网络图像的训练集中获取非模糊的图像,并将模拟的动态模糊添加到它们中,从而使它们更类似于开发集。
请记住,人工数据合成存在一定的挑战:有时候创建一个对人而言真实的合成数据比创建对计算机而言真实的数据要容易得多。例如,假设你有 1000 小时的语音训练数据,但只有 1 小时的汽车噪音。如果你反复使用相同的 1 小时的汽车噪音,从最初的 1000 小时的训练数据中,你将会得到一个合成的数据集,然而同样的汽车噪音会不断重复。听这段音频的人可能无法分辨——所有的汽车噪音对我们大多数人来说都是一样的——但是某种学习算法可能会“过拟合”一小时的汽车噪音。因此,它可能无法很好地泛化到一个新的音频剪辑片段,里面汽车的噪音听起来是不同的。
另一种情况,假设你有 1000 个小时的汽车噪音片段,但所有的噪音都是从 10 辆不同的车上提取的。在这种情况下,一种算法可能会“过拟合”这 10 辆车,如果在不同的汽车上进行音频测试,性能则会很差。不幸的是,这些问题很难被发现。
再举一个例子,假设你正在建立一个计算机视觉系统来识别汽车:你正与一家电脑游戏公司合作,该公司拥有几辆汽车的计算机图形模型。为了训练你的算法,你可以使用这些模型来生成汽车的合成图像。即使合成的图像看起来非常真实,但这种方法(已经被许多人独立提出)可能不会很好地工作。在整个电脑游戏中,可能有 20 种汽车设计。制造一辆汽车的 3D 模型价格是非常昂贵的;如果你在玩这个游戏,你可能不会注意到你正在一遍又一遍地看到同样的车,也许只是换了一种颜色。即这些数据对你来说很真实。但是,与所有在道路上行驶的汽车相比——也就是你可能在开发/测试集里看到的——这组根据 20 辆汽车模型合成的汽车只捕获了世界上销售的汽车的极小一部分。因此,如果你的 10 万个训练样本都来自这 20 辆车,你的系统将会“过拟合”这 20 款特定的汽车设计,而且它将无法很好地泛化到包含其他汽车设计在内的开发/测试集。
当你在合成数据时,请考虑一下你是否真的在合成一组具有代表性的样本。尽量避免给出合成数据的属性,这将使学习算法有可能将合成和非合成的样本区分开来——例如,所有的合成数据是否来自 20 个汽车设计中的某一个,或者所有的合成音频是否都来自于某个小时的汽车噪音。这个建议很容易被忽视。
在处理数据合成过程时,我的团队有时会花上几周的时间来生成带有细节的数据,这些数据与实际的数据分布非常接近,从而产生显著的效果。但如果你能够正确地获取这些细节,你可以突然获得比以前更大的训练集。