←上一篇 ↓↑ 下一篇→
2.1 误差分析 回到目录 2.3 快速搭建你的第一个系统,并进行迭代

清除标注错误的数据 (Cleaning Up Incorrectly Labeled Data)

你的监督学习问题的数据由输入 xxx 和输出标签 yyy 构成,如果你观察一下你的数据,并发现有些输出标签 是错的。你的数据有些标签是错的,是否值得花时间去修正这些标签呢?

我们看看在猫分类问题中,图片是猫, y=1y=1y=1 ;不是猫, y=0y=0y=0 。所以假设你看了一些数据样本,发现这(倒数第二张图片)其实不是猫,所以这是标记错误的样本。我用了这个词,“标记错误的样本”来表示你的学习算法输出了错误的 yyy 值。但我要说的是,对于标记错误的样本,参考你的数据集,在训练集或者测试集 yyy 的标签,人类给这部分数据加的标签,实际上是错的,这实际上是一只狗,所以 yyy 其实应该是0,也许做标记的那人疏忽了。如果你发现你的数据有一些标记错误的样本,你该怎么办?

首先,我们来考虑训练集,事实证明,深度学习算法对于训练集中的随机错误是相当健壮的(robust)。只要你的标记出错的样本,只要这些错误样本离随机错误不太远,有时可能做标记的人没有注意或者不小心,按错键了,如果错误足够随机,那么放着这些错误不管可能也没问题,而不要花太多时间修复它们。

当然你浏览一下训练集,检查一下这些标签,并修正它们也没什么害处。有时候修正这些错误是有价值的,有时候放着不管也可以,只要总数据集总足够大,实际错误率可能不会太高。我见过一大批机器学习算法训练的时候,明知训练集里有 xxx 个错误标签,但最后训练出来也没问题。

我这里先警告一下,深度学习算法对随机误差很健壮,但对系统性的错误就没那么健壮了。所以比如说,如果做标记的人一直把白色的狗标记成猫,那就成问题了。因为你的分类器学习之后,会把所有白色的狗都分类为猫。但随机错误或近似随机错误,对于大多数深度学习算法来说不成问题。

现在,之前的讨论集中在训练集中的标记出错的样本,那么如果是开发集和测试集中有这些标记出错的样本呢?如果你担心开发集或测试集上标记出错的样本带来的影响,他们一般建议你在错误分析时,添加一个额外的列,这样你也可以统计标签 y=1y=1y=1 错误的样本数。所以比如说,也许你统计一下对100个标记出错的样本的影响,所以你会找到100个样本,其中你的分类器的输出和开发集的标签不一致,有时对于其中的少数样本,你的分类器输出和标签不同,是因为标签错了,而不是你的分类器出错。所以也许在这个样本中,你发现标记的人漏了背景里的一只猫,所以那里打个勾,来表示样本98标签出错了。也许这张图实际上是猫的画,而不是一只真正的猫,也许你希望标记数据的人将它标记为 y=0y=0y=0 ,而不是 y=1y=1y=1 ,然后再在那里打个勾。当你统计出其他错误类型的百分比后,就像我们在之前的视频中看到的那样,你还可以统计因为标签错误所占的百分比,你的开发集里的 yyy 值是错的,这就解释了为什么你的学习算法做出和数据集里的标记不一样的预测1。

所以现在问题是,是否值得修正这6%标记出错的样本,我的建议是,如果这些标记错误严重影响了你在开发集上评估算法的能力,那么就应该去花时间修正错误的标签。但是,如果它们没有严重影响到你用开发集评估成本偏差的能力,那么可能就不应该花宝贵的时间去处理。

我给你看一个样本,解释清楚我的意思。所以我建议你看3个数字来确定是否值得去人工修正标记出错的数据,我建议你看看整体的开发集错误率,在我们以前的视频中的样本,我们说也许我们的系统达到了90%整体准确度,所以有10%错误率,那么你应该看看错误标记引起的错误的数量或者百分比。所以在这种情况下,6%的错误来自标记出错,所以10%的6%就是0.6%。也许你应该看看其他原因导致的错误,如果你的开发集上有10%错误,其中0.6%是因为标记出错,剩下的占9.4%,是其他原因导致的,比如把狗误认为猫,大猫图片。所以在这种情况下,我说有9.4%错误率需要集中精力修正,而标记出错导致的错误是总体错误的一小部分而已,所以如果你一定要这么做,你也可以手工修正各种错误标签,但也许这不是当下最重要的任务。

我们再看另一个样本,假设你在学习问题上取得了很大进展,所以现在错误率不再是10%了,假设你把错误率降到了2%,但总体错误中的0.6%还是标记出错导致的。所以现在,如果你想检查一组标记出错的开发集图片,开发集数据有2%标记错误了,那么其中很大一部分,0.6%除以2%,实际上变成30%标签而不是6%标签了。有那么多错误样本其实是因为标记出错导致的,所以现在其他原因导致的错误是1.4%。当测得的那么大一部分的错误都是开发集标记出错导致的,那似乎修正开发集里的错误标签似乎更有价值。

如果你还记得设立开发集的目标的话,开发集的主要目的是,你希望用它来从两个分类器 AAA 和 BBB 中选择一个。所以当你测试两个分类器 AAA 和 BBB 时,在开发集上一个有2.1%错误率,另一个有1.9%错误率,但是你不能再信任开发集了,因为它无法告诉你这个分类器是否比这个好,因为0.6%的错误率是标记出错导致的。那么现在你就有很好的理由去修正开发集里的错误标签,因为在右边这个样本中,标记出错对算法错误的整体评估标准有严重的影响。而左边的样本中,标记出错对你算法影响的百分比还是相对较小的。

现在如果你决定要去修正开发集数据,手动重新检查标签,并尝试修正一些标签,这里还有一些额外的方针和原则需要考虑。首先,我鼓励你不管用什么修正手段,都要同时作用到开发集和测试集上,我们之前讨论过为什么,开发和测试集必须来自相同的分布。开发集确定了你的目标,当你击中目标后,你希望算法能够推广到测试集上,这样你的团队能够更高效的在来自同一分布的开发集和测试集上迭代。如果你打算修正开发集上的部分数据,那么最好也对测试集做同样的修正以确保它们继续来自相同的分布。所以我们雇佣了一个人来仔细检查这些标签,但必须同时检查开发集和测试集。

其次,我强烈建议你要考虑同时检验算法判断正确和判断错误的样本,要检查算法出错的样本很容易,只需要看看那些样本是否需要修正,但还有可能有些样本算法判断正确,那些也需要修正。如果你只修正算法出错的样本,你对算法的偏差估计可能会变大,这会让你的算法有一点不公平的优势,我们就需要再次检查出错的样本,但也需要再次检查做对的样本,因为算法有可能因为运气好把某个东西判断对了。在那个特例里,修正那些标签可能会让算法从判断对变成判断错。这第二点不是很容易做,所以通常不会这么做。通常不会这么做的原因是,如果你的分类器很准确,那么判断错的次数比判断正确的次数要少得多。那么就有2%出错,98%都是对的,所以更容易检查2%数据上的标签,然而检查98%数据上的标签要花的时间长得多,所以通常不这么做,但也是要考虑到的。

最后,如果你进入到一个开发集和测试集去修正这里的部分标签,你可能会,也可能不会去对训练集做同样的事情,还记得我们在其他视频里讲过,修正训练集中的标签其实相对没那么重要,你可能决定只修正开发集和测试集中的标签,因为它们通常比训练集小得多,你可能不想把所有额外的精力投入到修正大得多的训练集中的标签,所以这样其实是可以的。我们将在本周晚些时候讨论一些步骤,用于处理你的训练数据分布和开发与测试数据不同的情况,对于这种情况学习算法其实相当健壮,你的开发集和测试集来自同一分布非常重要。但如果你的训练集来自稍微不同的分布,通常这是一件很合理的事情,我会在本周晚些时候谈谈如何处理这个问题。

最后我讲几个建议:

首先,深度学习研究人员有时会喜欢这样说:“我只是把数据提供给算法,我训练过了,效果拔群”。这话说出了很多深度学习错误的真相,更多时候,我们把数据喂给算法,然后训练它,并减少人工干预,减少使用人类的见解。但我认为,在构造实际系统时,通常需要更多的人工错误分析,更多的人类见解来架构这些系统,尽管深度学习的研究人员不愿意承认这点。

其次,不知道为什么,我看一些工程师和研究人员不愿意亲自去看这些样本,也许做这些事情很无聊,坐下来看100或几百个样本来统计错误数量,但我经常亲自这么做。当我带领一个机器学习团队时,我想知道它所犯的错误,我会亲自去看看这些数据,尝试和一部分错误作斗争。我想就因为花了这几分钟,或者几个小时去亲自统计数据,真的可以帮你找到需要优先处理的任务,我发现花时间亲自检查数据非常值得,所以我强烈建议你们这样做,如果你在搭建你的机器学习系统的话,然后你想确定应该优先尝试哪些想法,或者哪些方向。

这就是错误分析过程,在下一个视频中,我想分享一下错误分析是如何在启动新的机器学习项目中发挥作用的。

课程板书





←上一篇 ↓↑ 下一篇→
2.1 误差分析 回到目录 2.3 快速搭建你的第一个系统,并进行迭代

2.2 清除标注错误的数据-深度学习第三课《结构化机器学习项目》-Stanford吴恩达教授相关推荐

  1. 0.0 目录-深度学习第五课《序列模型》-Stanford吴恩达教授

    文章目录 目录 第五课 第四课 第三课 第二课 第一课 目录 第五课 <序列模型> 笔记列表 Week 1 循环序列模型 Week 1 传送门 -> 1.1 为什么选择序列模型 1. ...

  2. 0.0 目录-深度学习第四课《卷积神经网络》-Stanford吴恩达教授

    文章目录 第五课 第四课 第三课 第二课 第一课 第五课 <序列模型> 笔记列表 Week 1 循环序列模型 Week 1 传送门 -> 1.1 为什么选择序列模型 1.2 数学符号 ...

  3. 3.11 结论和致谢-深度学习第五课《序列模型》-Stanford吴恩达教授

    结论和致谢 (Conclusion and thank you) 恭喜你能走到这一步,在最后这节视频中,只想做个总结,并给你一些最后的想法. 我们一起经历了一段很长的旅程,如果你已经学完了整个专业的课 ...

  4. 3.10 触发字检测-深度学习第五课《序列模型》-Stanford吴恩达教授

    触发字检测 (Trigger Word Detection) 现在你已经学习了很多关于深度学习和序列模型的内容,于是我们可以真正去简便地描绘出一个触发字系统(a trigger word system ...

  5. 2.7 负采样-深度学习第五课《序列模型》-Stanford吴恩达教授

    负采样 (Negative Sampling) 在上个视频中,你见到了Skip-Gram模型如何帮助你构造一个监督学习任务,把上下文映射到了目标词上,它如何让你学到一个实用的词嵌入.但是它的缺点就在于 ...

  6. 2.1 词汇表征-深度学习第五课《序列模型》-Stanford吴恩达教授

    词汇表征 (Word Representation) 上周我们学习了RNN.GRU单元和LSTM单元.本周你会看到我们如何把这些知识用到NLP上,用于自然语言处理,深度学习已经给这一领域带来了革命性的 ...

  7. 1.1 为什么选择序列模型-深度学习第五课《序列模型》-Stanford吴恩达教授

    ←上一篇 ↓↑ 下一篇→ 4.12 总结(第四课) 回到目录 1.2 数学符号 为什么选择序列模型 (Why Sequence Models?) 在本课程中你将学会序列模型,它是深度学习中最令人激动的 ...

  8. 2.11 计算机视觉现状-深度学习第四课《卷积神经网络》-Stanford吴恩达教授

    ←上一篇 ↓↑ 下一篇→ 2.10 数据扩充 回到目录 2.12 总结 计算机视觉现状 (The State of Computer Vision) 深度学习已经成功地应用于计算机视觉.自然语言处理. ...

  9. 2.9 迁移学习-深度学习第四课《卷积神经网络》-Stanford吴恩达教授

    ←上一篇 ↓↑ 下一篇→ 2.8 使用开源的实现方案 回到目录 2.10 数据扩充 迁移学习 (Transfer Learning) 如果你要做一个计算机视觉的应用,相比于从头训练权重,或者说从随机初 ...

最新文章

  1. 2.1:CGPROGRAM
  2. Mysql 的使用方式,挺全的够用了
  3. Android禁用软键盘和取消禁用软键盘
  4. 【Java Web】Myeclipse下运用maven管理项目jar包
  5. C++--浅谈开发系统的经验
  6. PAT 1013 数素数 (20)
  7. 前端编码规范之JavaScript
  8. 所有进程的信息 linux,LINUX下获取所有进程信息
  9. w10恢复出厂设置_Win10系统恢复出厂设置和重装系统有什么区别?
  10. Asp.Net MVC Html.TextBoxFor日期格式化出错“模板只能用于字段访问、属性访问、一维数组索引或单参数自定义索引器表达式” 解决办法...
  11. WinForm 分屏 [ WinForm | Panel | 视频监控分屏 ]
  12. csdn积分怎么获取?
  13. oracle找出两张表中不同的数据
  14. c语言所有符号作用,c语言中的所有符号
  15. Mac SOME/IP编译以及Ubuntu的SOME/IP集成与编译
  16. 阿里的简历多久可以投递一次?次数多了有没有影响?可以同时进行吗?
  17. RPC:RPC的通信流程
  18. uniapp小程序一键连接wifi
  19. R语言地理加权回归数据分析
  20. HBase快速导入巨量数据—— Bulk Loading

热门文章

  1. 图片验证码的JAVA工具类
  2. iOS开发之AFNetworking 3.0.4使用
  3. 服务器被黑给我上了一课
  4. hdu1394 Minimum Inversion Number 线段树和树状数组
  5. Linux 线程实现机制分析
  6. 玩转Autorun.inf
  7. VC++ _T()宏学习
  8. mfc 使用画笔画线
  9. VC++ 拖放编程简单Demo
  10. Matlab 条形图实例