40. 从训练集到开发集的泛化

假设你正准备在训练集和开发/测试集分布不同的情况下中应用机器学习,比方说:训练集包含互联网图像 + 手机App图像,而开发/测试集却只包含手机App图像。不过,该算法运行起来效果不佳,以下是一些可能出些了问题的地方:

  1. 机器学习算法在训练集表现不佳。这是在训练集分布上出现了高(可避免)偏差的问题;
  2. 算法对训练集表现良好,但没法推广运用于之前没有见过的数据中(这些数据与训练集分布相同)。这是高偏差问题。
  3. 算法能很好地泛化到从与训练集相同的分布中抽取的新数据中,而不是从开发/测试集分布中抽取的数据。我们将此问题称之为:数据不匹配(Data Mismatch)——训练集数据和开发/测试集数据不匹配。

例如,假设人类在猫识别任务上达到接近完美的表现。 你的算法实现了这一点:

  • 在训练集上的误差有 1%;
  • 算法在和训练集相同分布中提取的新数据上的误差为 1.5%;
  • 开发集上的误差有 10%。

在这种情况下,显然存在数据不匹配的问题。要解决这个问题,您可以尝试使训练集数据去接近开发/测试集的数据,我们将在后续内容里讨论这类技术。

为了计算出算法受到上述各个问题(1、2、3)的影响程度,额外提供一个数据集是很有帮助的。具体来说,不是将所有的训练集数据都喂给算法,我们将训练集分为两部分:一部分是用于算法训练的实际训练集,另一部分我们则将它称为“训练-开发”集,该部分数据不参与算法训练。

因此,现在你有四个数据子集:

  • 训练集:这是拿来训练算法的数据集(例如:互联网图片+移动应用程序图片)。当然这不要求一定要和我们的真实数据分布(开发/测试集数据分布)一样。
  • 训练-开发集:这部分数据集来自与训练集相同分布(例如:互联网图片+移动应用程序图片),这通常比训练集要小。他只需要足够用来评估和跟踪我们学习算法的进度就行了。
  • 开发集:这与测试集的数据分布相同。,它反映了我们最终关注的数据的分布情况(例如:移动应用程序图片)。
  • 测试集:这是和开发集相同分布的数据集(例如:移动应用程序图片)。

有了这四个独立的数据集,您现在可以评估:

  • 训练误差,通过训练集进行评估;
  • 通过训练-开发集来评估算法泛化到与训练集相同分布的新数据的能力;
  • 使用开发/测试集来评估算法应用在你关心的数据分布上的能力。

在之前的 5-7 节中的提到的指导原则同样适用于训练-开发集。