心法利器[40] | bad case治疗术:解决篇

心法利器

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

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

往期回顾

bad case修复其实是一个非常考验内功的事情,我也在实践当中尽自己之力去理解和吸收,之前其实我也写过文章来讲bad case,感觉还是比较零散而不够完善(ML&DEV[13] | bad case分析NLP.TM[22] | 如何修正NLP问题的bad case

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

治疗术最后一篇,也是和问题最终决战的最后一篇,有了前面对问题的精准定位和分析,我们其实在这一步已经胸有成竹了,具体要怎么做,开讲。

模型预测错误的解决方案

算法工程师的舒适区就是模型,我们可以用模型的快速处理一些问题,但是缺点是调教模型在现实中难度其实并不大,因为大多数出问题的却不在模型本身,很多问题不是换模型就能够解决的,换模型带来的收益可能很小,那我们应该如何解决模型预测错误的问题呢?

样本的误导

条件概率的角度表示一个机器学习模型,其实就是,这个对大家来说理解并不困难,这里的就是一个模型了,对于一些数据内很浅层直白的信息,模型也会预测的非常直白,例如正类里面有大量含有“怎么”的样本,而负类里面没有,则模型很有可能会把所有带有“怎么”的句子都预测为正类,这个和模型的好坏是没关系的,因为这是数据指导模型学到的东西,因为这个数据就告诉了模型“带有”怎么的句子100%是正类了。在这个情况下,我们要解决这个问题的核心点就在于要调整这种数据,让模型摒弃这种想法,最直接的方式就是添加带有“怎么”的句子到负类数据里,平衡这种关系,告诉模型不能根据“怎么”来判断正负类,而是有其他信息。

当然,这是一个极端情况,但是这个对于面模型的问题非常常见,一般bad case中从句子层面发现了很明显共性的,大概率就是这个问题。

阈值的确定和权衡

阈值本质是个准入条件,准入的本质其实就是准招的权衡,这个才是一个完整的逻辑链路,因为阈值只是约束准入条件的其中一种方式(其他的我稍后再说),但又是和模型一起出现的标配,毕竟模型大部分时候只提供意见,要不要采纳还是要通过阈值。

既然阈值能控制准招,直线思路,那我们就对标准招来做权衡即可,取舍是肯定要取舍的,准招本身是一对矛盾的概念。我们需要一批数据做一套这样的预测实验(假数据,自己编的例子):

阈值准确率召回率
0.90.920.40
0.850.900.60
0.80.850.75
0.750.790.80

随着阈值的下降,准确率会下降,而召回率会上升,我们需要确定一个最佳阈值,对于搜索和对话场景,更多的是需要我们保准确,一般是0.85+,召回率另说,持续优化,因此这里我们就只能定阈值在0.8以上,最好的就是0.8了,于是阈值就定下来了。

没有标注数据的,请自行准备,必要时候只能自己标,这个在认知篇已经讲过了。

前后处理和预处理

模型可以处理很多问题,但不见得是所有问题,规则的存在,让我们能更快速解决一些问题,另外把一些内容进行了预处理做了一些改变后,预测起来会更加方便。

先聊预处理吧,预处理这是一个很模糊的概念,很多人也会问出“要怎么做预处理”的说法,我的回答一般只能是看场景和需求,预处理的本质是对数据进行处理使之更好地被用来预测,不同的场景和数据的预处理方式会很不同,哪怕是同样的NLP问题,到了细分场景也会有很多不同的操作,共同的可能是对标点的处理,而不同的例如客服场景要把“你好”之类的删除,语音助手要把“小爱同学”、“小布”之类的称呼删除等,重点不在于做了什么,而是要把一些对预测有影响干扰项、不利于预测的因素给去掉,至于哪些是干扰项,请回去看bad case,这些错误样本会告诉你。

前处理是指模型预测之前的处理,尤其在模型比较大,性能要求比较高的场景,我们需要把一些肯定确定能快速预测出来的东西给过滤掉,从而提升性能也降低模型的负担,最简单的例如黑白名单,复杂的可以有一些针对业务的规则,例如超短句或者超长句直接拒绝等等,能用规则的尽量用规则,能不用模型的尽量不用模型,模型的不可控性众所周知,我们知道修复bad case的困难性的情况下,没必要太往依赖模型了。

后处理是指在模型预测以后的一些调整,最直接能想到的就是阈值过滤,但不仅是这些,有的时候需要结合模型的预测打分进行调整,例如关键词抽取领域,需要对预测的重要性分数进行加减分,如句首词和句尾词要提权,对于百科的一些问题,语义相似度的定义可能会和实际应用不同,于是我们也要进行一些过滤,例如“五一节的由来”和“六一节的由来”从语义相似度上来说确实很接近,但是我们不能然你给他们相似,因为“五一节”和“六一节”很不同,所以我们通过“实体约束”来过滤掉他们,当然背后就需要一批实体词典了。其实后处理的本质就是一个对模型的修正,模型很难学习的东西,我们可以直接通过后处理的方式来修复这些问题。

当然,一些特定的规则,我们是可以痛过挖掘得到一些新的样本,这些样本批量放入模型的时候,是可以让模型去支撑一定的任务的,这也提升了泛化能力,这个方式非常适合在规则逐渐臃肿的情况下用来做减法,但值得注意的是,词典敏感的规则最好还是保留,毕竟词典的可枚举型要放到模型里需要依赖的样本会很多,模型没见过固然就不认识。

解决问题的验证和迭代

在进行一通操作以后,我们就要开始重跑验证集了,重新看看我们修复之后的效果如何,这就回到了我们的第一步——现状确认,重新确定我们是否还要优化,如果需要,则继续进行bad case分析,再持续优化,这是个螺旋上升的过程,我们持续分析持续优化就能逐步逼近最终目标最终效果。

有几个值得展开说的点再聊一下。

问题的暴露和转移

随之已知问题的解决,并不一定就会带来非常直接的优化,根本原因在于你很难知道箱子打开后里面是否还是箱子,老的问题不解决新的问题暴露不出来,或者是随着问题的逐步解决,很多问题会逐步从主要问题变成不主要的问题,新的问题会暴露出来。

做过推荐的小伙伴应该有很明显的感觉,推荐的论文里很多模型,看着实验效果很好但用起来效果就不明显甚至负向,很大一部分原因就是新模型没有解决问题,或者是解决的问题不是当前的核心问题,所以效果提升不够,例如要整所谓的用户序列,如果用户点击量不够,这个意义就不大,这个对于各个场景都是这样,我们随着学习都能有各种各样的装备武器来解决问题,但如果工具不适用于现在的核心问题,那用了的效果就是负向,这也是我希望大家多去分析的原因之一。

虽然问题千千万,一山放过一山拦,但随着解决,我们总会朝着目标靠近,持续努力即可。

什么时候该换模型

我一直没讲什么时候该换模型,我放在这里讲,因为我不完全认为换模型的本质是在提升效果,他只是一个算法系统的预测能力上限的提升,换个模型并不肯定会使效果有提升,甚至有的时候换了模型会有新的问题暴露,我们又要持续调教,效果才有可能完成新的提升。

所以,我认为提升模型的时机应该是能明显看到当前方案的天花板的时候,所谓的天花板,应该就是你会看到很多零散的bad case,问题不太能总结出来,或者是总结出来会发现分布很均匀,每个都只错了一两条的那种,此时很可能是当前模型吃不下了,这个时候,我们要开始寻求新的模型结构了。

某种程度上说,sota其实就是在探索这个上限的,但请记住,sota是特定数据集的sota,是否适合你还要多想想,不过归根结底还是要做实验,靠修补提升不了效果的时候,也就只能靠模型来进一步探索。

结束语

国庆7天,4篇文章接近1w字,总结了整个bad case从定位分析到解决的全流程思路方案,这其实是我自己总结的一套完整的方法论吧,来源是我的前辈的指导,其实前辈帮我分析问题解决问题也是通过这么做的,有这套严格的方法论指导,能让我在分析问题的时候更加严谨全面,不遗漏细节和关键步骤,也不容易陷入迷茫,很多东西看似自然但是做起来就很容易忘记,例如现状的确认,好or不好,我们很容易忘记去确定这个,发现一个bad case就去修,很可能会导致新的问题会出现(谁能想到带有“怎么去”的不一定能是地点意图呢,怎么去天堂...)。

我自己很喜欢这么总结,因为这种方法论是能知道我解决很多问题的武器,此乃“万人敌”之术,当然,“百人敌”的方案也要跟上,持续学习吧,敬请期待。

1838b0e073d7b5aa934c2593261663d0.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值