心法利器
本栏目主要和大家一起讨论近期自己学习的心得和体会,与大家一起成长。具体介绍:仓颉专项:飞机大炮我都会,利器心法我还有
近期,我再次总结了我的历史文章,累积起来有50w字,百余篇文章了,有兴趣可以拿来看看,获取方式:七夕清流,百余篇累计50w字文章合集发布
往期回顾
bad case修复其实是一个非常考验内功的事情,我也在实践当中尽自己之力去理解和吸收,之前其实我也写过文章来讲bad case,感觉还是比较零散而不够完善(ML&DEV[13] | bad case分析NLP.TM[22] | 如何修正NLP问题的bad case
现状篇:治疗bad case,首先要明确现状,就是现在的技术方案的真实效果如何。
分析篇:我们都知道要开始看bad case了,要怎么看,怎么分析出问题,在篇告诉你。
解决篇:知道病情,知道病因,就该开始治疗了。
当然,我的视角主要从NLP、对话、搜索的角度来看的,对于信息更为复杂的推荐,希望大家在方法论上也能有些收获吧。
本期第二篇,开始分析bad case之前要做的事情,概括的,我认为就是对宏观的现状有一个基本的了解,简单地说就是看指标,但是这点在我看来很多人其实做的并不好,我在这里给大家详细展开说一下吧,有则改之,无则加勉。
什么叫做现状
现在有一个基本baseline,baseline自然就有对应的评测集基线方案的效果,这个所谓的效果,就是现状,好or不好,是否需要持续优化,哪个方面需要持续优化,这就是所谓的现状,只有明确了宏观的现状,才能知道我们下一步的动作。
现状定位第一步——评测集
评测集可以理解为一份试卷,用来测试一个算法方案的效果,流程是这么个流程,但是这个流程的说法还是非常多的。
首先,要确认是一个完整意义的评测集,而不是一两条样本。这里背后有一个很关键点,就是不能用一两条case来断定一个方法的好或者坏,例如遇到了一个bad case,那就说明这个方法不好,这是草率的,要综合评定一个东西的好坏,不应该只看一次,而是应该看多次,所以需要的是一个具有一定数量的数据集。
第二,是一个具有一定统计意义的数据集。统计意义不仅仅是指的数量,简单地为了数量我们直接把同一条数据复制几十万次就完事了,我们都知道不应该这么做,那所谓的具有统计意义是什么意思,我的理解是这几个:
数量上能支撑特定指标的计算足够稳定。1条数据,误差就是100%,2条数据误差就是0.5了,到了100条,误差就只有1%,所以一般地数量足够多,抽样所带来的指标波动就会越小,结合数据集的实际使用需求,我们可以确定一个可靠数据集的数量。
抽样情况和实际使用的场景尽可能一致。最理想的情况,我们能用尽可能少的样本体现未来我们使用的时候可能出现的问题,这样能让我们在正式上线之前就把问题给暴露出来,其严重程度也可以从频次等方式快速得到观测,因此这个数据集我们希望的是能尽可能和正式的使用场景一致,最常用的方式就是用在线随机query来构造我们需要的评测集。
第三,质量可靠,足够支撑当前方案的数据集。但凡自己有看过些数据,其实都会发现哪怕是一些开源的数据集,也会出现标注错误的情况,更何况我们实际使用的更为复杂困难的数据集,因此我们需要尽可能保证的是,数据集质量足够高,出错的概率尽可能低,这样才能更好地用来测试我们的算法方案。最简单的检测方式就是自己拿100条出来自己标,看是否和预期相同,一般准确率在95%以上的数据集就可以说是非常靠谱了,90%只能说勉强可用,一般90%准确的数据顶多能支撑准确率在85%的方案的评测,再高你就会发现很多模型认为正确但是标注错误的case出现。
在科研的时候,我们可能会对着sota拼分数做实验,但是到了真正落地的场景,就会发现有一个可靠的评测集是多么困难,或者说我们可能很少会去找评测集中可能出现的问题,强如LCQMC的数据集依旧有大量错误,只是看我们当前的方案时候会因为这些错误而影响我们的评估和判断而已,有的时候LCQMC的准确率到了90%就上不去,很可能就是因为评测集中有些问题,所以不一定要为自己提了几个点而高兴,不妨先去看看数据。
但我们可以确定的是,评测集,这份试卷,必须得准备好,才能够用来评估算法效果,这步绝对不能轻易简化。
现状定位第二步——指标
算法最喜欢的就是结合指标评估效果,也就是我们所谓的现状,指标这个东西我们其实在初学算法的时候就已经了解很多了,这里为什么还要单独讲呢,原因其实和上面类似,表面上看着简单,其实里面的学问其实非常多。
首先,指标的设计必须要考虑观测的目标。指标是用来体现现状的,那要体现什么现状,这就是指标存在的根本。准确率是用来评估预测的正确性的,这个大家都知道,但是我们需要评估的是哪种方面的准确?这个就很关键了,例如我们在线的关键目标是为了避免误召回,要看误召回的情况,则准确率很自然地就会想到用“实际是该意图/算法预测该意图正类”来作为准确率指标,对于负类的预测情况,我们可能关心的并不多,所以就可以不设计在计算公式里了,这就是指标设计和背后的观测目标的关系。
其次,注重指标的口径。数据分析非常讲究一个点,就是口径,即我们取数据的条件,不同的条件取数据很可能会得到截然不同的结论,因此我们必须非常关注口径。举例,我们在分析和解决bad case的时候,针对多路召回,我们是要看每一路的效果情况来归因的,所以我们就要划分口径了,方案A召回的正类准确率是多少,方案B召回的准确率又是多少,所有出错的case中,哪一路召回的量最大,通过这样的口径切分和分析,我们能快速知道是哪个方案出现了问题,哪个方案的问题是关键问题。
第三,多个指标的组合观测。一个指标能让我们知道一个问题,但是有的时候单独看一个指标很可能会让我们忽略一切别的关键问题。例如,准确率虽然能让我们观测算法方案误召回的情况,一旦要优化准确率,召回的数量肯定也会随之降低,为了避免出现召回过低的问题,在看准确率的同时我们还要看召回率,两者平衡提升才是健康可靠的。
同样地,指标的合理设计、口径的关注以及指标的组合问题,都是我们需要综合考虑的。
现状定位第三步——结论
现状的确定,本身就是要求一个结论,现在算法效果好or不好,我们是否需要进行优化,经过一系列的现状分析,我们是能对当前算法有一个基本的认识,结论也就呼之欲出了。
首先,我们回顾一下预期的目标是什么。我们可能有一个比较明确的预期,例如准招是80%+,那我们只需要直接看好准招就够了,但是预期目标还是要有,毕竟得到一个结果80%,到底是高还是低,我们固然是很难得到的,我们要有一个预判,达到多少算是正常的,100%这事难度本身就大,别说现在的模型,让人来都很困难。
其次,这个结论本身是指导我们后续工作的,好or不好取决于我们是否还需要做进一步的优化,所以要下结论的时候,要顾及我们下一步的工作。
最后,如果我们还需要进一步优化我们当前的算法方案,在初步的结论下我们其实是可以总结出一些比较大的方向的,例如优化准确、扩大召回等等,具体怎么做,那是正式到了bad case分析的时候就会开始找,步步为营地,我们这一步要有一个模糊的方向,这个方向非常重要,毕竟我们要分析bad case,我们要知道哪些bad case是关键,这种宏观的信息是我们需要知道的。
小结
bad case之前的现状分析,可以说是让我们对现在的数据和效果有一个比较宏观的把握,好还是不好,好在哪不好在哪,未来的优化目标是什么样的。在这里,我们需要明确的是,每一个步骤都不能忽略,甚至是要努力做好,磨刀不误砍柴工,有这个思路和方法,找问题和分析问题的能力能大幅提升。