从训练集泛化到开发集

假设你正在将机器学习应用于不同分布的训练集和开发/测试集上。例如,训练集包含了互联网图像+移动应用图像,而开发/测试集只包含移动应用图像。然而,该算法运行得不太好:它的开发/测试集误差比想要的要高得多。以下是一些可能出现问题的情况:

  • 它在训练集上表现不佳,这属于训练集分布上的高(可避免)偏差的问题。
  • 它在训练集上做得很好,但是不能很好地泛化到与训练集分布相同的未知数据,这是高方差问题。
  • 它能够很好地泛化到与训练集相同分布的未知数据,但不能很好地泛化到与开发/测试集相同分布的未知数据。我们将这种情况称之为数据不匹配,因为训练集的数据与开发/测试集的数据匹配得相当地糟糕。例如,假设人类在猫识别任务上取得近乎完美的表现。你的算法实现了:
  • 1% 的训练集误差
  • 1.5% 的与训练集分布相同的未知数据上的误差
  • 10% 的开发集误差

在这种情况下,显然存在着数据不匹配问题。为了解决这个问题,你可能会尝试使训练数据更类似于开发/测试数据。我们稍后将讨论一些相关技术。

为了诊断一个算法在上面 1 到 3 个问题受到了多大程度的影响,存在另一个数据集将是很有用的。具体地说,与其给算法提供所有可用的训练数据,你还可以把它分成两个子集:算法将进行训练的实际训练集,以及一个单独的集合,我们称之为“训练开发”集,我们将不会对它进行训练。

你现在有四个数据子集:

  • 训练集:这是算法将学习的数据(例如,互联网图像+移动应用图像)。这并不需要我们从与真正关心的相同分布(开发/测试集分布)的数据中提取。
  • 训练开发集:这些数据来自与训练集相同的分布(例如,互联网图像+移动应用图像)。它通常比训练集要小;它只需要足够大到来评估和跟踪我们的学习算法的进展。
  • 开发集:这是从与测试集相同分布的数据中抽取出来的,它反映了我们最终关心的数据的分布(例如,移动应用图像) 。
  • 测试集:这是从与开发集相同分布的数据中抽取出来的(例如,移动应用图像)。

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

  • 训练误差,对训练集进行评估。
  • 该算法能够泛化到与训练集相同分布数据的能力,并对训练开发集进行评估。
  • 算法在你实际关心的任务上的性能,通过对开发集 和/或 测试集评估。

在第 5-7 章中,用于选择开发集大小的大多数指导原则也适用于训练开发集。