文本分类是一个常见的任务,垃圾邮件分类、评论情感极性分析、舆情分析、新闻分类等等,在网上随便搜索都会出现满屏的解决方案和已有模型。在工作或学习中,接到一个分类任务,可能我们就直接套用已有的模型、方法开始尝试,如果效果还不错,那么这个问题就跳过开始下一个问题了;但一般效果可能不太理想:各种指标(auc、f1、accuracy)达不到目标值,这时候我们才回过头来分析怎么去提升,可能这是大家常用的求解思路。
那么,我们跳出具体的任务从整体上思考如下两个问题:
针对上述两个问题,结合自己在工作中遇到的问题,有如下的总结,个人经验,不喜轻喷
备注:本文仅讨论文本分类,其他的分类任务可能有共通之处,但也可能存在不同,没有免费的午餐,不能一法解万题
从我们接到一个任务开始,到最终满意的解决这个任务结束,这中间要经历的过程大致如下:
对于一个文本分类任务,大概的流程如上所描述,但每个步骤中,会存在许许多多奇奇怪怪可能遇到的问题。
搞机器学习和算法的,应该都听过一句话:数据和特征决定了上限,模型只是在逼近这个上限。从这句话可以看出,数据和特征是一个任务的重中之重,而任务中可能遇到的问题,也大都出现在数据和特征上。
目前针对文本分类而言,几乎所有的任务都是有监督的,少部分是无监督+有监督结合,这就导致对标注数据存在极大的需求。对于比较普遍、通用的任务而言,可以借助公开的数据进行辅助模型训练,而小众领域的任务,标注数据缺失的问题太普遍了。
针对标注数据不多的问题,一般有两个思考方向:
前者是通过各种手段,例如采样、生成、变换、EDA等,扩大标注数据的规模;后者是仅利用已有的数据,通过迁移学习、预训练、Prompt等方式,提前学习一些通用的知识,在特定领域进行微调。两种方式效果再特定任务上可能存在难易程度、资源、耗时等差异,需要结合具体的任务,酌情选择。
针对小样本学习,一些常用的解决方案如下:
针对数据样本不足的一些解决方案如下:
获取数据后直接拿过来扔进模型,未尝不可,但可能存在“脏数据”导致模型学到的东西是有偏或者错误的。“脏数据”指的是训练数据中存在的噪声、错误数据。例如词带模型、TF-IDF等统计模型中的停用词问题,文本分类中对于无效字符,例如特殊字符、url链接、乱码等数据的清理。对数据的熟悉程度越高,越能够得到高质量的训练数据。
针对脏数据问题,常见的介绍和解决方案:
获取一批数据后,不论应用统计机器学习模型还是深度网络模型,其大概的本质是对训练数据的拟合,如果训练数据存在某种偏差或不平衡,那么模型极大概率会认为这种不平衡是数据内在的特性而不是数据问题。在癌症、点击等常见场景下,正负样本比例失衡是很常见的问题,处理数据分布不均衡最直接的方法是对数据的采样,例如过采样、下采样等,除此之外,调整模型,例如集成学习、加权学习,甚至调整损失函数,都是对不平衡样本的一种有效策略。
常见处理方案:
输入文本是可能存在错误的,例如用户在搜素框中输入“中国首都背景”,错误的类型有多种多样的,例如错写、少写、谐音、网络用语等。错误的输入可能导致完全相反的分类结果,尤其是在文本翻译、语音识别等场景下。针对文本纠错,最常用的思路是通过统计共现情况,实现词汇的纠正:通过共现,计算候选集中可能的词或字的概率。在一般的文本分类中,可能文本纠错不是一个必须考虑的问题。
我们都知道,无论机器学习还是深度学习,都是接受一定长度的输入(特例除外),而文本分类中,通常我们会设定一个padding的长度,实行“长截短补”的策略:大于padding长度的文本进行阶段,小于padding长度的文本进行填充。对于比较稀疏的文本信息而言,阶段可能会带来一定的错误,例如长文本中信息可能在后半部分,由于阶段这部分数据是看不到的,但无限制的过大模型的输入长度,也会带来时间、资源的增加,因此这是一个多方的平衡。
不扩大长度的情况下,如果获取更多的有效信息,是目前许多研究的重点,常见的思路有:
文本长度是文本分类中比较重要的问题,不合理的文本长度设置,可能会导致不如人意的模型效果。
标签,是有监督学习的目标,如果标签出现问题,那么可能学到的模型大概率不会有效。这里的标签问题,指的是标签错误漏标、错标问题
针对多标签文本分类,同一个文本具有多个标签情况下,只标注少量标签漏标的标签会被赋予默认值,是一种非常常见的现象;单标签分类情况下,错误标注文本标签,可能误导模型无法收敛或者到达鞍点的局部最优。
但但我们不可能对所有的数据标签进行校验:代叫太大甚至无法校验,这种情况下,对标注数据的标签存有怀疑是一种不错的选择,也就是置信学习或标签平滑
针对文本分类任务,现在可选的模型太多了,堪比古代全国选秀,简单点的xgb、CNN、RNN、LSTM,复杂点的TextCNN、Fasttext、TextRCNN等,再到大模型Bert、AlBert、RoBert系列等,无论是经典树模型,还是深度网络模型,都可以是解决这个问题的备选方案,面对如此繁多的备选项,合适的才是最好的
现在随便一个网络模型,可选项组合起来都是吓死人级别的,bn、dropout、lr、l1、l2、batch_size、channel、……面对这么多的参数,可能我们大多数时候,都是默认参数,或者祈祷幸运女神临幸你,自己为数不多的调参下,能够达到比较好的效果,哈哈哈哈。
这么多的参数,自动化的参数调优有一些框架可用,但对任务和数据的了解,能够帮助我们极大的提高调参效率
随着模型规模的越来越大,模型效果也越来越好,但随之而来的是同等情况下,资源消耗越来越大、耗时越来越高。对大模型的轻量化也是目前研究的重点,主要有三个方向:
三个方向难易程度以及成熟程度不尽相同,目前而言在保证效果情况下,模型蒸馏可能是最佳的选择。
我们累死累活的获取数据、处理数据、挑选模型、模型优化后,那最终如何评估模型效果呢?用accuracy评估点击率?很多时候评估指标的确定要结合业务背景,但通用的auc和f1指标适用了大多数情况,对于比较稀有的领域可能有自己的指标,例如覆盖面、影响面,甚至是多指标结合情况:xx影响面下的xx召回率等。
对于模型的效果,我们需要给出一个合理的解释,这个解释就是指标,说明为什么我们做的是比之前优的。
总之,在文本分类过程中,从接手到完成的过程中,可能会遇到许许多多的问题,来自数据、特征、模型、评估、资源等各个维度,不同的问题需要考虑的点也不尽相同,希望随着经验、知识的增多,能够解决问题更加得心应手。