42. 解决数据不匹配的问题

假设你开发出一套语音识别系统,该系统在训练集和训练-开发集上都表现得好,但是,它在你的开发集上表现不好——意味着你的系统存在数据不匹配的问题。你怎么办?

我的建议是:

  • 尝试去了解训练集和开发集的数据分布之间的哪些属性不一样;
  • 尝试去找到更多与你的算法遇到麻烦的开发集样本相匹配的训练集数据 [3]。

[3]:还有一些关于“域适应”的研究——如何在一个分布上训练算法,并将其泛化到其他分布中,这些方法通常只适用于一些特殊类型的问题,而且比本章节所描述的思想应用范围要小得多。

例如,假设您对语音识别开发集进行了误差分析:你手动检查了100个样本,并尝试分析出算法到底哪里出了问题。你发现你的算法性能不好,是因为在开发集数据样本中大部分的音频剪辑片段都是在汽车里录制的,而大部分的训练集数据样本都是在安静的环境下录制的,意味着,发动机和道路噪声极大的恶化了你的语音系统的性能。在这种情况下,你应该尝试去获取更多在汽车里录制的那些附带噪声的音频样本作为训练集数据。误差分析的目的是了解训练集和开发集分布之间的显著差异——这是导致数据不匹配的原因。

如果你的训练集和训练-开发集含有在车内录制的音频样本,你就应该再检测一下算法系统对其中部分数据的处理性能。如果算法对训练集中的车内录制音频样本表现良好,而对训练-开发集中的车内录制音频样本表现不佳,那么就进一步证实了获取更多车内录制数据会有用的假设。这就解释了在之前的章节中,我们为什么要讨论为你的训练集添加从相同分布的开发/测试集中选取的数据的可能性。这样你就能比较出算法分别对训练集中的音频样本和开发/测试集中的音频样本(两者均录制于车内)的性能差异了。

不幸的是,在这个过程中无法做出保证。 例如,如果你无法获得更多与开发集数据更匹配的训练集数据,则可能没有一个明确的途径来改进性能。