导读:本文是“数据拾光者”专栏的第五十七篇文章,这个系列将介绍在广告行业中自然语言处理和推荐系统实践。本篇主要总结了一下我在实际项目中对于文本分类任务的优化策略,对于想要提升线上文本分类任务效果的小伙伴可能有所帮助。
欢迎转载,转载请注明出处以及链接,更多关于自然语言处理、推荐系统优质内容请关注如下频道。
知乎专栏:数据拾光者
公众号:数据拾光者
摘要:本篇主要总结了一下我在实际项目中对于文本分类任务的优化策略,主要包括预训练模型优化、语义embedding优化、分类层优化、使用知识蒸馏优化、使用标签内容信息优化、优化损失函数、通过半监督和主动学习优化、通过样本增强技术优化。对于想要提升线上文本分类任务效果的小伙伴可能有所帮助。
下面主要按照如下思维导图进行学习分享:
最近在参加公司的算法挑战大赛,任务目标是给定对话当前轮文本,输出对应的情绪标签和创意表情。初赛是根据对话文本内容来输出情绪标签,其实就是一个文本分类任务;复赛是根据情绪标签来生成创意表情,是一个有条件图像生成任务。之前也做过一些文本分类的项目,这里刚好就作为一个总结吧:当我们面对文本分类任务的时候,可以使用哪些优化策略?
因为这次比赛主要考虑的是模型效果,不用考虑性能,重点目标就是提分(f1_score),所以不用考虑线上实时性能啥的,怎么效果好怎么来。这种背景下文本分类任务主流做法是基于BERT预训练+微调的方式进行,这里预训练模型的好坏会直接影响文本分类的效果。我们实际项目中也经历了从bert_base、albert、roberta、nezha等预训练模型,目前使用效果最好的是roberta-wwm-ext,关于roberta模型的详细介绍可以参考我之前写过的一篇文章《广告行业中那些趣事系列18:RoBERTa-wwm-ext模型为啥能带来线上效果提升?》
图1 roberta模型介绍使用BERT类预训练模型对文本进行编码,BERT可以得到字粒度和语句粒度的embedding,现在要得到优质的语义embedding,一个通常的做法是使用【CLS】对应的向量作为语义embedding,还可以尝试使用第一层Transformer和最后一层Transformer的embedding相加之后取均值作为语义embedding,这种方式的好处在于第一层Transformer中包含更多的词信息,最后一层Transformer中包含更多的语句语义信息,将两者相加之后取均值可以兼顾词向量和句向量的信息,效果也会更好。这也是我们实际项目中使用的语义embedding方案。
得到语义embedding向量之后,需要接一个分类层。通常做法是直接使用一个dense层进行N分类任务,还可以使用CNN等方式构建更加复杂的分类层。实际项目中我们直接使用2-3层dense层作为分类层,这里需要注意一点,对于二分类任务,使用softmax效果会优于sigmoid。
相比于传统的文本分类通过类别指导模型进行学习,知识蒸馏通过logits来提供更多的暗知识从而让模型学习到更多的知识。拿手写数字识别任务来说,对于老师或者没有使用知识蒸馏的小模型来说,主要是通过训练数据来学习知识。我们的训练数据集是一张一张手写数字的图片,还有对应0到9十个数字的标签。在这种学习中我们可以用的只有十个类别值,比如一张手写数字1的图片样本的标签是1,告诉模型的知识就是这个样本标签是1,不是其他类别。而使用知识蒸馏的时候模型可以学到更多的知识,比如手写数字1的图片样本有0.7的可能是数字1,0.2的可能是数字7,还有0.1的可能是数字9。这非常有意思,模型不仅学到了标签本身的知识,还学习到了标签之间的关联知识,就是1和7、9可能存在某些关联,这些知识称为暗知识,这是知识蒸馏学到的知识,也是知识蒸馏有用的重要原因。
图2 知识蒸馏可以提供更多的暗知识关于知识蒸馏的详细介绍可以参考我之前写过的文章:《广告行业中那些趣事系列21:从理论到实战BERT知识蒸馏》
我们还通过实验发现将文本分类任务转化成句子对匹配任务可以提升模型效果,主要原因是可以很好的利用标签信息。比如现在有个情感分类任务,如果是文本分类任务的话那么标签就是情感类别;但是如果转化为句子对匹配任务,那么可以将文本作为sentence1,将标签内容信息比如“快乐”作为sentence2,拼接成【CLS】sentence1【SEP】sentence2用于构建句子对匹配任务,如果匹配则标签为1,否则为0。通过这种方式可以将标签本身的内容信息也提供给模型,从而提升模型效果。实验中还发现可以添加标签相关信息的关键词可以进一步提升模型效果,比如对于“快乐”情绪可以添加高兴、开心等表达对应情绪的关键词,可以提供更多的额外信息。
因为分类任务中经常会遇到样本不均衡问题,从模型层面缓解这一类问题可以优化损失函数,常用的有使用类别加权loss、Focal loss、GHM loss。类别加权loss主要是对样本数量多的类别降低权重,Focal loss将模型容易识别的样本降低权重,GHM loss则对模型容易识别和特别难以识别的样本都降低权重。下面看看交叉熵损失函数、Focal Loss和GHM Loss三种损失函数对不同梯度模长样本的抑制效果图:
图3 三种损失函数对样本的抑制效果图关于通过缓解样本不均衡问题从而提升文本分类效果可以参考我之前写过的一篇文章:《广告行业中那些趣事系列24:从理论到实践解决文本分类中的样本不均衡问题》
如果你可以拿到业务相关的无标签数据,就可以尝试下通过半监督学习和主动学习的策略来优化文本分类任务,通过半监督学习中的各种enlarge策略来扩展训练集规模,通过主动学习策略来标注更有价值的语料,从而提升模型的效果。之前也分享过我们构建的oCTS分类器优化训练系统,通过半监督学习和主动学习流程进行优化训练,半监督和自训练流程项目基本流程图如下所示:
图4 半监督和自训练流程项目基本流程图关于oCTS分类器优化训练系统详细介绍可以参考我之前写过的文章:《广告行业中那些趣事系列40:广告场景文本分类任务样本优化实践汇总》
通过样本增强技术可以有效增加训练样本,从而也可以提升模型效果。NLP场景中常用的样本增强技术比如回译技术、机会替换技术、词重复等都可以有效增加训练样本规模,下面是NLP常用的样本增强技术汇总:
图5 NLP中常用的的样本增强技术介绍其中通过simbert相似语义增加样本效果尤其明显,关于simbert模型的详细介绍可以参考之前写过的一篇文章:《广告行业中那些趣事系列30:实际业务超好用的SimBERT》
关于NLP中常用的的样本增强技术详细介绍可以参考我之前写过的这篇文章:《广告行业中那些趣事系列13:NLP中超实用的样本增强技术》
我们顺利通过初赛,也就是根据对话文本内容来输出情绪标签的文本分类任务。初赛中我们也遇到一个比较棘手的问题抛出来和大家一起分享,也就是训练集和测试集分布不同,具体现象是:官方提供了训练集,我们将训练集切分成train和val,使用train训练的模型在val上效果非常好,但是提交进行评估发现在测试集上(测试集对参赛选手不可见)效果会下降很多。碰到这种情况大家会怎么处理?
本篇主要总结了一下我在实际项目中对于文本分类任务的优化策略,主要包括预训练模型优化、语义embedding优化、分类层优化、使用知识蒸馏优化、使用标签内容信息优化、优化损失函数、通过半监督和主动学习优化、通过样本增强技术优化。对于想要提升线上文本分类任务效果的小伙伴可能有所帮助。
最新最全的文章请关注我的微信公众号或者知乎专栏:数据拾光者。
码字不易,欢迎小伙伴们点赞和分享。