日常工作中,因为很多原因,我们面对的问题总不能一下放模型里,就能就得到很好的效果,前面有文章详细讲过可以通过bad case分析定位并解决问题(心法利器[40] | bad case治疗术:解决篇,这是最后一篇),今天换个角度,从一个分类任务来看,会有哪些问题,以及有哪些可以考虑的解决方案。
这里,我按照问题作为分类,来给出一些常见的解决方案。
看完这篇文章后,别遇事不决换模型了,别让老板知道你只会这招(狗头)。
数据的问题
在现实问题下,有80%以上的效果不好,都是由于数据的问题,这里我来列举一些常见的数据问题以及解决方案。
数据标注错误
人很难不犯错的,即使是一些比较出名的开源数据集,其实也很难达到全对的水平,很多数据集只要认真做过case,例如做过case分析,就会发现其实有很多的标注错误,实际应用中,大部分情况准确率能达到95%就已经是高质量的数据了,一般能达到90-92%这个数据集就基本可用了,而如果模型本身预测的结果准确率就只是在90%上下,其实模型已经很大程度拟合好了这个数据集,再往上的提升很可能只是分数高,拟合了错误结果而已,这个是需要首先说明的。
其次,有些数据集,和很多原因有关,无论是训练集还是测试集,准确率可能都只是在六七十甚至更低,我们其实无法苛求模型能达到更好的水平。对训练集,如果质量低,这事就和拿了本错误的教材一样,根本学不好,对测试集,再优秀的模型遇到这个测试集,即使预测对了,标注是错的,体现在指标上也是准确率很低,模型怎么换效果都不好。
这个数据标注问题,往往体现的是这个系统的上限,此时,我们所应该聚焦的,就是提升数据标注的准确性,这里给出大家提一些可以考虑的策略:
仔细修正标注策略(毕竟数据标注除了人工还有很多方法),制定更多规则来优化。
如果数据标注比较困难,可以考虑多人标注,对不一致的部分进行复合,整体质量提升会比较明显。
配合模型、规则等多个策略进行比对,对不一致的部分进行复标。
利用模型,对模棱两可(二分类概率在0.5上下)或者明显错误的(正类prob在0.1左右或负类prob在0.9左右),进行复标。
后面几个策略其实挺“主动学习”的,核心就是通过模糊或者不一致来挖掘很可能有错的部分进行复合,来提升整体的质量。
数据数量问题
现阶段,虽然有无监督之类的很多策略,但是对于特定的任务或者需求,总是离不开训练数据的,我们需要数据来让模型知道“遇到这个情况该选哪个”,因此数据数量是需要基本保证的。
首先,很多人很容易想到两个常见策略:
数据增强。
无监督。
这两个方案,是可以的,但不是万能的:
数据增强——在本身数据的覆盖面已经较充足的情况。例如天气意图的分类,其实来回就这么集中情况,列举完增强就行。但是遇到类似电影、电视剧意图的分类,分布很难完整覆盖,只有几条样本完全不能通过常规的增强解决。
无监督——如果有自信模型能往特定的方向预测,那这么做其实还行,但是定向这事很困难的,例如都是二分类问题,一个分是否是天气意图,一个分是否是电影意图,都是同一批数据,如何知道训出的无监督模型朝着那个任务的方向预测?
所以,私以为还是要从人体的根源出发。分几个情况吧:
整体数据都很少的情况。
整体数据尚可,但是特定类目或者特定情况的数据太少的情况。
对于整体数据都很少的问题,如果是像我前面说的——在本身数据的覆盖面已经较充足的情况,那其实直接数据增强是可以的,增强之后会让模型强化对特定意识的了解,直接就能学出来了,但是如果不足,那就要找渠道增加数据了,有用户数据的,可以捞一些用户query,根据用户点击在整理下,没有的,结合一些词典构造一些样本放入也是可以的,甚至有一些场景是有公开数据的,直接拿来用。
而对于数据样本不均衡的问题,之前有写过文章介绍,此处不赘述了(心法利器[44] | 样本不均衡之我见)。
小补充
只有在数据的数量和质量都比较充足的时候,我们才有资格去谈模型,谈其他的优化策略,这应该是一名成熟的算法工程师所需要掌握的基础知识。
模型升级的收益
模型的升级往往带来的是一个系统级别的提升,这个系统提升是上限的提升,只有到这个系统内部的多个位置都已经有比较高了,这时候换模型才能带来比较明显的收益,例如数据已经调教的比较好,没有什么大问题,这个时候升级模型能很快提分,这里例如fasttext->textcnn,上预训练模型等,但是确实是要看清切换的时机,毕竟切换是需要成本的,到时候切换完效果不提升,白干活的话KPI很容易崩的(狗头)。
有关切换时机,大家可以看这篇(心法利器[63] | 预训练模型的上线时机)。
特定样本引入打来的提升
常规下,要调整效果,还是要从bad case里出发,理解数据中常见的问题,然后进行优化,其实是日常最常用的方式,这个方式简单快速,但是也有难点,难的是发现规律并进行解决,这里给大家介绍一些比较常见的问题和主要解决方法。
正负样本里某些词的词频差距很大,导致模型认为出现的这个词就是分类标志,导致分类错误。
解决方法1,捞日志,这个词在正类多就找带这个词的负类样本,反之亦然。
解决方法2,删除样本,例如这个词在正类多就干掉一些正样本。
泛化能力不足,模型只学到了正规的句式,对于泛化、换个说法的样本可能就预测错了。
r-dropout,值得推荐。
拼接,和一些无意义、闲聊类的句子进行拼接,维持源类别,放入对应类目的样本中。
数据增强,尤其关注随机交叉的这个策略,有收益。
检索增强,用向量召回最接近的句子,用这批放入对应类目。
因为缺乏特定形式的样本(模型没见过),导致模型只能猜还猜不对。
加入特定类型的样本。(在天气意图分类数据里,把“天气之子”作为负样本放入训练集中)
考虑通过别的方式解决,例如用词典(心法利器[41] | 我常说的词典匹配到底怎么做)或者以搜代分的方式来处理(心法利器[60] | 以搜代分的生效机理)补充。
当然,还有一些别的策略,这些策略很大程度和自己对业务、数据的理解有关,越是了解提升的幅度会越大。最近的一次实验,由于用户query其实都是语音转文字得到的句子,而由于采音、ASR等问题,得到的用户query可能不是完整的,不完整意味着可能有关键词但是信息仍旧模糊,这就容易导致误召回了(模糊或者无意义的句子是会被认为是负类的),因此,我才用的策略是对常见高频的句子做随机截断,然后放入负类中,最终结果是以2%的召回率代价换来了4%的准确率提升,算是收益较大的,漏召回的会根据实际情况再调整即可。
其他策略的引入
一个完整可控的系统,不能光靠模型来解决所有问题,而实际上也是模型并不能解决所有问题,我们需要众多的支持和辅助,构造成一个系统,才能让整体效果达到新的高度,这里有一些可以考虑的思路。
对于简单、高频的问题,其实不太认为需要模型,处理用一些词典和规则能更加稳定可控地解决。
如果问题的尾巴比较长,长尾问题的样本比较难获取,占比较低,此时模型并不能学得好,与其考虑增强和挖掘,不如交给检索的方式做更加高效,别考虑增加特定样本了(以搜代分:心法利器[26] | 以搜代分:文本多分类新思路)。
模型附带后处理,解决模棱两可,或者比较边界的问题,举个例子:
阈值大于0.7的才是正类,0.5-0.7的部分需要依赖别的因素做进一步判断才准入。
多个分类模块组合,最终用加入rank层进行多结果的排序,解决复杂多变的分类场景。
多个二分类,不让模型处理混淆问题,最终rank层再来择优。
类目体系更新频繁,重训模型对其他类目影响大。
多个分类场景差异大,数据不好平衡。
审核编辑:刘清
-
数据集
+关注
关注
4文章
1205浏览量
24644
原文标题:文本分类日常提点技巧
文章出处:【微信号:zenRRan,微信公众号:深度学习自然语言处理】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
评论