导读:本文是“数据拾光者”专栏的第四十九篇文章,这个系列将介绍在广告行业中自然语言处理和推荐系统实践。本篇主要介绍我们构建的oCTS分类器优化训练系统,一个标注人员都可以优化分类器的训练系统,对于中小团队希望又快又好的训练分类器可能有所帮助。
欢迎转载,转载请注明出处以及链接,更多关于自然语言处理、推荐系统优质内容请关注如下频道。
知乎专栏:数据拾光者
公众号:数据拾光者
摘要:本篇主要介绍我们构建的oCTS分类器优化训练系统,一个标注人员都可以优化分类器的训练系统。首先介绍了项目背景和目标,oCTS主要针对人工可标注的数据场景又好又快的训练分类器;然后重点介绍了项目技术概要,涉及主动学习、弱监督学习、知识蒸馏等方面;接着展示了产品形态和效果;最后对项目进行了总结,并阐述未来优化方向。对于中小团队希望又快又好的训练分类器可能有所帮助。
下面主要按照如下思维导图进行学习分享:
01
项目背景和目标
本篇主要介绍我们构建的oCTS分类器优化训练系统。oCTS主要是针对人工可标注的数据场景又好又快的训练分类器,这里人工可标注的数据主要包括NLP中的文本分类、关键词提取等,还可以是CV场景中的图片识别,或者是多模态场景中的视频理解等。
1.1 构建分类器遇到的问题
在实际工作场景中,我们经常会遇到各种分类问题,比如NLP场景中的文本分类,这里具体的业务可以是搜索场景行业词包在线分类,还可以是小X语音助手安全服务模型,还可以是用户兴趣标签建模等。针对这些实际的业务场景需要构建分类器,而构建分类器会遇到以下三个主要问题:
获取标注数据困难,标注成本越来越高。下面是CV场景中医学业务中X射线和CT图片标注的时间成本和金钱成本,可以发现标注成本是非常昂贵的:
图1 CV场景中医学业务标注成本
对应到我们NLP场景中文本分类任务,需要标注query文本,一般情况下标注人员每 天可以标注200条样本,并且随着标注体系复杂度增加,标注的难度也会增加。所以整体看来标注成本是越来越昂贵的。
样本不均衡问题严重。对于分类任务来说经常会遇到样本不均衡问题,也就是通常所说的长尾现象,下面是长尾现象图:
图2 长尾现象图
长尾现象就是头部标签的样本分布非常密集,而尾部标签的样本分布则非常稀疏,从而导致分类器的效果大幅大下降。
大量业务相关的无标签数据集并没有被很好的使用。
1.2 oCTS项目目标
为了解决训练分类器遇到的问题,我们构建了oCTS分类器优化训练系统,主要目标是利用少量的标注数据就可以又快又好的训练分类器,同时仅依靠标注人员就能高效的优化分类器。
1.3 业界现状
当前业界现状是分类算法很多,也有集成的开源解决方案,比如腾讯开源的NeuralTextClassifier(开源项目的github地址为:https://github.com/Tencent/NeuralNLP-NeuralClassifier);
小样本学习算法也有很多,但是工程上有效集成的很少;
同时AI辅助数据标注的产品很多,比如百度和亚马逊都有相关产品,公司内部X也有自主学习平台,但是只输出了样本数据,并没有优化模型。
对于oCTS系统来说输入是少量有标签的数据和大量的无标签数据集,输出是一个优化的分类器模型和大量自动扩展的数据集。
02
项目适用场景
oCTS适用于以下场景:
可人工标注数据。oCTS适用于人工标注样本场景中,比如NLP、CV和多模态等场景;
人工标注样本量较少并且标注人力紧张。oCTS可以通过主动学习挑选高价值样本数据进行标注,从而提升标注效率,节约标注成本;
样本不均衡情况严重。oCTS通过模型和样本层面优化可以有效缓解样本不均衡问题,提升模型的效果;
线上性能要求很高。以NLP场景为例,oCTS通过知识蒸馏技术可以将BERT等蒸馏到轻量级模型textCNN上,从而线上推理性能较高,模型效果较好。
整体来说oCTS可以应用到各种分类任务中。
03
项目技术概要
3.1 项目流程图
图3 oCTS项目流程图
上面是oCTS系统流程图,整体来看系统的输入是少量标注样本数据和海量无标签数据,输出则是一个优化的分类器模型。系统整体分成半监督和自训练两个流程。半监督流程就是上图中大循环,主要是S1-S6流程;自训练流程就是小循环,主要是S4-S6流程。下面详细介绍oCTS项目流程:
Step1初始阶段根据少量人工标注的数据集D1来训练分类器并评估效果,作为初始分类器;
Step2第一轮大循环会使用Enlarge&Clean策略通过D1去无标签数据集D0中扩展样本作为扩展之后的训练集,用新的训练集去训练一个分类器并评估效果,和初始分类器对比。如果新的分类器效果比初始分类器差,那么说明Enlarge策略无效直接退出半监督流程;如果新的分类器效果优于初始分类器则证明Enlarge策略有效,并进入小循环;
Step3用当前最好的分类器模型去预测D0,通过Pesudo Label筛选策略选择高置信度样本添加到训练集中,使用新的训练集训练一个新的分类器并评估模型效果。如果新的分类器效果优于当前最好的分类器模型,则说明Pseudo Label筛选策略是有效的,则继续使用当前最好的分类器模型去预测无标签数据集,不断循环;如果新的分类器效果比当前最好的分类器模型效果差,则说明Pseudo Label筛选策略是无效的。连续N轮Pseudo Label筛选策略无效,则会退出小循环;
Step4Enlarge&Clean策略和Pseudo Label筛选策略会使用Active Learning标注策略选择高价值标注样本提交给标注员标注,标注完成之后会将标注数据添加到D1;
Step5当D1增多后,会进入第二轮大循环,即进入Step2,不断后续流程。如果D1没有增多,则停止整个流程。
3.2 核心模块介绍
3.2.1 Enlarge&Clean策略
Enlarge&Clean策略主要包括Enlarge策略和Clean策略,其中Enlarge策略主要用于扩展训练集,Clean策略用于修复错误标注样本。
Enlarge策略主要在大循环流程,是基于少量的标注数据集从海量无标签数据集中进行扩展训练集。对于NLP场景来说已有的Enlarge策略主要有以下两种:
基于语义匹配SimBERT扩展训练集。SimBERT是追一科技开源的预训练模型,主要用于相似文本匹配,同时支持生成任务和检索任务。实际使用中主要是利用SimBERT的检索任务去海量无标签数据集中匹配相似样本。为了提升相似文本匹配的检索效率,我们会使用faiss来提升检索速度。下面是SimBERT+faiss匹配相似文本的流程图:
图4 SimBERT+faiss匹配相似文本的流程图
关于SimBERT的详细介绍可以参考我之前写过的文章《广告行业中那些趣事系列30:实际业务超好用的SimBERT》。
基于对比学习SimCSE扩展训练集。对比学习最早出现在CV场景中,后来迁移到NLP场景。当前我们使用的是基于drop mask的方式构建对比学习方案,也就是SimCSE模型。无监督SimCSE模型架构如下图所示:
图5 无监督SimCSE模型架构图
关于SimCSE的详细介绍可以参考我之前写过的一篇文章《广告行业中那些趣事系列35:NLP场景中的对比学习模型SimCSE》。
Clean策略主要用于修正错误样本,主要通过模型的容错能力找到最好模型的预测值和标签不一致的样本进行二次标注,从而修复错误样本。
3.2.2 Pseudo Label筛选策略
Pseudo Label筛选策略是在小循环中,主要是利用当前最好的模型去预测海量无标签数据集,选择置信度高的样本添加到训练集中。目前支持以下策略:
选择正样本/正负样本。对于正样本很少而负样本很多的样本不均衡场景,主要选择正样本添加到训练集中;
基于预测概率得分递减选择正负样本。可以根据模型的预测概率得分来选择正负样本,比如第一轮可以选择模型预测得分大于0.95的样本,第二轮选择大于0.9,依次递减;
基于预测概率得分阈值选择正负样本。可以根据模型的预测概率得分设置阈值,比如选择模型概率得分大于0.7的;
基于预测概率得分阈值比例选择正负样本。根据模型的预测概率得分设置阈值并选择一定比例。
上述Pseudo Label筛选策略可以单独或者组合使用,主要依据实际的业务场景和实验进行对比选择。
3.2.3 Active Learning标注策略
Active Learning标注策略的主要目的是选择高价值语料进行标注,提升标注效率。这里高价值语料主要是指具有不确定性和差异性的语料。如下图所示的分类器样例,我们希望选择的标注语料是不确定性较高的,也就是尽量靠近分割面,模型难以识别的。同时希望选择的标注语料是差异性比较大的,尽量分布在不同的语料空间中。
图6 分类器样例展示
Active Learning主要有以下几个流程:
根据一定的策略选择标注样本交给标注者标注;
标注者标注完样本放入标签数据池中;
从标签数据池中获取训练样本用于模型训练,不断进行上述流程。
下面是主动学习流程图:
图7 主动学习流程图
主动学习流程中最重要的是选择策略,oCTS支持以下选择策略:
不确定性策略。不确定性策略包括置信度最低策略、熵策略等。不确定性策略主要是为了选择模型难以识别的样本,比如有两条样本,其中一条样本模型预测得分为0.9,另一条样本模型预测得分为0.6,我们会认为预测为0.6的样本模型更加难以识别,可能会带来更多的信息增益;
差异性策略:差异性策略主要是基于聚类算法选择策略等,通过聚类算法对样本进行聚类操作,从不同类别中选择样本进行标注;
基于委员会的查询策略。基于委员会的查询策略是使用多种查询策略进行投票确定最终需要标注的样本。
实际任务中我们会基于不确定策略和差异性策略相结合来选择高价值样本进行标注。关于主动学习的详细介绍可以参考我之前写过的一篇文章《广告行业中那些趣事系列22:当文本分类遇上了主动学习》。
3.2.4 解决样本不均衡问题
分类任务中经常会遇到样本不均衡问题,oCTS主要从样本层面和模型层面缓解样本不均衡问题。
样本层面主要采取以下策略:
欠采样和过采样。欠采样主要是对于样本数量比较多的类别少采样一些,过采样则是对于样本数量比较少的类别进行重复采样,两种方式都是人为控制正负样本比例;
样本增强。通过样本增强技术可以增加样本数量较少的类别样本,NLP场景中常用的样本增强方法如下图所示:
图8 NLP场景中常用的样本增强方法
常用的样本增强技术主要分成以下几种:
-
回译技术。回译技术是利用优秀的翻译系统将文本从A语言翻译成B语言,再翻译成C语言(中间可以再进行多跳),最后再翻译回A语言,就可以得到语义基本一致,但是表现形式略微不同的样本,从而达到样本增强的目的;
词汇替换技术。词汇替换技术主要是通过不同的方法替换部分词,可以是基于同义词替换、基于word embedding的替换、基于masked LM的替换和基于TF-IDF的替换等;
正则表达式的替换技术;
随机噪声引入技术。随机噪声引入技术主要包括引入随机拼写错误、语句打乱、随机插入非停用词的同义词和词重复等。其中最有意思的是词重复,对应到我们实际的语言场景中其实也容易理解,一个说话结巴的人并不会影响我们理解其要表达的意思;
生成式的方法。生成式方法住户要是尝试生成额外训练数据的同时保持标签信息。
模型层面缓解样本不均衡问题通过优化损失函数,主要采用以下策略:
类别加权Loss。类别加权Loss主要是对于样本数量比较多的类别降低权重,对于样本数量比较少的类别增加权重;
Focal Loss。Focal Loss主要从样本识别的难易程度进行加权处理,对于模型容易识别的样本降低权重,而对于模型难以识别的样本增加权重;
GHM Loss。GHM Loss对FocalLoss进行了优化,认为特别困难的样本有可能是标注错误的样本,也应该降低权重。
下面对比交叉熵损失函数、Focal Loss和GHM Loss三种损失函数对不同梯度模长样本(识别难易程度不同的样本)的抑制效果图:
图9 损失函数对识别难易程度不同样本的抑制效果
从上图中可以看出,Focal Loss对于模型容易识别的样本具有很好的抑制效果(左边横坐标靠近0),而GHM Loss对于模型容易识别的样本和非常难的样本(右边横坐标靠近1)都具有很好的抑制效果。
之前写过一篇文章详细介绍过缓解样本不均衡问题的办法,感兴趣的小伙伴可以查看:《广告行业中那些趣事系列24:从理论到实践解决文本分类中的样本不均衡问题》。
3.2.5 通过知识蒸馏优化线上模型
图10 BERT蒸馏到TextCNN
以BERT为代表的预训练+微调两阶段模型优点非常明显,效果好应用范围广,但是因为模型参数量巨大所以线上推理性能较差,部署到线上很难满足时延要求。而以TextCNN为代表的传统文本分类模型虽然效果较差,但是优势在于模型简单,线上推理性能较好,很容易部署到线上。有没有一种效果好线上推理性能快的方法呢?知识蒸馏可能是一种不错的方案。知识蒸馏的核心思路是让BERT等预训练模型作为老师去教学生模型TextCNN,从而线上部署学生模型TextCNN,可以很好的满足线上推理的时延要求。更神奇的是经过蒸馏的TextCNN模型效果可以媲美BERT模型,从而得到效果好线上推理性能快的模型。
知识蒸馏之所以可以提升学生模型的效果,其中一个主要原因是可以提供更多的“暗”知识。下面以手写数字识别任务举例。通常的图片识别分类任务可以提供的知识主要是标签,也就是图片对应的标签数字1。而知识蒸馏则提供的知识是logits,会告诉这张图片是1的概率为0.7,7的概率是0.2,9的概率是0.1,相当于提供了更多的知识,所以经过知识蒸馏后的学生模型效果也非常出色。下面是知识蒸馏提供更多知识介绍图:
图11 知识蒸馏提供更多知识
关于知识蒸馏的详细介绍小伙伴可以查看我之前写过的一篇文章《广告行业中那些趣事系列21:从理论到实战BERT知识蒸馏》。
04
产品形态和效果展示
4.1 服务创建
oCTS目前已经融合到GS平台。以NLP场景中文本分类为例介绍oCTS的使用流程,下面是主流程配置文件介绍,配置文件如下图所示:
图12 oCTS主流程配置文件介绍
主流程配置文件有以下几个重要项:
数据集准备。用户使用oCTS需要准备少量有标签数据集、大量无标签数据集和测试集;
分类器选择。可以选择BERT、TextCNN和FastText等;
主动学习策略选择;
Enlarge策略选择;
训练评估预测代码和oCTS相解耦。初级用户可以使用默认的训练评估和预测代码,高阶用户则可以自定义开发对应代码流程。
以BERT为例分类器配置文件如下所示:
图13 oCTS分类器配置文件介绍
分类器配置文件有以下几个重要项:
预训练模型地址;
模型相关配置参数;
分类Dense层配置。得到BERT的语义句向量之后可以配置分类层,通过列表可以配置多层;
BERT是否微调。
以SimBERT为例Enlarge策略配置文件如下:
图14 oCTS的Enlarge配置文件介绍
Enlarge配置文件有以下几个重要项:
SimBERT预训练模型地址;
Faiss构建索引类型。为了提升SimBERT检索相似文本向量的效率线上使用了Faiss,这里需要设置不同的索引类型;
相似度阈值设置。通过阈值可以得到不同相似度的文本向量;
是否pca降维。经过BERT得到的语义向量一般是768维,这里可以设置经过pca降维,可以提升检索效率。
4.2 标注数据流程
oCTS训练一轮之后会通过主动学习选择高价值样本进行标注,这里可以通过办公软件、短信等方式提醒标注人员进行标注。标注样本可以在专门的标注平台进行,当完成一批样本标注之后点击推送,可以将标注完成的样本加入到oCTS进行下一轮训练,不断优化分类器。
4.3 产品效果展示
oCTS目前已经应用到很多实际业务场景中,比如搜索行业词包在线分类、用户兴趣标签建模和小X语音助手安全服务模型中,并取得不错的线上效果。
我们对比了使用随机采样和主动学习方法对模型效果的提升情况,使用的主动学习策略为least_confidence&k_means混合查询策略,下面是主动学习模型效果提升图:
图15 主动学习模型提升效果
如上图所示,横轴是轮数,每轮使用不同的方法获取1000条标注样本;纵轴是模型效果提升情况。可以看出使用least_confidence&k_means混合查询策略获取的标注样本模型效果提升要优于随机采样策略,尤其是小样本情况下更加明显。
05
项目总结和未来优化方向
整体来看,oCTS具有以下特点:
提升标注效率,节约标注成本。通过主动学习算法选择高质量标注样本从而极大提升标注效率,降低标注成本;
提升训练集规模。通过弱监督学习有效利用海量业务相关的无标签数据集,提升训练集样本规模;
缓解样本不均衡问题。从模型和样本层面有效缓解样本不均衡问题;
模型解耦。从样本层面构建分类器训练系统,模型和训练系统解耦,可灵活应用于NLP、CV等场景;
可获取线上性能快效果好的推理模型。通过知识蒸馏技术可以获取性能快和效果好的线上推理模型;
项目易用性好。可灵活应对初级使用者和高阶开发者,标注人员也可以直接优化分类器。
oCTS后续优化方向如下:
增加Enlarge策略和主动学习策略;
提升系统的训练效率;
提升系统的交互能力增加系统的易用性;
适配更多分类场景;
增加更多更复杂的知识蒸馏算法。
06
总结及展望
本篇主要介绍我们构建的oCTS分类器优化训练系统,一个标注人员都可以优化分类器的训练系统。首先介绍了项目背景和目标,oCTS主要针对人工可标注的数据场景又好又快的训练分类器;然后重点介绍了项目技术概要,涉及主动学习、弱监督学习、知识蒸馏等方面;接着展示了产品形态和效果;最后对项目进行了总结,并阐述未来优化方向。对于中小团队希望又快又好的训练分类器可能有所帮助。
最新最全的文章请关注我的微信公众号或者知乎专栏:数据拾光者。
码字不易,欢迎小伙伴们点赞和分享。