查看原文
其他

心法利器[39] | bad case治疗术:分析篇

机智的叉烧 CS的陋室 2022-08-24

心法利器


本栏目主要和大家一起讨论近期自己学习的心得和体会,与大家一起成长。具体介绍:仓颉专项:飞机大炮我都会,利器心法我还有

近期,我再次总结了我的历史文章,累积起来有50w字,百余篇文章了,有兴趣可以拿来看看,获取方式:七夕清流,百余篇累计50w字文章合集发布


往期回顾

bad case修复其实是一个非常考验内功的事情,我也在实践当中尽自己之力去理解和吸收,之前其实我也写过文章来讲bad case,感觉还是比较零散而不够完善(ML&DEV[13] | bad case分析NLP.TM[22] | 如何修正NLP问题的bad case),在后续的工作和学习中,自己慢慢的形成一些自己的经验,也逐步让这些经验体系流程化,最近一连4篇,给大家介绍一下如何修复bad case,具体的流程如下:

当然,我的视角主要从NLP、对话、搜索的角度来看的,对于信息更为复杂的推荐,希望大家在方法论上也能有些收获吧。

本期应该是重头戏了,讨论bad case如何分析,从而找到病源的方法。有了前面的铺垫,我们知道了现在我们算法方案的现状,比较宏观地知道方案要在哪个方向提升,接着这个宏观的信息,我们得以着手开始进行更加微观细节的分析了。

什么样的bad case适合被分析

结合现状分析,我们知道要优化算法的方面,例如准确率、召回率等,那么在这个比较宏观的思路下,我们去看影响准确率、召回率上升的因素在哪里,这就要求我们看准确率分错的case,看漏召回的case,这就是核心分析的对象。

数量上,个人建议在50个以上,200个以下吧,潜心分析下去,除非是发现了严重而又明显的bug,不分析到预定的数量,最好不要停止,少量的分析可能会影响我们的判断,有了一定统计意义的case分析好以后,我们才能知道主干问题在哪里,针对性突破解决,从而提升效果。

抽样上,建议一定要随机,这点很容易被忽略,非随机的分析可能会导致有些主干问题可能不会出现在待分析的样本里,虽然这个点很明显但是在实际应用中,要注意检查这个点。

bad case分析思路

好了,要开始分析了,很多人会和我说,感觉分析不出来,这里和大家好好聊聊我的主要分析思路吧。

粗看法

并非一个一个深究,而是比较笼统地大体上去看,错误的样本都有什么特点,带有那些特征,例如长度、句式等是否有什么特点,又或者是问句等等,这个只要通篇看下来,就会有比较明显的特点了,一下子能总结出比较突出的问题。

掌握方法,还是要了解其优缺点,粗看法的本质是快速看快速找到比较大的问题,优点就是快,但问题是你要能粗看的出来才行,所以缺点就是细节问题比较难发现,而且有些问题是比较深层次的,例如同样是问句,但是为什么问句就会出错,这个原因是很难探究的出来的,在baseline刚建立,效果还没有收敛的时候,这个方法非常有用,但是到了后期收官的时候,这个方法就不太好用了。

追溯法

追溯法是一个比较花时间的方法,就是对一个case,重现整个训练和预测过程的方法。给定一个bad case,准备好日志,分析预测的每个阶段的分析结果,查看是否符合预期,不符合预期的,大概率这个部分有bug、词典词汇等什么明显的问题了。

对于模型,本身效果我们则去训练样本里查找是否含有比较多的类似的bad case。例如我们在百科意图里发现很多问句会被误召回,这时候我们可以查查训练集中带有问句关键词的正负样本的比例是不是有问题,例如正样本远多于负样本,此时模型很可能就会认为只要带有疑问词的就是正类,我们需要加一些带疑问词的负样本进去,例如“为什么你的心情不好”这种属于闲聊类而非百科类的样本。

追溯法是比较常见的一种思考问题点的模式,从整个过程寻找问题的蛛丝马迹。要是想找到单个case问题的核心原因,这一步几乎是不可忽略的。

解决法

问题是用来解决的,我们的目标是发现问题,然后去解决,反过来,我们知道有哪些解决问题的方法,可以在没什么思路的时候,看看一些bad case是否可以用什么方式就可以解决(黑白名单可就没啥意思了啊),那我们就可以把问题归纳到这个方案上。

例如短句预测不正确,而且一般都比较模糊,所以我们考虑的是过滤所有短句,然后再通过白名单的方式补召回,那我们就可以把query归类为短句。

问题标记

case是需要我们逐个分析的,后续我们需要对重点问题进行归纳总结,所以case分析往往是需要我们做一些关键的记录,例如归因、解决方案的总结等等,所以,我们需要学会对case进行标记。来看个例子吧:

query原因分析
关闭短句
今天天气怎么样疑问词,关键词拒绝
你为什么疑问词,模糊
什么短句,疑问词

这是一些文本分类中发现的bad case,经过我们的分析,可以标注出一些我们分析得到的bad case,标记的时候注意词汇和问题的统一,方便我们后续统计各个问题的占比,值得注意的是,一个问题是可能有多个解决方法的,我们记得要标记上,统计分析的时候都是要关注的。

问题统计和归纳

有了上面的标记,我们能很轻易地看拿到各个问题的分布情况,甚至可以总结出来,例如上面的例子,有3个问题和疑问词有关,2个和短句有关,关键词拒绝和模糊分别都有1个,可以知道疑问词问题是占比最高的问题,我们需要去解决,具体怎么解决再说,反正核心就是占比高,所以我们肯定要针对性解决了,这种解决是批量解决的。

重点问题,基本就是占比高的问题,我们要是缓解甚至是解决,那对效果的影响无疑就是巨大的,在值不太高的场景,例如准确率只有60%,要是有一个问题的占比有50%,你要是完全解决了,那这个准确率的提升就是,那就是20%,哪怕只能解决这个问题的50%,也能提升10%嘛,这个量非常大。

时间问题

很多人会担心分析的时间会很长,但按照我的经验,小则5分钟解决战斗,多也就半小时,在解决问题毫无头绪的情况下,花点时间定位问题然后针对性解决,这个思路更加清晰了,和我在认知篇说的一样,大胆去做去分析就好了。

一些自己的思考

其实自己还挺喜欢case分析这块的工作的,算法的增长点、创新点都是从这里产生的,我们很多时候所谓的在努力地刷sota,是否有真正看过现在所谓的前沿方案,里面的bad case是什么样的,我们能通过什么方式让他变得更好,思路就是从中一点一点找出来的,所谓的明察秋毫,就是需要我们观察,bad case就是我们的线索,要突破必须要把这块东西给分析清楚。

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存