Deep Learning Note: 3-4 错误分析

1. 进行错误分析

  对于人类也可以解决的问题,如果算法的性能不及人类,则可以通过对算法出现的错误进行手工检查,来指导下一步的行动,这一过程称为错误分析(Error Analysis)。

  例如对于某个从图片中识别猫的分类器,发现其错误率为 10%,远高于预期。通过检查这个分类器分类错误的图片,发现它把一些图片中的狗也错误地识别成了猫。那么问题来了:是否应当着力提高分类器在狗的图片上的性能,如在训练集中加入更多狗的图片,或加入关于狗的特征,使得分类器能够更有效地区分猫和狗,避免将狗误判为猫。这个问题需要谨慎地确认,因为一旦决定提高分类器在狗的图片上的性能,从收集数据、设计特征到重新训练,需要花费大量时间,如果最后发现这样做的效果不大,大量的时间和精力就此浪费。

  为了进一步确认,需要进行错误分析,如:

  1. 收集分类器在开发集上做出了错误分类的一些图片,如 100 个左右。
  2. 数一数其中有多少个是狗。

  假设在错误分类的图片中,有 5% 是狗,这就说明如果彻底解决了将狗识别为猫的问题,分类器的错误率只会下降 5%,即错误率会从 10% 下降到 9.5%。由此得到了解决将狗识别为猫的问题后,模型性能提高量的上限,即性能最多提高 5%。

  假设在错误分类的图片中,有 50% 是狗,这就说明如果彻底解决了将狗识别为猫的问题,分类器的错误率会下降 50%,即错误率会从 10% 下降到 5%。此时可以对解决将狗识别为猫的问题所带来的收益更有信心。

  虽然在机器学习领域,对于人工的过多介入有一些争议,但对于实际应用的系统,通过这样的错误分析,可以快速找到前进的方向,节省很多时间。只要花 10 分钟数一数 100 分类错误的样本,就可以对各个方案的收益做出估计,从而更好地决定下一步的行动。

  上面的例子通过错误分析,对一个方案的收益做出了估计。有时也可以同时对多个方案进行评估。例如有以下方案来进一步提高分类器的性能:

  • 解决将狗识别为猫的问题
  • 解决将大型猫科动物(如狮子、黑豹等)识别为猫的问题
  • 提高在模糊图片上的性能

  为了对以上三个方案做出评估,可以建立一张表格,每一行代表一个样本(图片),每一列代表一个方案所要解决的问题。检查一些错误分类的样本,看看各个样本分别属于哪些方案所要解决的问题,并进行标记,最后统计样本属于各个问题的比例。例如第 1 张图片是狗,第 2 张图片很模糊,等等,如表 1 所示。

表 1

图片 大型猫科动物 模糊图片 备注
1 斗牛犬
2
3 雨天 动物园
合计 8% 43% 61%

  在进行上述步骤的过程中,可能还会发现新的问题,比如一些花哨的滤镜也会对分类器的判断产生影响,此时可以再在表格中添加一列,记录属于滤镜问题的样本。

  通过填写这样的表格,我们可以估计解决各个问题所能产生的收益,例如对于表 1 的情况,大量错误来自模糊的图片,也有不少错误来自大型猫科动物的图片,解决这些问题的潜在收益较大。而在将狗识别为猫的问题问题上,无论解决得多好,分类器的性能最多提升 8%。

  错误分析通过手工检查算法在开发集中给出错误预测的样本,如假阳性和假阴性的样本,对各种错误的原因进行统计,可以预估进一步提升算法性能的各个方案的潜在收益,得到各个方案的优先级,决定前进的方向,有时还可以发现新的错误类型。

2. 处理具有错误标签的数据

  在监督学习的训练数据中,每个样本都由特征和标签组成,如果发现有一些数据的标签有误,可以通过下面的过程来决定是否有必要修正这些被错误标记的数据。注意这里“具有错误标记的数据”指的是数据本身有误,而不是算法预测了错误的标签。

  例如对于训练图片中识别猫的分类器,如果发现训练集中有一张狗的图片也被标记为了猫,这个样本的标签就是错误的。

  深度学习算法不容易受到训练集中随机错误的影响。对于训练集中被错误标记的数据,如果这些错误数据的分布接近于随机(例如标记数据的人会偶尔犯一些错误),占比很小,且数据总量足够大,那么可以不去处理这些被错误标记的数据。另一方面,深度学习算法更容易受到训练集中系统性错误的影响。例如某个负责标记数据的人一直把白狗标记为猫,这就对算法产生影响,导致分类器把白狗也分类为猫。

  如果开发集和测试集中也存在被错误标签的数据,那么可以在错误分析的过程中,记录具有错误标签的数据的个数,如表 2:

表 2

图片 大型猫科动物 模糊图片 数据具有错误的标签 备注
98 标记者漏掉了背景中的猫
99
100 猫的画像,不是真猫
合计 8% 43% 61% 6%

  错误分析中分析的是算法给出错误预测的样本,对于这些错误,可能是算法真的预测错了,也可能是数据本身的标签有误。例如对于表 2 的第 98 个样本,算法在这个样本上预测错误,但通过人工检查,发现实际上是这个样本本身的标签有误,标记这个样本的人看漏了背景中的猫,将样本标记为不是猫;而算法发现了背景中的猫,预测为是猫。通过表 2 的合计一行,可以知道算法有 6% 的预测错误是因为数据本身的标签有误。

  那么是否有必要修正这 6% 的具有错误标签的数据呢?如果这些具有错误标签的数据显著影响了通过开发集评估算法性能的能力,那么就有必要修复这些数据。此时需要检查:

  • 开发集的整体错误率:假设为 10%
  • 具有错误标签的数据引起的错误率:10% * 6% = 0.6%(由表 2 可知有 6% 的错误来自具有错误标签的数据,则其带来的错误率为整体错误率的 6%)
  • 其他原因引起的错误率:10% – 0.6% = 9.4%

  由上面的数据可以看出,相比其他原因,由具有错误标签的数据带来的错误率占比较小,此时花时间修复被错误标记的数据可能效率较低,可以降低其优先级。

  再举一例,假设通过调优,开发集的整体错误率下降到了 2%,而由具有错误标签的数据引起的错误率仍为 0.6%,占比为 30%,这些错误实际上并不是因为算法预测有误,而是数据本身的标签有误。此时通过开发集已经不能很好地评估模型性能了,例如有两个分类器,其错误率分别为 2.1% 和 1.9%,但我们并不能根据这两个数值判断那个分类器性能更好,因为其中有 0.6% 的错误率是因为数据有误,并不是分类器预测有误。具有错误标签的数据显著影响了通过开发集评估算法性能的能力,有必要修复这些数据。

  在修复具有错误标签的数据时,建议遵循以下准则:

  • 对开发集和测试集应用同样的处理流程,保证它们来自相同的分布。
  • 考虑也同时修复算法预测与标签一致,但实际上数据标签有误的样本。检查算法预测与标签不一致的样本,从中找出并修复标签有误的数据比较容易,但也存在算法预测与标签相符,而样本本身的标签有误,实际上是算法预测错误的情况。如果只修复算法预测与标签不一致的、标签有误的样本,之后对算法错误的预测就会产生偏斜。因此也有必要修复算法预测与标签一致的、标签有误的样本。但这样做的难度较大,因为需要检查所有(开发集和测试集的)数据,而不仅仅是算法预测与标签不符的一小部分。
  • 如果只修复了开发集合测试集,而没有修复训练集,此时训练集和开发/测试集就会具有不同的分布,这是可以接受的,学习算法具有足够的健壮性来克服这一问题。但开发集合测试集必须具有相同的分布。

3. 快速构建第一个系统,然后迭代

  在构建一个全新的机器学习应用时,往往会面临很多的选择和提升系统性能的方向,一个建议是快速构建第一个系统,然后迭代,即:

  • 确定开发集/测试集和评价指标
  • 快速构建初始系统
  • 使用偏差/方差分析、错误分析来决定下一步工作

  快速构建初始系统的意义在于,可以用训练数据对其进行训练,从而通过各种分析方法和工具找到前进的方向。

  如果你对于所要解决的问题已经有了非常丰富的经验,或者对于该问题已经有了大量的研究和文献可供参考,则也可以利用这些经验,在初始阶段就构建一个复杂的系统。而对于首次接触的问题,则一开始不必将问题考虑得过于复杂,先快速搭建一个初始的系统,找到努力的方向,进行迭代。