2.1 进行误差分析(carrying out error analysis)

这一小节我们学习用误差分析来评估某个想法执行的价值。

当我们的算法还未达到人类水平时,人工检查一下算法所犯的错误也许可以让你了解接下来干什么,举个例子,如下图所示:

深度学习笔记(3):2.1-2.3 误差分析(error analysis)

假设猫分类器准确率为90%,误差为10%,在错误分类的例子中我们发现有上图中的两类狗图片(乍一看觉得是猫),为了让你的猫分类器在狗图上做得更好,你可能会设计一些狗的特有特征,或收集更多关于狗的图片去提高模型性能,但现在问题是需不需要做一个项目专门处理狗的问题,因为这样做可能会花费好几个月,但收效甚微。这样做值得吗?

现在有误差分析(error analysis)这一方法可以让你快速知道这样做到底值不值得。误差分析怎么做呢?

首先,我们需要从开发集或测试集中分错的例子中随机抽取100个,然后数一下分错的例子中有多少个是狗。假设100个中只有5个是狗但被错分为猫,那么即使全部解决狗的问题,也只能解决5个例子,即即使花费了好几个月全部解决狗的问题,也只是将犯错的概率从10%减少到9.5%,虽然你可能觉得这样花时间不值也可能觉得这样做是值得的,但至少误差分析给了你一个上限,即处理狗问题能够改善的算法性能的上限,我们也称其为性能上限(celing of performance)。

我们知道在机器学习中有些人会很鄙视人工操作或使用太多手工洞察(manual insight),但如果你要搭建应用系统,那这个简单的人工统计步骤误差分析,可以为我们节省大量时间,可以让我们迅速决定什么才是最重要的。误差分析用时不长且能告诉我们这个方向的价值,帮你决定是否把未来几个月的时间都用来解决狗图的问题上。

除了评估一个想法,误差分析也可以同时评估好几个想法,这可以提高我们效率,如下图所示:

深度学习笔记(3):2.1-2.3 误差分析(error analysis)

比如你有几个改善猫分类器的想法,可以建立电子表格来解决这样一个问题,其中行是图片数目,即你要人工观察的图片个数,而列是你要评估的想法,比如是否是狗、是否是大型猫科和是否模糊,同时在表格最右侧留下空位写评论,记录这个图片问题出在哪,比如第一个是斗牛犬,而第三张图分错是因为图片为雨天动物园,图片模糊且将大型猫科动物错分为小猫。

设置完表格之后我们就可以统计各类的犯错比例了,假设结果如上图所示。

在排查过程中,你可能还会发现其他错误类型,比如花哨的图片滤镜干扰了我们的分类器,这样在误差分析途中你就可以加上这一列,然后再过一遍统计一下滤镜导致的错误,上图中为12%。

误差分析的结果不是告诉我们说一定要处理模糊图片,这个分析也没有给一个严格的数学公式告诉我们一定要做什么,但它能让我们对选择哪些手段有个概念,告诉我们不论我们对狗图片或是滤镜图片处理的多好,在这个例子中最多只能取得8%-12%的性能提升。所以采用哪种手段取决于你想提升多少模型性能,你也可以选择两个目标,只要你的团队成员够多,你可以分成两个团队去分别解决大型猫科分类错误和图片模糊致分类错误的问题。

这个快速统计的步骤我们可以经常做,最多需要几小时,但是却可以为指引我们接下来的性能提升方向,为我们选择优先级任务,并且了解每种手段对提升性能有多大帮助。

2.2 修正错误标注的数据(cleaning up incorrectly labeled data)

标注错误的数据指训练集、开发集、测试集中的被错误标注的数据,如下图所示:

深度学习笔记(3):2.1-2.3 误差分析(error analysis)

上图中第六幅是狗图却被错标记为猫,可能是做标记的人数疏忽了,标记错误。那么当你发现你的数据标注错误时,该怎么办呢?

首先,对于训练集中的标注错误情况,事实证明,深度学习对训练集中的随机误差是非常鲁棒的,只要错误标记产生的误差离随机误差不远,有时可能做标记的人没有注意或不小心,比如说按键按错了,这也可以看作是一种随机的情况,所以如果误差足够随机,那么放着这些误差不管也没什么大问题。其实主要就是要考虑数据标注错误是无心之举还是有意为之。对于随机误差,修正也是可以的,但有时候修正这些是有价值的,有时候放着不管也可以,只要总数据集数目足够大,这样实际误差可能不会太高。

这里要重点说明一下深度学习对训练集中的随机误差是非常鲁棒的,这里强调的是随机误差,但不是系统性误差,即‘有意为之’,比如标记者一直将白色的狗标记为猫,这样你的学习器预测的时候就会认为所有白色的狗是猫,但如果是随机误差或或近似随机误差,对于大多数深度学习算法来说不是问题。

来看一个例子,如下图所示:

深度学习笔记(3):2.1-2.3 误差分析(error analysis)

上一小节,误差分析过程我们建立了如上图所示的电子表格,在统计分错原因的过程中,我们会发现一些标记错误的例子,比如标记者忽略了图片98背景中的猫,即标记者将该图标记为非猫,但分类器将其判为猫图,系统判定分类错误,但实际分类正确只是因为标记者错误标记,或是图片100的情况,图片是画出来的猫不是真实的猫,而标记者标为猫图,而系统判定为非猫,所以在我们希望图片是真猫的情况下,应该讲图画猫标记为非猫。

现在的问题是否值得去修正这6%标记出错的例子,吴老师的建议是,如果这些标记错误的例子严重影响了你在开发集上评估算法的能力,那就应该花时间修正错误标记的例子,但是如果没有严重到影响开发集评估成本偏差的能力,就不必大费精力去修正这些出错例子。

那什么样的程度我们称之为严重呢?

一般我们看三个指标。首先,看开发集误差,接着上小节例子,假设是10%,而电子表格统计结果显示100个例子中错误标记有6个,所以错误标记导致的开发集误差是0.6%,所以第三个指标其他原因导致的开发集误差是9.4%,这种情况下,就是我们认为的可将其看作随机误差的情况。

相反,若开发集误差是2%,而错误标记导致的开发集误差仍是0.6%,0.6%占2%的30%,这时我们就不得不考虑修正错误标记的例子。而且开发集的目的我们之前讲过,就是为了配合评判标准在AB方案中选择最合适的,如果是在错误标记导致的误差占比30%的情况下,即使A方案开发集误差2.1%,B方案开发集误差1.9%,我们也无法从中选择最优的,因为错误标记占比太高,导致开发集误差计算是不准确的。

修正数据集中错误标记样本要注意以下几点:

深度学习笔记(3):2.1-2.3 误差分析(error analysis)

首先是如果修改开发集中错误标记样本,测试集也需要同步进行,因为不要忘了开发集和测试集必须同分布,因为我们用开发集和评判标准调试算法就是为了使其能在测试集上泛化效果好,所以同分布是必然的。

其次,在查看错误分类样本的同时也要查看正确样本,为什么这么说呢?我的理解是这样的,假设你的算法真的存在系统性误差,虽然这种概率可能比较小,除非有人有意为之,假设将所有白狗标记为猫,如果白狗样本数还很多,那么在预测时大部分白狗被预测为猫,且你无法发现,因为系统判定是正确的,除非你使用独立标记的测试集去检验算法效果。在这种情况下,就很有必要要把正确分类的样本也检查一下是否标记正确。

但这样做很难,通常不会这么做,因为如果你的算法准确率很高,比如准确率98%,误差为2%,这时检查2%数据上的标签要简单得多,数据量远远小于98%对应的样本量。所以标记样本这一人工操作步骤要保证正确,这样就会减少很多不必要的麻烦。

最后,我们其实不太需要对训练集去修正,首先是训练集样本量大,对于随机误差深度学习算法一般具有鲁棒性,且训练集量大也不容易去修正,但开发集和测试集就不一样了,一是数量少,修正压力不大,二是开发集的作用就是配合评判标准评判算法性能,当然需要一定的准确度,不希望有大部分数据是因为标记错误而被系统算入误差内,而开发集和测试集同分布这是必须的。

这样你可能会问,如果训练集不修正,而开发集和测试集同步修正,会不会训练集和开发集分布不同,答案是会。但事实证明,即使训练集和开发集分布稍微不同,也不会有很大影响,之后小节我们也会再讲述这个问题。

2.3 快速搭建你的第一个系统、并迭代(build your first system quickly, then iterate) 

为什么说要快速搭建你的第一个系统、并迭代呢?我们从一个具体的领域介绍一下。如下图所示:

深度学习笔记(3):2.1-2.3 误差分析(error analysis)

吴老师已从事语音识别系统很多年,而语音识别系统有很多方向供你选择,也有很多方面供你优先考虑,比如说有一些特定的技术可以让语音识别系统对嘈杂的背景(noisy background)更稳健,比如咖啡店噪音,很多人在聊天,或者说是车辆的噪音,高速上汽车的噪音,或者其他噪音等;还有技术针对有口音的语音识别(accented speech);还有专门针对讲话人远离麦克风情况的技术,我们称之为‘远场语音识别’(far-field recognition);儿童的语音识别带来的挑战是单词发音方面还有他们倾向于选择的词汇;还有就是说话人口吃,或者是话语中夹杂了‘哦、啊’之类无意义的短语,对此可以选择特定的技术让听写下来的文本可读性更强、更流畅。

从上文可以看出我们可以做很多事情来改进语音识别系统,而一般来说,对于所有的机器学习项目,可能会有50个不同的方向供你选择,且每个方向都是相对合理的,并且可以改进你的系统, 但挑战在于你如何选择一个方向并集中精力研究。

如果要为新的程序构建新的系统,还是会觉得很难不思考问题就直接考虑方向,因为要改进的方向是存在问题中的,需要我们去一步步发现最能改善我们系统的方向。而快速搭建第一个系统、并迭代可以让我们有效率进行这一过程,‘快速搭建第一个系统、并迭代’是什么意思呢?

首先是设立目标(建立好开发集、测试集以及评判标准),然后建议马上搭好一个机器学习系统原型,然后用训练集训练模型然后看模型在开发集和测试集上表现如何,这样建立第一个系统之后,你就可以用之前偏差方差分析方法还有前两小节讨论的误差分析方法来确定下一步优先做什么。特别是如果误差分析让你意识到大部分的误差来源于说话人距离麦克风太远,这对语音识别是特殊挑战,这样你就有很好的理由去专门研究可以解决此类问题的技术。

建立这个初始系统的意义在于虽然刚开始你有一个快速但效果并不好的实现,但有了这个系统,我们才能接下来进行偏差和方差的分析以及误差分析,以确定接下来可以做什么去改善模型,从所有能走的方向中找出最有希望的方向。

如果你对要研究的问题有经验,或者要处理的问题已经有了很多文献,那么你可以一开始就构造比较复杂的系统,但如果你要研究的是一个新问题,那建议遵循马上搭好一个简单的机器学习系统原型并迭代,这样可以帮你条理清晰且快速地建立好机器学习系统。

 

版权声明:尊重博主原创文章,转载请注明出处https://blog.csdn.net/kkkkkiko/article/details/82015389

相关文章:

  • 2021-10-10
  • 2021-07-24
  • 2021-07-13
  • 2021-06-25
  • 2021-11-17
  • 2021-12-20
  • 2021-07-21
  • 2022-01-01
猜你喜欢
  • 2021-08-30
  • 2021-10-12
  • 2021-09-17
  • 2021-03-31
  • 2021-08-24
  • 2022-12-23
  • 2022-01-21
相关资源
相似解决方案