简介
MachineLearning YearningSharing 是北京科技大学“机器学习研讨小组”旗下的文献翻译项目,其原文由Deep Learning.ai 公司的吴恩达博士进行撰写。本部分文献翻译工作旨在研讨小组内部交流,内容原创为吴恩达博士,学习小组成员只对文献内容进行翻译,对于翻译有误的部分,欢迎大家提出。欢迎大家一起努力学习、提高,共同进步!
【关注本公众号,回复“MLY”,获取完整版PDF电子书】
致谢
Deep Learning.ai公司
吴恩达(原文撰稿人)
陆顺(1-5章)
梁爽(6-10章)
郑烨(11-15章)
吴晨瑶(16-20章)
玉岩(21-25章)
陈波昊(25-30章)
翟昊(31-35章)
高宏宇(36-40章)
丁韩旭(41-45章)
李汤睿(46-50章)
徐博文(51章及以后)
马聪 (整体汇总)
北京科技大学“机器学习研讨小组”
人工智能前沿学生论坛(Student Forum on Frontiers of Artificial Intelligence)
第一部分:吴恩达《ML Yearning》| 关于开发集、测试集的搭建
第二部分:吴恩达《ML Yearning》| 基础的误差分析& 偏差、方差分析
第三部分:吴恩达《ML Yearning》| 关于学习曲线的分析&与人类级别的表现对比
第四部分:吴恩达《ML Yearning》| 在不同的数据分布上训练及测设&Debug的一些推断算法
第五部分:吴恩达《ML Yearning》| 端到端的深度学习
53. 分部分析错误
分享人:徐博文
假如你的系统是使用一个复杂的机器学习流水线构建的,并且你希望改善系统的性能,你应该改善流水线中的哪一部分?通过对错误进行定位,你可以知道接下来工作的优先级如何分配。
我们还是用暹罗猫分类器例子:
第一部分猫检测器,检测猫并将它们从图像中提取出来。第二部分猫品种分类器,判断是否是暹罗猫。改进这两个流水线组件中的任何一个可能都需要花费数年时间,那么如何决定优先关注哪个(哪些)组件呢?
通过对各个部分进行错误分析,你可以尝试将算法所犯的每个错误归因于流水线的两个部分中的某一个(有时是两个)。例如,算法错误地将该图像判断为不包含暹罗猫 (y=0),而实际是包含的(y=1)。
我们来检查一下算法的两个步骤做了什么。假设暹罗猫检测器检测到的猫如下图所示:
这意味着猫品种分类器的输入图像如下图所示:
然后,猫品种分类器正确地将这张图片分类为不包含暹罗猫。因此,猫品种分类器是无可厚非的:给了它一堆岩石,并输出了一个非常合理的标签y=0。事实上,对上面裁剪图像进行分类的人也会预测y=0。因此,你可以清楚地将此结果归咎于猫检测器。
另一方面,如果猫检测器输出以下边框:
那么你就可以得出结论,猫检测器已经完成了它的工作,是猫品种分类器出了问题。
假设你浏览了100张错误分类的验证集图片,发现其中90个错误是由猫检测器造成的,而只有10个错误是由猫品种分类器造成的。那么你可以有把握地得出结论,你需要把更多的注意力放在改进猫检测器上。
进一步,你现在还可以很方便地找到90个猫检测器输出不正确边框的样本。你可以使用这90个样本对猫检测器进行更深层次的错误分析,看看如何改进它。
到目前为止,我们对如何将错误归结到流水线的某个部分的描述都是非正式的:查看每个部分的输出,看看是否能够确定哪个部分出错。这种非正式的方法可能就是你所需要的。但是在下一章,你会看到一种更正式的锁定错误的方式。
54. 锁定错误所在的部分
分享人:徐博文
让我们继续探讨这个例子:
假设猫检测器输出这样一个边界框:
猫品种分类器输入的是这个裁剪的图像,因此它错误地输出y=0,或者是说在图片中没有猫。
猫检测器的效果很差。然而,人仍然可以从这张剪得很差的图片中认出暹罗猫。那么,我们是将这个错误归因于猫检测器,还是猫品种分类器,还是两者兼而有之呢?这是模棱两可的。
如果像这样的模棱两可情况的数量很少,你做的任何决定得的到结果差别不大。但这里有一个更正式的测试,让你更明确地将错误归因于某个部分:
1. 用手工标记的边界框替换猫检测器的输出。
2. 将相应的裁剪图像作为输入,运行猫品种分类器。如果猫品种分类器仍然分类错误,则归咎于猫品种分类器。否则归咎于猫检测器。
换句话说,做一个实验,给猫品种分类器一个“完美”的输入。有两种情况:
- 情况1:即便用了“完美”的边界框,猫品种分类器仍然不能正确输出。在这种情况下,显然猫品种分类器是有问题的。
- 情况2:给定一个“完美”的边界框,现在的品种分类器正确输出y = 1。这表明,如果猫检测器提供了一个更完美的边界框,那么整个系统的输出就是正确的。因此,将错误归因于猫检测器。
通过对验证集中分类错误的图像进行分析,可以明确地将每个错误归因于某一个组件。这就能让你估计出流水线中每个组件的错误比例,从而决定将注意力集中在何处。
55. 锁定错误的一般方法
分享人:徐博文
以下是错误归因的一般步骤。假设流水线有三个步骤A、B和C,其中A直接进入B, B直接进入C。
对于系统在验证集上的每一个错误:
1. 尝试手动修改A的输出,使其成为“完美”输出(例如,框出猫的“完美”边框),并在此输出上运行流水线的其余部分B、C。如果这时算法给出了正确的输出,则表明,如果A给出了更好的输出,整个算法的输出就会是正确的;因此,你可以将此错误归因于组件A。否则,继续进行步骤2。
2. 尝试手工修改B的输出,使其成为B的“完美”输出。如果这时算法给出了正确的输出,那么将错误归因于组件B。
3. 将错误归因于组件C。
我们再看一个更复杂的例子:
你的自动驾驶汽车使用这条流水线。如何分析每一部分的错误来决定关注哪个组件?
你可以将这三个组件映射到A、B、和C,如下:
A: 检测车辆
B: 检测行人
C: 规划路径
按照上述的程序,假设你在一个封闭的赛道上测试你的汽车,发现汽车选择了一个比熟练司机操作更急促的转向。在自动驾驶领域,这种情况通常被称为一个场景。你会:
1. 尝试手动修改A(检测车辆)的输出,使之成为“完美”的输出(例如,告诉它其他汽车在哪里)。然后运行流水线的其余部分B、C,注意此时C (路径规划)使用的是A现在的完美的输出。如果算法现在为汽车规划了一条更好的路径,则表明,如果A给出更好的输出,整个算法的输出也会更好;因此,你可以将此错误归因于组件A。否则,继续进行步骤2。
2. 尝试手动修改B(检测行人)的输出,使其成为B的“完美”输出。如果算法现在给出了正确的输出,那么将错误归因于B组件。
3. 将错误归因于组件C。
ML流水线的组件应该按照无回路有向图(DAG)来排序,这意味着你应该能够以某种固定的从左到右的顺序来计算它们,后边的组件依赖于前边的组件的输出。只要组件A->B->C的遵循DAG顺序,就可以按照前述方法进行错误分析。如果你交换A和B,你可能会得到稍微不同的结果:
A: 检测行人(先前是检测车辆)
B: 检测车辆(先前是检测行人)
C: 规划路径
但是这个分析的结果仍然是有效的,并且可以很好地指导你把注意力集中在哪里。
56. 分部分析错误并与人类水平比较
分享人:徐博文
对学习算法进行错误分析,就是利用数据科学分析ML系统的错误,从而得出下一步该做什么。逐个部分地分析错误,可以告诉我们哪些组件的性能值得付出最大的努力来改进。
假设你有一个关于客户在网站上购物的数据集。数据科学家可能有许多不同的方法来分析数据。她可能会得出许多不同的结论,比如网站是否应该涨价,通过不同的营销活动获得的客户持续光顾,等等。分析数据集的方法没有“正确”之说,并且有用的见解可能会有很多。同样,也没有一种“正确”的方法来进行错误分析。通过这些章节,你已经学习了许多最常见的方法,可以对你的ML系统进行有效的分析,但是你也可以尝试其他方法来分析错误。
让我们回到自动驾驶这个例子上,汽车检测算法输出附近汽车的位置(可能还有速度),行人检测算法输出附近行人的位置,这两个输出最终用于规划汽车的路径。
调试这调流水线时,不必严格按照前述章节给出的方法,你可以思考:
1. 检测汽车组件与人类水平检测汽车的性能相差有多远?
2. 检测行人组件与人类水平的性能相差有多远?
3. 整个系统的性能与人类水平的性能相差有多远?在这里,人类级别的性能假设人类必须为汽车规划一条路径,只给出前两个流水线组件的输出(而不是观看摄像机的图像)。换句话说,当人得到同样的输入时,路径规划组件的性能与人的相比如何?
如果您发现其中一个组件的性能远远达不到人的水平,那么现在就可以集中精力改进该组件的性能。
当我们想让系统自动完成一些人类能做的事情时,错误分析过程能让系统运行到最佳状态,以至可以与人类级别的性能相媲美。我们前面的大多数例子都有这个隐含的假设。如果你正在构建一个ML系统,最终输出或其中一些中间组件正在做的事情,连人类自己都做不到,那么这些组件是不该使用的。
采用流水线的方式处理人类可解决问题,其另一个优点是——你有强大的分析错误的方法,因此你可以更有效地安排团队优先处理哪些工作。
57. 发现有缺陷的ML流水线
分享人:徐博文
如果ML流水线的每个单独组件的性能都达到了人的水平或接近人的水平,但是整个流水线远远低于人的水平呢,怎么办呢?这通常意味着流水线的设计有缺陷,需要重新设计。错误分析还可以帮助你了解是否需要重新设计流水线。
在上一章中,我们提出了三个组件的性能是否都达到人类水平的问题。假设能达到人类水平,也就是说:
1. 车辆检测组件(大致)达到人类从相机图像检测汽车的水平。
2. 行人检测组件(大致)达到人类从相机图像检测行人的水平。
3. 给出前两个组件的输出(而不是直接查看摄像机的图像)需要为车辆规划路径,与人类相比,路径规划组件的性能处于类似的水平。
可是,你的自动驾驶汽车的整体性能明显低于人类水平。即,获得摄像机图像的人可以为汽车规划出更好的路径。你能得出什么结论?
唯一可能的结论是ML流水线存在缺陷。在这种情况下,路径规划组件在给定其输入的情况下运行得很好,但是输入包含的信息不够。你应该问问自己,除了前面两个流水线组件的输出之外,还需要什么其他信息才能很好地规划汽车行驶的路径。换句话说,一个熟练的驾驶员还需要什么其他信息?
例如,假设你意识到人类驾驶员还需要知道路标的位置。这表明你应该重新设计的流水线如下1:
最后,如果你觉得你的流水线作为一个整体不能实现人级别的性能,即使每个单独的组件都具有人级别的性能(请记住,你是在人与组件有相同输入时进行比较),那么流水线是有缺陷的,应该重新设计。
1在上面的自动驾驶示例中,理论上,我们可以通过将相机的原始图像输入规划组件来解决这个问题。然而,这将违反51章中描述的“任务简单性”的设计原则,因为路径规划模块现在需要输入一个原始图像,需要解决的是一个非常复杂的任务。这就是为什么添加一个检测路标的组件是一个更好的选择——它可以帮助路径规划模块获得关于路标的重要信息和以前丢失的信息,却避免了模块过于复杂而无法构建/训练。
Conclusion
总结
58. 建立一个超级英雄的团队 – 让你的队友也看到这本书
分享人:徐博文
祝贺你读完这本书!
在第二章中,我们论述了这本书如何帮助你成为团队中的超级英雄。
比成为超级英雄更赞的就是成为超级英雄团队的一员。我希望你能把这本书分享给你的朋友和队友,共同创造更多的超级英雄!