NLP文本分类入门学习及TextCnn实践笔记——模型训练(三)

这篇记模型训练。

距离第一篇已过去一个月。从学习到正式启动模型训练,花了两周。模型训练召回率和准确率达到上线标准又花了两三周。

训练及测试样本评估的精确率都是97%、98%,结果一到线上实验,结果惨不忍睹,才明白模型训练不是那么简单的事情。渐渐摸索出了一些门道,最后线上精确率达到95%以上。

我只在一个二分类的文本分类场景成功训练并上线了模型,且除了词嵌入纬度embedding_dim超参调整外,不涉及其它的超参调整,因此下文将主要从个人的模型训练经验出发,介绍模型训练的基本思路及调优关键点。在其它的文本分类场景相关经验可能不适用,仅供参考。

基本思路:

下图是我理解的模型训练的基本流程。

NLP文本分类入门学习及TextCnn实践笔记——模型训练(三)

我理解的模型训练分为三大步骤,一是训练前准备,包括正负样本和数据清洗、分词配置;二是反复模型训练;三是模型调优,两个手段,一个是配置调优,一个是策略加持。各自具体什么含义下面慢慢展开说。

一、训练前准备

磨刀不误砍柴工。我的说法是“你人都没学会呢,上什么机器学习”。所以前期工作非常重要。

1. 样本选取

正负样本是机器进行学习的学习资料,资料准不准,决定了学习效果好不好。

两种分类场景,一种是有限内容范围的非此即彼,正、负样本分布差别不大;一种是“这种是,其它都不是”,正是小部分,例如从全量内容中识别非法内容。

不管是那种场景,正样本都是目标文本的完整定义,建议正样本之间有显著的共性特征,也就是一类文本。如果样本量不多,特征却很多,最后出来的模型效果就不好。这里所说的特征就是句式、语义、用到的词汇等。

一般通过策略挖掘积累,或是通过人工标注得来,建议正样本条数不少于1000条(排重后)。

负样本是告诉机器,“这样的文本不算”。

在第一种“有限范围的非此即彼”分类场景中,正负样本的特征差异很重要,就是要让机器清楚的明白正负差别在哪里。

在第二种“这种是,其它都不是”的场景中正样本的特征越明显越好,同时负样本一方面要跟正样本有明显的不同,另一方面要对正样本的过拟合特征有一定的矫正作用。

例如在识别非法内容时,黑产往往把非法内容夹杂在正常的文本里边,“最近全国大部分地区进入汛期,防汛成为各地的工作重点。炎炎夏日,无聊就来玩XXX吧,休闲一下,XXX应有尽有。”。后半句是非法内容,是正样本期望机器学到的特征,而前半句则会引入过拟合特征,线上实验时就会误把防汛相关的内容也识别进来。这时候通过补充误识别的内容到负样本中,就会修正这种过拟合。

负样本的条数大致跟正样本保持一致。

2. 数据清洗

数据清洗前两篇也都讲的比较多了,主要是剔除无用信息,并通过同义词替换应对变体对抗、强化特征。尤其是在黑产对抗中,黑产为了规避平台识别,会进行音近字、形近字、符号替代等各种方式表示一些特定词。因此积累同义词词表就变得非常重要。

而且同义词替换发生在模型训练之前,模型学到的是强特征词。线上识别时,文本由数据清洗中的同义词替换,将变体信息转化后准确的传递给模型进行识别。同义词配置的修改不需要重新训练模型,非常高效

3. 分词配置

在word embedding之前要进行中文分词,分词时可自定义分词词典和停止词词典。这两个配置对模型的效果影响也很大。

自定义分词词典是告诉分词程序,遇到这些字的时候优先这样把它们切割成一个词。

一方面对于专业词汇、领域词汇等非常用词汇的分词有指导作用,另一方面也可以用来调优模型。例如“电子”是某一类黑产内容识别的正样本中较明显的特征词。但同时电子专业、电子卡劵、电子票务等也是较常见的文本词,就会造成误伤。此时把电子专业、电子卡劵、电子票务加到自定义词典中,词向量就发生了变化。

停止词词典是告诉分词程序,遇到这些词就直接舍弃,不用写到分词结果中。

一般由常用语气词、介词等组成。在分词阶段干掉这些词,就可以使传达到模型的信息更为精练。同时,停止词还可以补充在线上识别阶段不期望带到模型里的信息词,如上面提到的“电子专业”等,或是一些被模型学去的过拟合特征词,例如1中提到的“汛期”“防汛”等。加入到停止词词典后,其词向量就不会输入给后面的模型,也就不会造成误判了。

我除了停止词词典外,对于分词过程中分出来的“单个字”的词也在分词阶段舍弃掉了。

二、反复模型训练

上面在将正负样本的时候其实已经提到了相关的内容。

当模型训练后的效果较差时,例如准确率低于60%(这个百分比只是个参考,表达大致模型已经初步成型的意思),召回不理想(因为我的应用场景无法评估线上被识别对象的总量,所以召回率没有做评估),那就证明“学习资料”出了问题。

如果召回率低,那就要补充正样本,让正样本的共性特征更明显;如果精确率低,那么就补充负样本,一方面要让正负样本由较明显的特征差异,另一方面可以把模型误召回的文本补充到负样本,矫正模型学偏的部分。

三、模型调优

模型初步已经由一定效果了,就要开始对模型进行打磨了。这里我采用的两种手段,一个是配置调优,一个是策略加持。

配置调优就是前面提到的三个配置:同义词替换配置、分词自定义词典配置、分词停止词配置。同义词替换配置主要影响召回率;后者主要影响准确率。具体原理上面已经讲到了,在此不再赘述。

策略加持主要是通过一些限制条件,帮模型砍掉基本不会出现正样本,又容易被模型误召回的文本。例如正样本都是长文本,较短的文本极大概率是负样本,就可以一条加文本长度限制的策略。除此之外我还用到了分词后的词个数和重复词个数两个条件。分词词个数跟文本长度原理类似,对于一些没什么信息含量的文本就被砍掉了;重复词个数是我在TextCnn实践中发现的诡异问题,一个词在语句中多次出现,TextCnn就更容易误判,尽管这个词并不是什么强特征词。于是我也用策略规避了这个问题。不知道大家是否遇到过同类问题,是否有更好的解决方案。

配置调优和策略加持都不需要重新训练模型,属于模型的抛光、打磨阶段,非常实用。我通过一个星期的线上实验,反复调整那三个配置,模型的精确率从70%打磨到了95%,召回率也有相应提升。

 

以上就是我的模型训练心得,因为思路的表达更多,所以文字也特别的。看到这里的同学可谓非常有耐心了,欢迎交流讨论。