前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >day2-Machine Learning Yearning图片上传失败,请查看原文:https://github.com/iOSDevLog/100-days-of-ai/blob/master/r

day2-Machine Learning Yearning图片上传失败,请查看原文:https://github.com/iOSDevLog/100-days-of-ai/blob/master/r

作者头像
iOSDevLog
发布2018-10-10 16:50:33
5720
发布2018-10-10 16:50:33
举报
文章被收录于专栏:iOSDevLogiOSDevLog

图片上传失败,请查看原文: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. 用手动标记的边界框替换 猫 检测器输出。
  2. 通过猫品种分类器运行相应的裁剪图像。 如果猫品种分类器仍将其错误分类,则将错误归因于猫品种分类器。 否则,将错误归因于猫检测器。

换句话说, 运行一个实验, 你给猫品种分类器一个 "完美" 的输入。有两种情况:

  • 案例 1: 即使给定一个 "完美" 的边界框, 猫品种分类器仍然错误地输出 y=0。在这种情况下, 显然猫品种分类器是错误的。
  • 案例 2: 给定一个 "完美" 的边界框, 品种分类器现在正确地输出 y=1。这表明, 如果只有 猫 检测器给出了一个更完美的边界框, 那么整个系统的输出将是正确的。因此, 将错误归因于 猫 检测器。

通过对开发集误分类图像进行此分析, 您现在可以明确地将每个错误归因于一个组件。这使您可以估计由于流水线的每个组件而产生的错误的分数, 因此决定将注意力集中在哪里。

55. 错误归属的一般情况

下面是错误归因的一般步骤。假设流水线有三步 A、B 和 C, 其中 A 直接进入 B, 而 B 直接进入 c。

[图片上传失败...(image-e75fa4-1538237677506)]

对于系统在开发集上所犯的每个错误:

  1. 尝试手动修改 A 的输出为 "完美" 输出 (如 猫 的 "完美" 边界框), 并运行此输出的流水线的其余组件 B C 。如果算法现在给出一个正确的输出, 那么这表明, 如果只有一个给定了更好的输出, 整个算法的输出将是正确的;因此, 可以将此错误归因于组件 A. 否则, 请转到步骤2。
  2. 尝试手动修改 B 的输出为 B 的 "完美" 输出。如果算法现在给出正确的输出, 则将错误归因于组件 B. 否则, 请转到步骤 3
  3. 将错误归因于组件 C

让我们来看看一个更复杂的例子:

[图片上传失败...(image-795406-1538237677506)]

你的自驾车车使用这条流水线。如何使用组件的误差分析来决定要关注哪些组件?

您可以将三组件映射到 A、B、C, 如下所示:

代码语言:javascript
复制
A: 检测车
B: 检测行人
C: 汽车的规划路径

按照上面描述的过程, 假设你在一个封闭的轨道上测试你的车, 并找到一个情况下, 汽车向比一个熟练的司机会选择一个更不和谐的转向。在自我驱动的世界里, 这种情况通常被称为一个场景。然后您将:

  1. 尝试手动修改 (检测车) 的输出为 "完美" 输出 (例如, 手动进入并告诉它其他汽车在哪里)。运行其余的流水线 B, c 和以前一样, 但允许 C (计划路径) 使用一个现在完美的输出。如果算法现在计划一个更好的路径为汽车, 那么这表明, 如果只有一个给了更好的输出, 整个算法的输出将是更好的;因此, 可以将此错误归因于组件 a. 否则, 请转到步骤2。
  2. 尝试手动修改 B (检测行人) 的输出为 "完美" 输出 b. 如果算法现在给出正确的输出, 则将错误归因于组件 b. 否则, 请继续执行步骤3。
  3. 将错误归因于组件 C。

ML 流水线的组件应根据有向非循环图 (达格·哈马舍尔德) 进行排序, 这意味着您应该能够以某种固定的从左到右的顺序计算它们, 以后的组件应仅依赖于早期组件的输出。只要将组件映射到 A >> B >> C 顺序之后, 就会出现误差分析。如果交换 A 和 B, 则可能会得到稍有不同的结果:

代码语言:javascript
复制
A: 检测行人 (以前是检测车)
B: 检测车 (以前检测过行人)
C: 汽车的规划路径

但是, 集中你的注意力, 这种分析的结果仍然是有效的, 并能提供良好的指导。

56. 基于组件的误差分析及与人的水平性能的比较

习算法进行误差分析就像是利用数据科学来分析 ML 系统的错误, 以便得出下一步该做什么的见解。在最基本的情况下, 由组件进行的误差分析告诉我们, 哪些组件的性能值得最大的努力来改进。

假设您有一个关于客户在网站上购买东西的数据集。数据科学家可能有许多不同的方法来分析数据。她可能会得出许多不同的结论, 关于网站是否应该提高价格, 关于通过不同的营销活动获得的客户的终生价值, 等等。没有一个 "正确" 的方法来分析数据集, 而且有许多可能有用的见解可以借鉴。同样, 没有一个 "正确" 的方法来进行误差分析。通过这些章节, 您已经学会了许多最常见的设计模式, 用于绘制关于 ML 系统的有用见解, 但您也应该随时尝试其他分析错误的方法。

让我们回到自我驱动的应用, 其中汽车检测算法输出的位置 (和可能的速度) 附近的汽车, 行人检测算法输出附近的行人的位置, 这两个输出最终被用来为汽车规划一条路。

[图片上传失败...(image-c6b2ef-1538237677505)]

要调试此流水线, 而不是严格遵循您在上一章中看到的过程, 您可以更非正式地询问:

  1. 检测车组件在检测车的人级性能方面有多远?
  2. 检测行人组件与人类水平的表现有多远?
  3. 整个系统的绩效从人力水平的表现有多远?在这里, 人类水平的性能假设人类必须为汽车规划一个路径, 只给出前两个流水线组件的输出 (而不是访问相机图像)。换言之, 当人被给予相同的输入时, 计划路径组件的性能与人类的相比如何?

如果您发现其中一个组件与人类级别的性能相去甚远, 那么您现在就有一个很好的案例来集中精力改进该组件的性能。

许多误差分析过程在我们试图自动化人类可以做的事情时最有效, 因此可以根据人类水平的表现来衡量。我们前面的大多数例子都有这个隐含的假设。如果你正在建立一个 ML 系统, 最终输出或一些中间组件正在做的事情, 甚至人类不能做好, 那么其中一些程序将不适用。

这是处理人类可以解决的问题的另一个好处--您有更强大的误差分析工具, 因此您可以更有效地排定团队工作的优先级。

57. 发现有缺陷的 ML 流水线

如果您的 ML 流水线的每个组件都表现在人级性能或近人级性能上, 但整个流水线远远低于人的水平呢?这通常意味着流水线有缺陷, 需要重新设计。误差分析还可以帮助您了解是否需要重新设计流水线。

[图片上传失败...(image-95cc7f-1538237677505)]

在前一章中, 我们提出的问题是, 三个组件的每一个性能是否在人的水平。假设所有三问题的答案都是肯定的。那么:

  1. 检测汽车组件(大致)是人类级别的性能,用于从摄像机图像中检测汽车。
  2. 检测行人组件(大致)是人类级别的性能,用于从摄像机图像中检测汽车。
  3. 与仅为前两个流水线组件的输出(而不是访问摄像机图像)计划汽车路径的人类相比,计划路径组件的性能处于类似水平。

然而, 你的整体自驾车汽车表现得远远低于人类水平的表现。也就是说, 人类获得相机图像可以为汽车规划出更好的路径。你能得出什么结论?

唯一可能的结论是 ML 流水线有缺陷。在这种情况下, 计划路径组件的工作方式以及它可以提供的输入, 但输入不包含足够的信息。你应该问自己, 除了前面两个流水线组件的输出之外, 还需要什么其他信息来为汽车的行驶规划提供良好的路径。换句话说, 一个熟练的人力驱动程序需要什么其他信息?

例如, 假设您意识到一个人的驱动程序也需要知道车道标记的位置。这意味着您应该重新设计流水线, 如下所示:

[图片上传失败...(image-454957-1538237677505)]

最终, 如果你不认为你的流水线作为一个整体将达到人的水平的性能, 即使每个单独的组件具有人性化的性能 (记住, 你是比较一个人谁被给予相同的输入作为组件), 然后流水线是有缺陷的, 应该重新设计。

结论(Conclusion)


58. 建立一个超级英雄团队-让你的队友读这个


恭喜你完成了这本书!

在第2章中, 我们讨论了这本书如何帮助你成为你的团队中的超级英雄。

[图片上传失败...(image-4232d8-1538237677505)]

唯一比成为超级英雄更重要的是成为超级英雄团队的一员。我希望你能把这本书的副本给你的朋友和队友, 并帮助创建其他超级英雄!

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018.09.30 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 图片上传失败,请查看原文:https://github.com/iOSDevLog/100-days-of-ai/blob/master/r1-ml/day2-yearning/yearning.ipynb
  • Error analysis by parts
    • 53. 由特定组件进行误差分析
      • 54. 归因于错误到一个组件组件
        • 55. 错误归属的一般情况
          • 56. 基于组件的误差分析及与人的水平性能的比较
            • 57. 发现有缺陷的 ML 流水线
            • 结论(Conclusion)
              • 58. 建立一个超级英雄团队-让你的队友读这个
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档