算法工业界文本分类避坑指南

2021-12-11  本文已影响0人  ad110fe9ec46

完整的思维导图关注包包算法笔记回复【避坑指南】获取下载查看链接。

image.png

公众号包包算法笔记,包包(包大人)的机器学习笔记,分享算法,机器学习,程序员,职场等算法工程师话题。

背景

说起文本分类,也算是一个老掉牙的话题,之前大家都喜欢琢磨模型。最近从工业界的视角看一下文本分类,看一些从0到1做一些和文本分类项目,可能大家都会踩过的坑,以及经验教训,都是一些比较有意思的问题,主要从问题拆解与数据,算法选型与推荐,细节策略与实现补充。

思维导图回复【避坑指南】获取下载查看链接。

目录

一、问题拆解和数据

  1. Q1 构建文本分类标签体系有哪些坑?

  2. Q2 初期监督数据不够怎么办?

  3. Q3 如何高效的积累标注数据?

  4. Q4 如何发现新的类别?扩充类别空间?

二、算法抽象和选型

  1. Q5 文本分类任务有哪些难点?

  2. Q6 如何定义一个文本分类问题的难度?

  3. Q7 文本分类算法选型有何推荐?

  4. Q8 如何确定验证集和评价方法?

三、细节策略和实现

  1. Q9 如何处理溢出词表词?

  2. Q10 文本分类技术演进的明线和暗线?

  3. Q11 策略和算法如何结合?

  4. Q12 有哪些可以刷分的技巧?

  5. Q13 模型inference资源限制条件下,如何挑战算法选型的天花板

问题拆解与数据

Q1 构建文本分类标签体系有哪些坑?

在我们在做真实的业务问题的时候,不像给定一个数据集,标签就是定死的。如何确定一个合理的分类标签体现其实是十分关键的。这个阶段一定要做数据充分的探索性分析。图省事吃大亏。

下面几个基本的原则:

Q2 初期监督数据不够?

标注数据总需要一定的时间,这时候除了用规则,词典之类的方法外,或者fewshot learnig的一些思路解决问题,大体的思路是两种。

Q3 如何高效地积累标注数据?

有了前面起步的baseline,我们至少可以扔到线上把模型跑着了,然后人工标注数据怎么积累又是一个问题,不同的样本对于我们当前的价值是不一样的,类别空间会扩充以及长尾标注样本数量不足是两个最常见的问题。大体的原则是通过不确定性度量和多样性度量两个角度,来选取对当前模型增量送训样本最优价值的样本。

Q4 如何发现新的类别,扩充类别空间?

有一些方法还挺不错的,推荐ACL2019的那个论文** Deep Unknown Intent Detection with Margin Loss **

图片

非常简洁明了。我们在Kaggle Bengali的比赛里面也用了类似的方法检测新类别,不过用的是arcface异曲同工吧,都是margin softmax,简单又效果非常好。具体可以前情回顾发表在我知乎上的(无法插入跳转链接)

从kaggle看2020的手写体识别:从MISNIT到Bengali.AI 手写体识别大赛

https://zhuanlan.zhihu.com/p/114131221

本质上都是找出,与已知类别不相似(分布差异较大)的样本,其实用前面的adversrial validation也可以解决,实测margin softmax效果更好一点。

算法抽象和选型

Q5 文本分类任务有哪些难点?

图片

文本分类的难点也是自然语言的难点,其根本原因是自然语言文本各个层次上广泛存在的各种各样的歧义性或多义性(ambiguity)和演化的问题,下面典型的例子:

Q6 如何定义一个文本分类问题的难度?

典型难度排序:主题分类-情感分类-意图识别-细粒度情感识别-复杂语义识别(如阴阳怪气)

Q7 文本分类的算法选型推荐?

算法选型的出发点就是权衡各种约束,考虑模型的天花板能力,选择合适的模型。一般对应任务的难度,权衡计算时效,选择合适的模型。除了忽略一些比千分点的场景,比如竞赛和论文,一般这块在确定算法选型后,就没啥油水了,建议少花精力。有经验的算法工程师,一定能人脑搜索出一个当前选型下的最优结构。一个特别经典的建议大家试一下,concat_emb-> spartial dropout(0.2)->LSTM ->LSTM->concat(maxpool,meanpool)->FC。

结合前面的任务难度定义,推荐的算法选型行为

Q8 如何确定验证集和评价方法?

这是个老大难的问题,特别是实际应用中,由于文本分类符合一个长尾分布,常见类别的识别能力其实一般比较ok,长尾识别的稀烂,如果单纯看准确度的话,是个还不错的模型,但你不能说他好吧。对应着指标就是acc很高,macro-f1很低。

细节策略和实现

Q9 如何处理溢出词表词(OOV)?

这个在前Bert时代是一个挺关键的问题,以前回答过,还可以参考。从数据中来到数据中去, 要么想办法还原次干,找到可以替换的词向量。要么从sub-word的层次学习出语义,参考Bert BPE的方法。很早很早念书的时候,还没有Bert做过一些文本分类的比赛,在一些任务上搞定OOV提分还是很大的。给之前回答过的一个前Bert时代方法的链接。

WordEmbedding如何处理未登陆词?

https://www.zhihu.com/question/308543084/answer/604729983

Q10 文本分类模型演进的明线和暗线?

针对上文提出来的文本分类的难点,其演进路径大概也是从统计机器学习,词向量+深度学习,预训练语言模型的发展。

关于路线的演进,这里有个前几天画的思维导图:部分截图如

图片

<figcaption style="margin: 0.66667em 0px 0px; padding: 0px 1em; outline: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important; font-size: 0.9em; line-height: 1.5; text-align: center; color: rgb(153, 153, 153);">思维导图部分截图</figcaption>

Q11 策略和算法怎么结合?

算法工程师不能老鄙视规则,很难一个模型搞定所有问题。

Q12 有哪些可以刷分的奇技淫巧?

可以尝试的点还蛮多的,搜索空间特别大,感兴趣的可以试试,不保证都有效。这部分的方法大多需要在算法选型敲定后,在模型结构上下功夫,需要遍历一些搜索空间。不建议花太大的精力,具体可以参照之前的回答,而且有了bert之后,他们越来越不重要了,也就没有补充Bert上面的一些操作了:

在文本分类任务中,有哪些论文中很少提及却对性能有重要影响的tricks??

https://www.zhihu.com/question/265357659/answer/582711744

Q13 模型inference资源限制下,如何挑战算法选型的天花板

玩比赛的经常遇到过这个问题,典型的场景Kaggle上要求提交模型,更换测试数据,只给两个小时的推断时间。

除此之外,我们在工业界耗时严格的场景下,Bert总表示遗憾,效果虽好,但是臣妾做不到啊。想要TextCNN的速度,又想要逼近Bert的效果。

图片

这时候模型蒸馏就派上用场了,模型蒸馏在Kaggle一些线上推断比赛的top solotion必不可少的。Hinton给的baseline是这样的,通过teacher model产出soft-target。然后student同时学习hard target和teacher model的soft-target。不过要注意的是,用的时候不要leak,先用KFold产出soft-target的oof,然后和GroundTruth一起给student训练。在不少开源代码里看到leak soft-target的情况,用teacher摸过训练标签的样本给student学习。

图片
上一篇下一篇

猜你喜欢

热点阅读