专栏首页AI小白入门Macheine Learning Yearning学习笔记(三)

Macheine Learning Yearning学习笔记(三)

Chapter 13~Chapter18 详细讨论了常见的基本的误差分析


Chapter 13、Build your first system quickly, then iterate(快速构建第一个系统,然后再一步步迭代)

  • 在做工程项目时,不要试图一开始就设计完美的系统。
  • 相反,应该快速构建和训练出第一版基本系统(也许在短短的几天内)。即使基本系统与您能构建的“最佳”系统相差甚远。
  • 研究基本系统的功能仍很有价值:您将很快找到向您最有希望提升性能的方向的线索。
  • 接下来的几章将告诉您如何去发掘这些线索。

Chapter 14、Error analysis: Look at dev set examples to evaluate ideas(错误分析:查看开发集样本来评估idea)

错误分析(Error Analysis)是指检查开发集中算法错误分类的样本的过程,以便了解错误的深层原因。它不仅可以帮助你重点发展项目,而且还能启发一些新的方向。

当你使用猫app时,注意到一些被错误识别成猫的狗的样本。一些狗长的像猫!这个时候你会怎么做?和第三方软件合作,使系统可以更好的处理狗样本?(这样做会花费你大量的时间)。建议你首先评估一下它实际上会提高多少系统的准确率。然后你才能理性地选择是否值得花费这么多开发时间。

我们可以先进行错误分析:

(1)获取100个系统错误分类的样本

(2)手动查看这些样本,计算其中狗的图像占多少比例

在该案例中,如果你发现有5%的错误分类的图像是狗,那么无论你在狗的问题上做多少改进,你都不会消除超过5%的错误。换句话说,5%是上述建议能够达到的改进上限。因此,如果整个系统当前的准确率为90%(误差10%),这一改进可能得到最多90.5%的准确率(或者9.5%的错误率,比原来10%的错误率少5%)。(提高了10%*5%=0.5%)

相反,如果你发现50%的错误图像都是狗,那么你应该更相信加入第三方软件能产生很大的效果。它能将准确率从90%提升到95%(误差相对减少50%,从10%降到5%)

这种简单的错误分析过程能够给你一个快速的方法来评估为“狗”问题加入第三方软件是否值得。它为决定是否应该做出这笔投资提供了一个定量的基准。

错误分析通常会帮你找出不同的想法间哪些更有前景。实际上许多工程师不愿意进行错误分析。相比于质疑这个想法是否值得花时间投入,直接跳入并实现一个想通常会更让人感到刺激。这是一个常见的错误:这可能导致你的团队话费一个月时间只带来很少的收益。

下面几章分别介绍错误分析的几个最佳实践


Chapter 15、Evaluating multiple ideas in parallel during error analysis(在错误分析过程中并行评估多个想法)

假设你的团队有以下几个想法来改进猫检测器:

(1) 解决狗被错认为是猫的问题

(2) 解决“大形猫科类动物(great cats)”(狮子,豹等)被错认为是家猫(宠物)的问题

(3) 提高系统在模糊图像上的表现

你可以并行且有效地评估所有这些想法。我通常会创建一个电子表格,查看100个分类错误的开发集样本并填写在表格上,同时记下可以帮助我记住具体样本的注释。用开发集里的4个错误分类样本来说明这个过程,你的电子表格大概如下所示:

表格中的图片3在Great Cat 和Blurry两列都被勾选了:可以将一个样本与多个类别相关联。这就是为什么底部的百分比加起来不一定等于100%。

虽然我已经将这个过程首先描述为类别分类(Dog, Great cat, Blurry),然后查看样例并对它们进行分类。实践中,当你在查看样例时,可能受到启发而提出一些新的错误类别。例如,也许查看过十几张图像后,你发现许多错误的图片都经过Instagram 过滤器的预处理。你可以返回并在电子表格中添加“Instagram”列。手动查看算法出错的样例,并思考人是 如何/是否 能正确地分类这些样例,这通常会启发你提出新的类别和解决办法。

错误分析是一个迭代的过程。开始的时候你在脑海里甚至可以没有任何分类。通过查看图片,你可能会提出一些关于错误类别的想法。然后查看并手动分类一些图片以后,可能会启发你想出一些新的错误类别,根据新的类别再返回重新检查这些图片,以此类推。

假如完成了100个开发集样本的错误分析,得到了如下表格:

现在我们可以知道解决狗分类错误的项目最多可以消除8%的错误。致力于Great cat和Blurry的错误分类对项目帮助更大。因此,你可能会挑选后两者之一来进行处理。如果你的团队有足够多的人可以同时展开多个方向,你也可以让一些工程师处理Great cat问题,另外一些解决Blurry的问题。

错误分析并不会得出一个明确的数学公式来告诉你什么才是最高优先级的任务。你还必须考虑你希望在不同错误类别上取得多少进展,以及处理每个错误类别所需要的工作量,这样才能更好的权衡先做什么


Chapter 16、Cleaning up mislabeled dev and test set examples(清理标记错误的开发和测试集样本)

在错误分析期间,你可能会注意到开发集中的一些样本被标记错误(mislabeled)。例如,一些不是猫的图片被错贴标签为猫,反之亦然。

你应该纠正开发集中的标记错误吗?记住,开发集的目的是为了帮你快速评估算法,以便你可以判断算法A或B谁更好。如果被错误标注的开发集的一小部分妨碍你做出这些判断的能力,那么花时间去修正错误标注的开发集标签是值得的。

例如,假设你的分类器表现如下:

  • 开发集的整体准确率……90%(10%整体错误率)
  • 贴错标签样本导致的错误……0.6%(开发集错误的6%)
  • 其他原因导致的错误……9.4%(开发集错误的94%)

这里,相对于你可能正在改进的9.4%的错误,由于错误标注导致的0.6%的不准确率可能没有那么重要。手动修正开发集中错误标注的图像并没有什么坏处,但这样做并不是关键:不知道系统是否有10%或9.4%的整体错误可能没什么问题。

假设你不断改进cat分类器并达到以下性能:

  • 开发集整体准确率……98.0%(2.0%整体错误率)
  • 贴错标签样本导致的错误……0.6%(开发集错误的30%)
  • 其他原因导致的错误……1.4%(开发集错误的70%)

30%的错误是由于错误标注的开发集图像造成的,这将会为您的准确率估计增加显著的错误。现在去提高开发集中标签的质量是有价值的。处理错误标注的样本将帮助您算出分类器的错误是接近1.4%还是2%——这是一个相对显著的差异。

无论你采用什么方法来修正开发集,记得也将其用于测试集,以便开发集和测试集继续服从相同的分布


Chapter 17、If you have a large dev set, split it into two subsets, only one of which you look at(如果你有一个很大的开发集,将其分成两个子集,只着眼于其中的一个)

假设你有一个含有5000个样本的大开发集,其中有20%的错误率。这样,算法将对约1000个开发图片进行错误分类。手动检查1000张图片会花费很长时间,所以我们可能决定在错误分析中不使用所有图片。

在这种情况下,我会明确地将开发集分成两个子集,只看其中一个,另一个不看。你将会很快的过拟合手动查看的那部分。你可以使用未手动查看的部分来调参。

继续上面的例子,在该例子中算法将错误分类5000个开发集样本中的1000个。假设我们想手动检查约100个错误样本(错误样本的10%)进行分析。你应该随机选择10%的开发集,并将其放入我们称之为 Eyeball 开发集(Eyeball dev set)中,以提醒我们自己,我们正在用眼睛看它。(对于语音识别项目,你可以在其中听音频剪辑,或许可以将数据集称为 Ear dev set)。因此,Eyeball 开发集有500个样本,其中我们预计算法会错误分类约100个。

开发集的第二个子集叫做 Blackbox 开发集(Blackbox dev set),它将拥有剩余的4500个样本。你可以使用 Blackbox 开发集,通过测量它们的错误率来自动评估分类器。也可以使用它来选择算法或调超参。但是,你应该避免用眼睛去看它。我们使用术语“Blackbox”是因为我们只使用数据集的子集来获得分类器的“Blackbox”评估。

为什么我们将开发集明确分为 Eyeball 开发集和 Blackbox 开发集呢?既然你会获得 Eyeball 开发集中样本的直观认识,你就会开始更快的过拟合 Eyeball 开发集。如果你发现 Eyeball 开发集比 Blackbox 开发集性能提升的更快,你已经过拟合 Eyeball 开发集了。这种情况下,你可能需要丢弃它并找一个新的 Eyeball 开发集,可以通过将更多 Blackbox 开发集中的样本移到 Eyeball 开发集中,也可以通过获取新的标注数据来获得。

将开发集明确地分为 Eyeball 和 Blackbox 可以让你知道何时手动误差分析过程开始导致过拟合数据的 Eyeball 部分。


Chapter 18、How big should the Eyeball and Blackbox dev sets be?( Eyeball 和 Blackbox 开发集应该多大?)

你的 Eyeball 开发集应该足够大,大到可以让你了解到算法的主要错误类别。如果你正在从事一项人类表现很好的任务(如识别图像中的猫),以下是一些粗略的指导方针:

  1. 一个使你的分类器犯错10次的 Eyeball 开发集将被认为是非常小的。只有10个错误,很难准确估计不同错误类别的影响。但如果您的数据非常少,而且不能负担的起更多 Eyeball 开发集,有总比没有好,这将有助于项目的优先顺序。
  2. 如果分类器在 eyeball 开发集上样本上犯了约20个错误,你将会开始大致了解主要的错误来源。
  3. 如果有约50个错误,你将会比较好的了解主要的错误来源。
  4. 如果有约100个错误,你将会很清楚主要的错误来源。我见过有人手动分析更多的错误——有时候多达500个。只要你有足够多的数据,这将是无害的。

假设你的分类器有5%的错误率。为了确保在 Eyeball 开发集中有约100个错误标记的样本,Eyeball 开发集应该有约2000个样本(因为 0.05*2000 = 100)。分类器的错误率越低,为了获得足够多的错误来分析,Eyeball 开发集需要越大。

Blackbox 开发集该如何?

我们之前说过,开发集有约1000-10000个样本是正常的 。为了完善这个表述,尽管更多的数据几乎没什么坏处,一个有1000-10000个样本的 Blackbox 开发集通常会为你提供足够的数据去调超参和选择模型。一个含有100个样本的 Blackbox 开发集比较小,但仍然有用。

如果你有一个小的开发集,那么你可能没有足够的数据将其分成足够大的 Eyeball 和 Blackbox 开发集来满足他们的目的。相反,你的整个开发集可能不得不用作 Eyeball 开发集——即,你将手动检查所有的开发集数据。

在 Eyeball 和 Blackbox 开发集之间,我认为 Eyeball 开发集更重要(假设你正在研究一个人类能够很好解决的问题,检查这些样本能帮你获得洞察力)。如果你只有一个 Eyeball 开发集,你可以在这个开发集上进行错误分析、模型选择和调超参。只有一个 Eyeball 开发集的缺点是过拟合开发集的风险更大。

如果你有数据的充足访问权限,那么 Eyeball 开发集的大小将主要取决于你有时间去手动分析样本的数量。例如,很少有人会手动去分析超过1000个错误。


Chapter 19、Takeaways: Basic error analysis(小贴士:基本错误分析)

  1. 当开始一个新项目时,尤其是在一个你不是专家的领域,很难正确猜测出最有前景的方向。
  2. 所以,不要在一开始就试图去设计和构建一个完美的系统。相反,应尽可能快(可能在短短几天内)的构建和训练一个基本系统。然后使用错误分析去帮助你识别最有前景的方向,并从那迭代地改进你的算法。
  3. 通过手动检查约100个算法错误分类的开发集样本来执行错误分析,并计算主要的错误类别。用这些信息来确定优先修正哪种类型的错误。
  4. 考虑将开发集分为手动检查的 Eyeball 开发集和不手动检查的 Blackbox 开发集。如果在 Eyeball 开发集上的性能比在 Blackbox 开发集上好很多,那么你已经过拟合 Eyeball 开发集,并且应该考虑为其获得更多的数据。
  5. Eyeball 开发集应该足够大,以便于算法有足够多的错分类样本供你分析。对很多应用来说,含有1000-10000个样本的 Blackbox 开发集已足够。
  6. 如果你的开发集不够大到可以按照这种方式进行拆分,那么就使用 Eyeball 开发集来用于手动错误分析、模型选择和调超参。

参考:

1.http://www.mlyearning.org/

2.https://xiaqunfeng.gitbooks.io/machine-learning-yearning/content/


更多个人笔记请关注:

知乎专栏:https://www.zhihu.com/people/yuquanle/columns

公众号:StudyForAI(小白人工智能入门学习)

本文分享自微信公众号 - AI小白入门(StudyForAI)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-12-31

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 深入剖析Mean Shift聚类算法原理

    Mean Shift在计算机视觉领域的应用非常广,如图像分割,聚类和视频跟踪,小编曾经用Mean Shift实现目标跟踪,效果还不错。本文详细的总结了Mean ...

    小草AI
  • opencv 8 --背景减除 -- BackgroundSubtractorMOG2

    例如顾客统计,使用一个静态摄像头来记录进入和离开房间的人数;或者是交通摄像头,需要提取交通工具的信息等。

    wust小吴
  • python算法与数据结构-栈(43)

      栈作为一种数据结构,是一种只能在一端进行插入和删除操作。它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹...

    Se7eN_HOU
  • opencv 9 -- 轮廓 层次结构

    使用函数 cv2.findContours 来查找轮廓, 我们需要传入一个参数:轮廓提取模式(Contour_Retrieval_Mode)。 我们总是...

    wust小吴
  • Appium+python自动化(十二)- Android UIAutomator终极定位凶器(超详解)

    乍眼一看,小伙伴们觉得这部分其实在异性兄弟那里就做过介绍和分享了,其实不然,上次介绍和分享的大哥是uiautomatorviewer,是一款定位工具...

    北京-宏哥
  • 实习杂记(27):android中关于横竖屏切换的那些事

    关于Android中Activity的横竖屏切换问题可以通过AndroidManifest.xml文件中的Activity来配置:

    wust小吴
  • 实习入职第五天:参数中的可变参数等小知识点

    Returns the position of the enum constant in the declaration. The first constant...

    wust小吴
  • Appium+python自动化(十三)- 输入中文 - 一次填坑记(超详解)

    无论你在哪里,在做什么都会遇到很多坑,这些坑有些事别人挖的,有些是自己挖的。别人挖的叫坑人,自己挖的叫自杀,儿子挖的叫坑爹。因此在做app自动化道路上也...

    北京-宏哥
  • 实习杂记(21):LocalBroadcastManager的使用、优点在哪里?

           它来自Android 的support包,类名是android.support.v4.content.LocalBroadcastManager...

    wust小吴
  • SAP ABAP实用技巧介绍系列之 ABAP XSLT 定义变量

    header变量的内容为一系列html tab,而color为一个简单的字符串. 在xslt program里使用$引用变量的内容:

    Jerry Wang

扫码关注云+社区

领取腾讯云代金券