Deep Learning Note: 2-1 设置机器学习应用

1. 训练集、开发集、测试集

  在训练模型时,通常会将整个用于训练的数据分成三部分:训练集(Train Set),保留的交叉验证集(Hold-out Cross Validation Set)或称为开发集(Development Set / Dev Set),和测试集(Test Set)。通常的工作流程是:

  1. 选择算法/超参数等条件。
  2. 使用训练集对模型进行训练。
  3. 使用开发集对训练得到的模型进行评估。
  4. 更换算法/超参数等条件,返回第 2 步。直到找到最佳的模型,继续第 5 步。
  5. 使用测试集对最终得到的模型进行评估,得到对其性能的无偏估计。

  在早期的机器学习领域,一般会按照 70% 和 30% 的比例划分训练集和测试集,或按照 60% / 20% / 20% 的比例划分训练集、开发集和测试集。在当时,可用的训练数据总量很少,比如总共有 100 ~ 10000 个样本,此时按照 70% / 30% 或 60% / 20% / 20% 的比例进行划分是十分合理的。

  在大数据时代,随着可用于训练的数据量大幅增加,开发集和测试集所占的比例逐渐缩小,因为开发集和测试集只是用来对模型进行评估,并不需要特别大的数据量。比如总共有 100 万个样本,可以选择 98% / 1% / 1% 的比例划分训练集、开发集和测试集。当数据量更大时,还可以选择如 99.5% / 0.25% / 0.25% 或 99.5% / 0.4% / 0.1% 的划分。

2. 非对称的训练集和测试集分布

  现代机器学习领域中的一个趋势是使用非对称的训练集和测试集分布。举例来说,对于一个从用户上传的图片中识别猫的应用,训练集可以是从网上找到的猫的图片,而开发集和测试集是实际用户上传的图片。对于训练集,从网上可以很容易地找到大量关于猫的高分辨率图片,甚至是专业摄影师拍摄的图片,质量很高。而对于开发集和测试集,用户上传的图片质量往往良莠不齐,比如手机拍摄的低分辨率图片,业余拍摄的失焦的图片等。此时,训练集和开发集/测试集的数据具有不同的分布。

  经验法则是,确保开发集和测试集来自同样的分布。开发集和测试集用于评估模型,二者具有相同的分布,特别是与实际应用场景的数据具有相同的分布,有利于通过开发集筛选得到更好的模型,以及通过测试集得到对模型的更准确的评估。而机器学习尤其是深度学习对训练数据有着极大的需求,通常会使用各种方法收集尽可能多的训练数据,比如使用爬虫、人工合成等手段,难以保证这些数据的分布能与开发集和测试集保持一致。

  有时候甚至可以不使用测试集,只保留开发集。测试集只适用于获取对最终模型的性能的无偏估计,如果不需要这一估计,就可以省略测试集。此时只使用开发集来寻找最佳的模型,开发集对模型性能的估计不是无偏的。

  通过划分训练集、开发集和测试集,可以更快速地对模型进行迭代和选择,也有助于测量和分析模型的偏差(Bias)和方差(Variance),以便选择合适的改进方法。

3. 偏差和方差

  在机器学习领域,偏差(Bias)描述的是学习算法的预测值与真实值之间的误差,它是由错误的预测带来的。方差(Variance)描述的是预测值的变化范围,它是由算法对数据集波动的敏感性带来的。图 1 分别展示了高偏差、恰当的偏差和方差、高方差三种情况。

图 1

图 1

  对于高偏差(High Bias)的情况,模型几乎是一条直线,产生大量的错误预测,称模型欠拟合(Under Fitting)于数据。对于高方差(High Variance)的情况,模型完全遵循训练数据的形状,一旦数据集发生变化,模型就不能很好地泛化(Generalize),称模型过拟合(Over Fitting)于数据。

  虽然从图像上可以清楚的分辨高偏差和高方差的情况,但对于更高维的场景,无法进行可视化,需要通过其他指标来进行判断。判断偏差和方差问题的两个主要指标是训练集错误开发集错误

  例如,对于解决某个分类问题的模型,人类在该问题上的错误率约为 0%,此时:

a. 假设训练集错误率为 1%,开发集错误率为 11%,此时模型在训练集上的性能很好,而在开发集上的性能明显低于训练集,不能很好地泛化,可以判断模型可能过拟合于训练数据,出现了高方差问题。

b. 假设训练集错误率为 15%,开发集错误率为 16%,此时虽然训练集和开发集的错误率相差不大,但模型在训练集上的性能就很差,欠拟合于数据,出现了高偏差问题。

c. 假设训练集错误率为 15%,开发集错误率为 30%,此时训练集错误率过大,存在高偏差问题,且开发集和训练集的错误率相差很大,存在高方差问题。

d. 假设训练集错误率为 0.5%,开发集错误率为 1%,此时模型在训练集上的性能很好,在训练集和开发集上的性能差不多,同时具有低偏差和低方差。

  需要注意的是,以上推断的前提是训练集和开发集的数据来自相同的分布,且人类在相同问题上的错误率约为 0%,此时使用人类基准估计最佳错误率或贝叶斯错误率(Bayes Error)约为 0%。如果最佳错误率为 15%,则上面的情况 b 模型的性能就已经很好了,而且训练集错误和开发集错误很接近,具有低偏差和低方差。

  综上所述,通过训练集错误,可以评估模型拟合训练数据的能力,判断偏差问题。通过比较训练集错误和开发集错误之间的差距,可以评估模型泛化的能力,判断方差问题。

4. 基本指南

  通过分析训练集错误和开发集错误,可以判断模型存在的偏差和方差问题,指导学习过程。

  例如在训练得到初始的模型后,首先通过训练集错误检查是否存在高偏差问题:如果存在高偏差问题,则可以尝试更大的网络、训练更长时间、使用更高级的优化算法等方法(有时选择不同的神经网络架构也有利于解决高偏差问题)。

  在解决了高偏差问题(即将偏差降低到可以接受的范围内)之后,模型至少能够很好地拟合训练数据了,再通过开发集错误检查是否存在高方差问题:如果存在高方差问题,可以尝试获取更多的数据、使用正则化(Regularization)等方法(有时选择不同的神经网络架构同样也有利于解决高方差问题)。

  重复前面的解决高偏差和高方差的步骤,直到获得同时具有低偏差和低方差的模型,即得到了最终的模型。

  在机器学习领域的早期,有很多关于偏差和方差的取舍(Bias Variance Trade Off)的讨论,因为当时可用的工具不多,采用一些手段降低偏差的同时通常会提高方差,反之亦然。但在现代深度学习和大数据时代,训练更大的网络通常总能降低偏差而不显著影响方差,而获取更多数据通常总能降低方差而不显著影响偏差。通过更大的网络和更多的数据,可以独立地降低偏差或方差,偏差和方差的取舍也就不那么明显了。只要应用了合适的正则化,训练更大的网络除了会消耗更多的计算资源,几乎总是有利无弊。