如何修正NLP问题的bad case

NLP问题,大都至少是个统计类问题,对整个数据集进行分析,然后给出概率最大的结果,无论是基于概率的浅层学习,还是使用了深度学习都是如此,而少了可供添加和修改的特征,此时如果出现比较关键的bad case,就并不好干预,而且在干预的同时还需要考虑尽可能不产生新的bad case,这样一来,要处理这些bad case就非常头疼,这里我给大家介绍一些处理bad case经验。

主要思路

这应该是一个比较普适的处理问题的方法,确认目标,剖析问题,处理问题,检验结果。

  • 首先,要分析这bad case,知道bad case产生的原因,只有知道病因才能对症下药。

  • 确定这个case是否需要解决,即评估这个case的影响面,有多少相似的case存在,解决后收益有多大,毕竟我们需要把资源花在最有收益的地方。

  • 提出解决方案并进行试验。

  • 校验case是否解决,解决程度如何(其实有时候能解决一个问题的80%已经很不错了,不见得要完全搞定)

  • 校验,这个解决方案有没有引入新的问题(一般要做回归测试)。

问题诊断

要处理bad case,首先是要知道bad case是怎么产生的,为什么会有这些问题,一般地,主要是下面这些原因。

数据标注就有问题。这点其实在现实应用下就很常见,本身标注样本就不太可能天衣无缝,而且其中还存在大量人类自己都很难说清楚的case,例如现在的“快乐”真的就是“快乐”吗,“快乐风男”对于队友来说可就不一定是快乐了吧,em,从这个例子对于没打过英雄联盟的人来说,根本不知打我讲啥对吧,这就对了,标注真的不是完全可靠的,哪怕真的是人标注的。

分词问题。这个case其实并不少见,分词出错会导致词义漂移现象,例如近期短道世界杯冠军武大靖,他的分词就是“武大 靖”,这种分词中出现了可能和整个句子无关的信息——“武大”,例如word2vector就会去拿“武大”的词向量,这个词向量显然和原来的不同。

针对任务本身,了解他这么整的原因,把它认为是个人,他这么分类有他的道理,例如有一些比较模棱两可的词,整体正好在边缘上(0.5的阈值,他是0.49刚好没过线)。举个例子,有一个单词“苹果”,你的数据样本里面只有“苹果电脑”和“苹果手机”的意思,你怎么让模型知道它还可能是个水果。

另外这里我建议大家准备两套校验数据(一般一套100条就够了),一份用来后续校验你的处理方案是否产生效果,没有的话根据这套数据来调整,等调整好后,最后的校验再用另一套检测,这里就类似校验集和测试集的关系了。

影响面分析

查看这个bad case影响面有多大,这个分析起来其实不会特别难。这一步要做的原因是确认你做的这个事情有价值,毕竟时间作为重要成本也是要控制的,提升效率。

方法的话,抽100个样本,可以从bad case里面抽,也可以从整个数据集里面抽,自己人工诊断一波,看看这个问题你抽取样本的比例,你就知道大小了,例如如果你抽的100个里面压根就没有你说的这个case的问题,其实没有太迫切的必要去解决了,但如果case比例不小,那事不宜迟,开始整吧。

处理思路

根据问题的核心来进行处理,下面是一些常见的手段,估计大家最关心的就是这块了,我好好和大家聊聊。

分词之类的,涉及上游的问题首先说,这是最难解的,你要去动你的上游模型,这个非常艰难,毕竟分词模型可能在下游还有很多依赖,你主动去操作的话可能会有很多同事来找你麻烦了,所以比较适合的方法就是去适配这个分词,例如可以做紧密度分析(当然这个也可以让上游的同事去做,而且这其实是一个挺重要的基础性工作吧)。因为改动都会比较大,动分词词典一般是专项行动,确认后一般不做修改了,所以这个问题一般建议大家先跳过去。

阈值类问题,其实就是调阈值,这个方法很简单,但是由于阈值对整体结果都会有影响,所以回归测试需要做的很仔细,尽量不要产生新的bad case,找到最佳的平衡点吧。

模型层面,数据如果存在偏心,特定case结果不好,那就可以通过数据集精炼的方式去修正结果:

  • 针对bad case增加训练样本。增加训练样本的方式很多,复制,模板造数据,甚至是增加外部数据集都行,这个效果其实还不错的,但是要避免增加样本导致的该类型的case过拟合的问题,另外也不能产生太多新的bad case。

  • 另外,减少噪音数据,这个其实挺关键的,通过规则减少噪音比增加数据本身效果提升可能更高。

  • 另外有一些case其实可以通过规则去解决,这种case就用规则去解决吧,模型真的很难达到满分(仔细想想几乎没看到过100%召准的模型和案例吧),规则可以协助模型更好的逼近。

  • 如果是整体结果就不好,距离目标差一点点,我的建议是调调参数试试,模型可以尝试换个更厉害的,但是gap超过了10%,甚至是5%,我建议你还是从数据、特征的角度去看看能不能提升

说到数据、特征层面,其实能操作的就很多也很灵活了我甚至推荐大家首先从数据和特征层面进行操作,模型之类的尽量少动。

  • 数据层面,提升数据质量,宁可错杀不要放过的做,如果能通过外部语料进一步扩充数据规模(这估计是NLP的基础操作了),尽可能扩充,不建议使用模板构建,但是实在不行增加一点其实无妨,但不能太多。

  • 特征层面,除了文本层面的特征,词向量之类的,还有词性、term weighitng、位置、TF-IDF等特征可以加上试试。

综合地,我建议噶金方案按照下面顺序去尝试可能更好。

  • 规则解决。简单、不用重训模型,不易产生新的bad case。

  • 针对bad case构建更有利于修正该结果的特征。

  • 特征的丰富化,尤其想推荐的是词性和位置信息,这两个是最易得的,当然有条件的加入term weighting和TF-IDF之类的也是有提升的。

  • 精炼数据,要高质量而不能只求数量,这个操作一般是在删除数据,注意数据量和质量的平衡。

  • 在缺乏特定类型的case导致样本不足时,可谨慎使用复制,如果该类型样本实在太少,可以适当使用模板生成,注意控制比例。

  • 通过外部语料的方式增加样本。

  • 调参。(这个排位可以说是非常低了)

  • 根据bad case现状和实际问题的形式,使用更为复杂的模型。但不太鼓励在结果差很多的情况下,直接上更高级的模型,烧机器烧时间,提升也不会很大——指望模型带来质变是不可能的。

效果分析

经过上述的干预后,就要开始进行效果分析了,分析自己的干预是否有效果,下面是主要的思路。

首先,是检验自己的干预是否能解决你需要解决的问题,这个处理起来很简单,就是直接看你的case,这里首先使用校验集来确认,如果没有达到预期则再进行处理。

处理生效后,使用测试集检验两点:

  • 在测试集上你的策略是否还是成功的。

  • 你的策略是否导致产生新的问题,这个需要评估,如果新的问题影响面小,问题不大,则也可以,但是和老问题的严重程度相似,其实也是不行的,重新开始整理策略吧。

 

posted @ 2021-02-25 17:27  Sunshine168  阅读(732)  评论(0编辑  收藏  举报