图片上传失败,请查看原文:https://github.com/iOSDevLog/100-days-of-ai/blob/master/r1-ml/day2-yearning/yearning.ipynb
Error analysis by parts
53. 由特定组件进行误差分析
假设您的系统是使用复杂的机器学习流水线构建的, 并且您希望提高系统的性能。你应该在哪些方面努力改进?通过将错误归因于流水线的特定组件, 您可以决定如何排定工作的优先级。
让我们使用我们的暹罗猫分类器示例:
[图片上传失败...(image-c55098-1538237677506)]
第一组件, 猫检测器, 检测猫, 并将其从图像中裁剪出来。第二组件, 猫品种分类器, 决定它是否是暹罗猫。有可能花费数年时间来改进这两个流水线组件中的任何一个。您如何决定要关注哪些组件?
通过组件进行误差分析, 您可以尝试将算法对流水线的两个组件 (或有时两者) 所犯的每一个错误进行属性化。例如, 该算法 misclassifies 此图像不包含暹罗猫 (y=0), 即使 y=1 是正确的标签。
[图片上传失败...(image-e12a35-1538237677506)]
让我们手动检查算法的两个步骤所做的操作。假设暹罗猫检测器检测到一只猫如下:
[图片上传失败...(image-ca53c4-1538237677506)]
这意味着猫品种分类器被赋予以下图像:
[图片上传失败...(image-bebcf2-1538237677506)]
猫品种分类器然后正确地分类这个图像不包含暹罗猫。因此, 猫品种分类器是无可指责的: 它被给予一堆岩石和输出一个非常合理的标签 y=0。事实上, 对上面裁剪过的图像进行分类的人也会预测 y=0。因此, 您可以清楚地将此错误归因于 猫 检测器。
另一方面, 如果 猫 检测器输出了以下边界框:
[图片上传失败...(image-d9e4ac-1538237677506)]
然后你会得出结论, 猫检测器已经完成了它的工作, 因此,猫品种分类器是错误的。
假设您通过 100 个 开发器集中的误分类图像, 并发现90的错误是由于 猫 检测器, 只有10错误是由于猫品种分类。你可以安全地得出结论, 你应该更加注意改进 猫 检测器。
54. 归因于错误到一个组件组件
让我们继续使用以下示例:
[图片上传失败...(image-e7a306-1538237677506)]
假设 猫 检测器输出了这个边界框:
[图片上传失败...(image-826c11-1538237677506)]
猫品种分类器因这个被裁剪的图象, 它错误地输出 y=0, 或者没有猫在图片
[图片上传失败...(image-bf8da2-1538237677506)]
猫检测器的工作做得不好。然而, 一个技能高的人仍然可以从裁剪不佳的图像判断出是暹罗猫。那么, 我们将此错误归因于 猫 检测器, 还是猫种分类器, 或者两者兼而有之?这是模棱两可的。
如果像这样的模棱两可的案例数量很小, 你可以做任何你想做的决定, 得到类似的结果。但这里有一个更正式的测试, 让您更明确地将错误归因于一个组件:
- 用手动标记的边界框替换 猫 检测器输出。
- 通过猫品种分类器运行相应的裁剪图像。 如果猫品种分类器仍将其错误分类,则将错误归因于猫品种分类器。 否则,将错误归因于猫检测器。
换句话说, 运行一个实验, 你给猫品种分类器一个 "完美" 的输入。有两种情况:
- 案例 1: 即使给定一个 "完美" 的边界框, 猫品种分类器仍然错误地输出 y=0。在这种情况下, 显然猫品种分类器是错误的。
- 案例 2: 给定一个 "完美" 的边界框, 品种分类器现在正确地输出 y=1。这表明, 如果只有 猫 检测器给出了一个更完美的边界框, 那么整个系统的输出将是正确的。因此, 将错误归因于 猫 检测器。
通过对开发集误分类图像进行此分析, 您现在可以明确地将每个错误归因于一个组件。这使您可以估计由于流水线的每个组件而产生的错误的分数, 因此决定将注意力集中在哪里。
55. 错误归属的一般情况
下面是错误归因的一般步骤。假设流水线有三步 A、B 和 C, 其中 A 直接进入 B, 而 B 直接进入 c。
[图片上传失败...(image-e75fa4-1538237677506)]
对于系统在开发集上所犯的每个错误:
- 尝试手动修改 A 的输出为 "完美" 输出 (如 猫 的 "完美" 边界框), 并运行此输出的流水线的其余组件 B C 。如果算法现在给出一个正确的输出, 那么这表明, 如果只有一个给定了更好的输出, 整个算法的输出将是正确的;因此, 可以将此错误归因于组件 A. 否则, 请转到步骤2。
- 尝试手动修改 B 的输出为 B 的 "完美" 输出。如果算法现在给出正确的输出, 则将错误归因于组件 B. 否则, 请转到步骤 3
- 将错误归因于组件 C
让我们来看看一个更复杂的例子:
[图片上传失败...(image-795406-1538237677506)]
你的自驾车车使用这条流水线。如何使用组件的误差分析来决定要关注哪些组件?
您可以将三组件映射到 A、B、C, 如下所示:
A: 检测车
B: 检测行人
C: 汽车的规划路径
按照上面描述的过程, 假设你在一个封闭的轨道上测试你的车, 并找到一个情况下, 汽车向比一个熟练的司机会选择一个更不和谐的转向。在自我驱动的世界里, 这种情况通常被称为一个场景。然后您将:
- 尝试手动修改 (检测车) 的输出为 "完美" 输出 (例如, 手动进入并告诉它其他汽车在哪里)。运行其余的流水线 B, c 和以前一样, 但允许 C (计划路径) 使用一个现在完美的输出。如果算法现在计划一个更好的路径为汽车, 那么这表明, 如果只有一个给了更好的输出, 整个算法的输出将是更好的;因此, 可以将此错误归因于组件 a. 否则, 请转到步骤2。
- 尝试手动修改 B (检测行人) 的输出为 "完美" 输出 b. 如果算法现在给出正确的输出, 则将错误归因于组件 b. 否则, 请继续执行步骤3。
- 将错误归因于组件 C。
ML 流水线的组件应根据有向非循环图 (达格·哈马舍尔德) 进行排序, 这意味着您应该能够以某种固定的从左到右的顺序计算它们, 以后的组件应仅依赖于早期组件的输出。只要将组件映射到 A >> B >> C 顺序之后, 就会出现误差分析。如果交换 A 和 B, 则可能会得到稍有不同的结果:
A: 检测行人 (以前是检测车)
B: 检测车 (以前检测过行人)
C: 汽车的规划路径
但是, 集中你的注意力, 这种分析的结果仍然是有效的, 并能提供良好的指导。
56. 基于组件的误差分析及与人的水平性能的比较
习算法进行误差分析就像是利用数据科学来分析 ML 系统的错误, 以便得出下一步该做什么的见解。在最基本的情况下, 由组件进行的误差分析告诉我们, 哪些组件的性能值得最大的努力来改进。
假设您有一个关于客户在网站上购买东西的数据集。数据科学家可能有许多不同的方法来分析数据。她可能会得出许多不同的结论, 关于网站是否应该提高价格, 关于通过不同的营销活动获得的客户的终生价值, 等等。没有一个 "正确" 的方法来分析数据集, 而且有许多可能有用的见解可以借鉴。同样, 没有一个 "正确" 的方法来进行误差分析。通过这些章节, 您已经学会了许多最常见的设计模式, 用于绘制关于 ML 系统的有用见解, 但您也应该随时尝试其他分析错误的方法。
让我们回到自我驱动的应用, 其中汽车检测算法输出的位置 (和可能的速度) 附近的汽车, 行人检测算法输出附近的行人的位置, 这两个输出最终被用来为汽车规划一条路。
[图片上传失败...(image-c6b2ef-1538237677505)]
要调试此流水线, 而不是严格遵循您在上一章中看到的过程, 您可以更非正式地询问:
- 检测车组件在检测车的人级性能方面有多远?
- 检测行人组件与人类水平的表现有多远?
- 整个系统的绩效从人力水平的表现有多远?在这里, 人类水平的性能假设人类必须为汽车规划一个路径, 只给出前两个流水线组件的输出 (而不是访问相机图像)。换言之, 当人被给予相同的输入时, 计划路径组件的性能与人类的相比如何?
如果您发现其中一个组件与人类级别的性能相去甚远, 那么您现在就有一个很好的案例来集中精力改进该组件的性能。
许多误差分析过程在我们试图自动化人类可以做的事情时最有效, 因此可以根据人类水平的表现来衡量。我们前面的大多数例子都有这个隐含的假设。如果你正在建立一个 ML 系统, 最终输出或一些中间组件正在做的事情, 甚至人类不能做好, 那么其中一些程序将不适用。
这是处理人类可以解决的问题的另一个好处--您有更强大的误差分析工具, 因此您可以更有效地排定团队工作的优先级。
57. 发现有缺陷的 ML 流水线
如果您的 ML 流水线的每个组件都表现在人级性能或近人级性能上, 但整个流水线远远低于人的水平呢?这通常意味着流水线有缺陷, 需要重新设计。误差分析还可以帮助您了解是否需要重新设计流水线。
[图片上传失败...(image-95cc7f-1538237677505)]
在前一章中, 我们提出的问题是, 三个组件的每一个性能是否在人的水平。假设所有三问题的答案都是肯定的。那么:
- 检测汽车组件(大致)是人类级别的性能,用于从摄像机图像中检测汽车。
- 检测行人组件(大致)是人类级别的性能,用于从摄像机图像中检测汽车。
- 与仅为前两个流水线组件的输出(而不是访问摄像机图像)计划汽车路径的人类相比,计划路径组件的性能处于类似水平。
然而, 你的整体自驾车汽车表现得远远低于人类水平的表现。也就是说, 人类获得相机图像可以为汽车规划出更好的路径。你能得出什么结论?
唯一可能的结论是 ML 流水线有缺陷。在这种情况下, 计划路径组件的工作方式以及它可以提供的输入, 但输入不包含足够的信息。你应该问自己, 除了前面两个流水线组件的输出之外, 还需要什么其他信息来为汽车的行驶规划提供良好的路径。换句话说, 一个熟练的人力驱动程序需要什么其他信息?
例如, 假设您意识到一个人的驱动程序也需要知道车道标记的位置。这意味着您应该重新设计流水线, 如下所示:
[图片上传失败...(image-454957-1538237677505)]
最终, 如果你不认为你的流水线作为一个整体将达到人的水平的性能, 即使每个单独的组件具有人性化的性能 (记住, 你是比较一个人谁被给予相同的输入作为组件), 然后流水线是有缺陷的, 应该重新设计。
结论(Conclusion)
58. 建立一个超级英雄团队-让你的队友读这个
恭喜你完成了这本书!
在第2章中, 我们讨论了这本书如何帮助你成为你的团队中的超级英雄。
[图片上传失败...(image-4232d8-1538237677505)]
唯一比成为超级英雄更重要的是成为超级英雄团队的一员。我希望你能把这本书的副本给你的朋友和队友, 并帮助创建其他超级英雄!
原文:https://github.com/iOSDevLog/100-days-of-ai/blob/master/r1-ml/day2-yearning/yearning.ipynb