NLP文本分类引擎的解决方案
2018-05-16王悦林
王悦林
摘要:人工智能应用最广的两个领域就是计算机视觉(CV)和自然语言处理(NLP)。计算机视觉的高速发展期是2012至2017年,目前研究的重点已经从静态的图片进入动态的视频领域,而自然语言处理的发展相对较慢,从2018年起,以BERT等句子级别预训练模型为代表,才进入高速发展期。
自然语言处理领域的应用很丰富,例如语言翻译、情感分析、客服机器人、新闻生成、舆情监控、文档归类、简历筛选等等。而从技术的角度,最多的应用就是文本分类,包括多元分类、多级别分类、多标签分类等。
针对层出不穷的文本分类需求,有必要设计出分类专用引擎,以提高效率和降低成本,并增强复用性。
一、整体设计
对于一个文本分类项目,在架构上分为数据处理、文本分类、文本挖掘和结果展现四个部分。本文着重在分类引擎的设计上。
引擎需要考虑的因素很多,基于目前的技术发展,以下几点需要重点考虑并解决:
1、如何选择基础算法
2、如何减少标签数据量
3、如何处理训练数据的不均衡
4、如何处理多达几十上百的类别
二、NLP基础算法选择
从2013年Word2Vec开始,可以选择的常用基础算法有GloVe,FastText,ELMo,GPT1.0,BERT,Bert as a service,MT-DNN,GPT2.0等等,最近一段时间发展的速度令人咋舌。具体如何进行选择呢?
首先要选择句子级别的算法,因为词级别算法没有考虑词之间的关系和语序,不仅处理不了语义组合、多义词、转折、依赖等各种语言学上的语法现象,连简单的语序也处理不了,我欠你一百万和你欠我一百万这种在语义上/现实社会中巨大的差异被忽视,语言处理能力较低。
其次要选择预训练模型,而不是从零开始构建。动辄几亿参数的预训练模型以多层的神经网络结构和巨大的训练数据量,已经学会了大量的语言知识,具有了超凡的语言理解能力。而且这类模型很多公司从成本角度是无法自己训练的,站在巨人的肩膀上会是明智的选择。
再次,从实际应用的角度,算法是否易用,网络资料是否齐全,也是要考虑的因素。因此上述的各种选择中,基于Transformer/Self-Attention,并能提供下游任务接口的BERT就成为不让之选。
三、令人头痛的数据标注
AI目前整体上还是处于弱人工智能阶段,简单说就是有人工才有智能,只有人类教会机器/算法如何工作,机器/算法才能分辨出不同的类别。这个教的具体动作,就是提供打好标签的数据来训练模型。大家常说的数据是基础,数据是燃料,数据是动力都是这个意思。
而给数据打标签的工作,也是目前人工智能领域的痛点之一,还催生了专门做数据标注的公司。常有人抱怨人工智能的项目一半以上的时间和费用都投入到了做数据标注上。
那么有没有技术上的方法来减少这种痛苦呢?有,那就是主动学习(Active Learning),其目的不是不再标注数据,而是大大减少标注的数据量。其基本的原理是,通过人工智能的方法来主动选择出标注意义更大的数据,以达到用一半的数据标注就能训练出满意效果的目的。
此方法的理论依据是标注数据量和模型正确率之间的关系。人们往往以为随着数据量的增长,准确率会持续提升,其关系是向右上方升起的一根直线,即线性关系。而根据实际试验,两者的关系是一条弧线,在初始阶段随着标注数据量的增长,多次训练的准确率会大幅提升,之后增幅就逐渐减小,效果越来越不明显。
如何主动学习呢?方法很多,使用算法和信息熵迭代操作会大大提升效率。具体步骤说明如下:
第一个启动模型采用迁移学习的思路,选择其它项目的成熟模型作为启动点。由于每个项目的具体分类不同,模型不能重用,但举例来说,对洗衣机的负面评价判别模型,用在冰箱评价上也是一个好的起点,比起从零开始构造模型,会大大减轻工作量和缩短项目时间。
以迁移过来的模型作为初始模型,对全部没有标注的数据直接分类。由于没有标注,分类结果无法判断对错,但是每一行数据的分类结果可以生成总和为一的概率分布,而排在第一位的概率数字代表了模型对于分类的信心。概率越高,确定性越大,则信息熵越小,而我们需要挑选出来的是信息熵最大的那一批数据,对其进行標注。如果最难分类的数据都被成功归属到了正确的类别,那么其它数据就更容易分类了。这样标注的数据就不再是随机进行选择,而是被精准定位,从而大大降低标注量。
用第一批标注的数据来训练出第一个真实模型,而用此模型来挑选出下一批需要标注的数据,多次重复此过程,直至准确率曲线不再升高,或升高的幅度不值得再投入人员和时间进行标注,就结束模型训练,完成分类任务。
四、如何处理数据的不均衡
在进行文本分类时,训练和测试数据量对于不同的类别往往并不均衡,有的类别多,有的类别少。这会导致训练出来的模型对于不同的类别区分的能力不同,对于数据量较大的类效果较好,也会把很多其它类数据误判为这个类别。其技术原因是模型训练时的唯一目的是最小化损失函数,而数据量较大类的数据对损失函数影响更大。
如果已知测试数据集的数据分布,并且确定真实数据集与测试数据集的分布相同,那么可以按此分布来调整训练数据。如果无法得知真实数据的分布,则应该训练出对每一个类别都有相同分辨能力的模型,因此需要处理数据的不均衡问题。
处理的技术方法中最常用的是上采样和下采样,即对超过平均数的类减少数据量,对不足平均数的类增加数据量。下采样时随机减少即可,上采样时对于文本可以用翻译软件进行多种语言间的来回翻译,或者直接拷贝数据成多份,再随机打乱。
那么除了数据的上下采样以外,还有没有其它的方法呢?既然技术原因是由于损失函数仅仅按照每类训练数据量的大小对待不同类别,那么完全可以调整损失函数,按照类别数量差异区别对待。其具体方法有静态调整和动态调整两种。