华帅 钟世立 李鑫鑫 陈彩凤
(东莞理工学院 计算机科学与技术学院,广东东莞 523808)
近年来,随着网络数据的快速爆发,面对复杂的海量数据,人力逐渐难以应对,运用计算机对文本进行自动分类的应用越来越普遍。文本分类作为自然语言处理的一个子任务,目前它的应用主要包括但不限于三个方面:第一,新闻的主题分类(文章分类),将新闻数据自动归档为如财经 、体育、军事、娱乐等栏目;第二,文本数据的情感分析,一般用于影视评论、商品评价及外卖评价等数据的分析;第三,舆情分析,与情感分析的区别在于舆情分析更侧重于目标群体的情感极性,多数情形下为二分类,一般用于政府或者金融机对社会的舆论导向分析。面对这些需求,文本分类算法也快速发展起来。本文基于当前需求,在文本分类大环境下进行新的分类算法 探索。
文本分类算法的相关研究,即从传统的机器学习算法如朴素贝叶斯、逻辑回归到k近邻、支持向量机[3]等逐渐发展到以CNN[4-6]为代表的深度学习。其中,文本分类的应用也发生了相应的变化。以支持向量机(SVM)为代表的传统机器学习模型和以XLNet[7]、BERT[9]和GPT[8]系列的参数学习模型在文本分类以及自然语言处理等任务方面取得了较好的分类效果,但像GTP-x系列、XLNet和BERT等预训练语言模型的参数高达亿级级别,一般研究人员的研究硬件环境难以支持此类模型的训练。此外,传统的机器学习模型往往基于数学上的统计理论和概率论,没有很好地利用深度学习神经元较强的非线性拟合能力。所以,在数据急剧增加时,传统的机器学习方法在大规模数据分类时效果不佳。而深度学习模型依赖于较多的数据,在大规模的数据集上表现更好,但它对算力要求也更高。受此启发,笔者提出了一种简化的预训练语言模型Simplified CNN,使其在应对中等规模数据(文本数量百万级内的数据)时能充分发挥传统机器学习模型和深度学习模型的优势,在达到较好的分类效果的情况下,模型更加精简。
笔者先梳理主流的语言预训练模型的发展历程,分析当前的预训练语言模型的优点和局限性,并针对模型的局限性提出了思考,提出一种简化的文本分类算法Simplified CNN,此算法在多个主流数据集上进行分类效果测试,取得了较好的表现,这可以为后续此方向的深入研究提供了参考。
语言中的词表征、文档表征与文本分类方法的改进一直是自然语言理解(NLU)任务中的主要研究方向,词的特征表示是自然语言处理中预处理环节的主要任务。传统的词表征方法如词袋模型BoW、TF-IDF[10],是基于语料库构成的词汇表来进行词统计,表征的结果是维度较高、稀疏性较大,且忽略了词之间的关系。为解决此问题,Mikolov等人提出的word2vec[1]词嵌入方法是一种基于统计的方法,可以有效地学习文本语料库中一个独立的词的嵌入信息,使不同的词在具有相似的表达意义的情况下也具有相似的向量表示,同时减少了词向量的维度与稀疏性,可以进行简单的线性代数运算。在word2vec的基础上,斯坦福大学Jeffrey Pennington等提出了GloVe[2]词表征方法,综合了LSA(Latent Semantic Analysis)[11]的利用全局文本统计数据进行潜在的语义分析的特点及Word2Vec捕捉语义和类比学习方面的能力,同时又避免了LDA(Latent Dirichlet Allocation)[12]在大数据集下的高计算成本,在文本的表征方面逐渐成为主流方法。
主流预训练语言模型的发展大体分三个阶段(如表1),第一阶段以谷歌公司提出的Word2Vec[1]和斯坦福大学提出的GloVe[2]为代表;第二阶段以谷歌公司的BERT[9]等为代表;第三阶段模型是在前面模型的基础上加以学习和改进,形成相对比较完备的语言预训练模型XLNet[7]和MPNet[14]。这些预训练语言模型大体分为AR(Autoregressive Language Modeling)和AE(Autoencoding Language Modeling)两种模型。AR语言模型是根据前面或者后面出现的tokens(将一个句子划分为多个词,每个词为一个token)来预测当前时刻的token,这类模型代表有ELMo[13]、GTP[8],而AE语言模型则是通过上下文信息(也可理解为前面和后面的tokens)来预测被遮蔽(masked)的token,这类模型代表有BERT[9]、Word2Vec[1]。
表1 主流的预训练语言模型的发展
BERT[9]采用MLM模型(Masked Language Modeling)进行预训练,在自然语言处理的多个子任务上取得了很好的结果,但是BERT忽略了预测词和上下文词之间的依赖关系,假设被Masked的词之间相互独立,而实际的语言中每个词之间并不具备独立性。为解决此问题,XLNet[7]引入PLM模型(Permutation Language Model),但XLNet仍然没有充分利用句子的位置信息,在pre-training阶段和fine-tuning阶段词表示的位置存在差异。为解决BERT和XLNet的不足,MPNet[14]通过利用预测标记之间的依赖关系排列语言建模,并以辅助位置的信息作为输入,使模型获取到完整的句子,减少位置差异,取得更好的效果。但这些模型的训练参数较多,训练时间较长,所需硬件要求也更高。对高校中的研究者探索将经典的简易预训练模型与简化的神经网络模型相结合,若分类效果能与之相近或存在差距较小则具有的研究价值较大。
Yoav Goldberg提到[15]非线性的神经网络语言模型相比较传统语言模型有许多优点,如增加上下文语境数据的情况下只需要线性增加参数的数量,无需人工过多干预,且具有很好的泛化能力。这种泛化能力有时在经典的统计语言模型(statistical language models)中并不能很容易的实现。
多层感知机MLP(Multi-layer Perceptrons )[15]是由线性模型发展而来。由于线性分类模型(包括单层感知机)不能解决XOR问题,通过引入多层神经元,使神经网络可以逼近非常复杂的非线性函数。
卷积神经网络(CNN)从2014年Yoon Kim的工作[22]开始运用在自然语言处理任务,Yoon Kim展示了CNN在文本处理任务上的出色表现,说明CNN不仅适用于计算机视觉领域,同样也可以运用于自然语言处理。Ye Zhang等人[21]给出了用于句子情感分析的神经网络的基本构造(如图1),基本步骤包括文本特征的提取(卷积操作)、特征的映射(池化操作)及softmax函数将最终筛选的特征向量归一化映射到n个类别上的概率分布。
Ye Zhang等人分析了用于句子分类的卷积神经网络参数选择问题及一些其他建议,对一般的文本分类任务,CNN的主要参数配置指导如下:
● 选择词嵌入模型(Word2Vec[1]、GloVe[2]等)的分类效果要显著好于使用类似于独热编码(one-hot encoding)的词向量;
● 卷积核的大小对于不同的问题要进行相应的调整;
● CNN模型的Dropout操作对于模型的性能影响较小;
● max池化操作一般好于其他类型的池化操作。
分析前人研究工作[1-2,7,13,21,23]的基础上发现对词表征操作(预训练),完成了任务:即通过学习已知数据的内部关系,先初始化模型的内部参数,再利用带标签数据不断优化输入参数及整个模型的参数,使模型在误分类损失最小的情况下达到相对最佳,减少随机初始化输入参数带来的不稳定因素影响。这里初始化参数可理解为语言模型的共同特性,(基于共同特性参数,对具体的数据任务学习新的特性,更新初始化的参数,建立一个特定任务的语言模型。因此在构建分类模型时,考虑到对嵌入层进行参数调整,再输入CNN模型中,模型细节在下一节中描述。
由于CNN在计算机视觉(Computer Vision, CV)发展相对成熟,而预训练语言模型GloVe[2]和分类模型CNN[22]在自然语言处理方面的研究较少,故笔者设计一个简化的卷积神经网络文本分类模型,探究在具体的文本分类任务中模型的分类效果。
图1 用于句子分类的卷积神经网络结构
为简化神经网络模型,此前需要理清神经网络的内部训练流程,神经网络模型优化的目标为神经网络的真实输出tr(true)与期望输出yr之间的误差(或者在达到设定的训练次数时所达到的误差)最小。函数表达式为:
(1)
其中,m表示输出层节点的个数,T=(t1,t2,…,tr)T为网络的实际输出,Y=(y1,y2,…,yr)T是网络的期望输出。
对于图2,假设输入层有m个节点,隐藏层有n个节点,输出层有r个节点,输入层到隐藏层的权重为wij,隐藏层到输出层的权重为φjk,i,j,k分别表示输入层第i个节点、隐藏层第j个节点和输出层第k个节点,神经网络的基本训练过程如下。
图2 一个神经网络示例
1)神经网络信号传输。
隐藏层的输出:
(2)
式中,fH表示隐藏层使用的激活函数,xi是来自输入层的数据,假定输入向量为X=(x1,x2,…,xm),输出向量为Y=(y1,y2,…,yn),输出层的输出为:
(3)
其中,表示输出层使用的激活函数,是来自隐藏层的输出。
2)误差最小化过程。
需要指出的是,误差最小化的过程是通过不断修正每层的权重wij和φjk,使神经网络的实际输出不断逼近期望输出,根据式(3)和式(1)有输出层的权值修正值:
(4)
(5)
将当前网络的权值用求得的修正值更新:
wij=wij+Δwij,
(6)
φjk=φjk+Δφjk,
(7)
回到式(2)、式(3),计算式(4)和式(5),直至误差满足要求或者训练次数用尽。
基于以上的认识和前人相关工作[2,15-16,21-22],笔者尝试对文本分类模型进行简化以适应更多的文本分类的应用场景。
预训练好的词嵌入语言模型(GloVe[2])在Wikipedia等大型语料库(样本数量在数亿级别以上)训练得来,因此该词嵌入的权重是相对于整个语料库而言,对于本文的数据集任务,词的重要性和GloVe上的词重要性并不一样甚至存在较大差别,因此在使用词嵌入层(Word Embedding Layer)作为神经网络输入时,根据具体任务训练词嵌入层的权重。在此,使用文献[1]中的skip-gram模型,word2vec模型中的skip-gram语言建模是用一个中心词(center word)去预测上下文的词(context word),即:
P(context│center) ,
(8)
根据存在于语料库中所有的[center word, context word]词对,找出概率最大的一组,即:
(9)
根据式(1)~式(7)的分析,由于人工神经网络的信号传递本质上是一个损失函数最小化的过程,因此将词嵌入模型的神经网络损失函数转换为求最小值:
(10)
通过使用一个三层(input layer, hidden layer, output layer)神经网络结构的模型来训练该词嵌入层,使式(10)最小时,根据式(6)和式(7)分别得到隐藏层和输出层的权值矩阵:,取作为最后的词嵌入层的权重。
使用单层卷积操作,不采用多通道和多种卷积核,在卷积操作中选用线性修正单元(Rectified linear unit, ReLU)和tanh作为激活函数,表达式分别为:
函数和导数的图像如图3所示,ReLU函数的作用是将负值变为0,正值原样输出,这说明在同一时刻某些神经元并不会被激活,这使神经网络中的神经元具有稀疏激活性,减少了过拟合的影响。对于tanh函数来说,抑制了过大的值对模型的影响。二者的选择根据具体实验效果而确定。
使用一个池化层且使用1-max作为池化标准,层与层之间不进行Dropout操作。如图4示,在CNN网络中,神经元信号在池化层的向前传播过程为:
y1=max(xi)i={1,2,5,6} ,
y2=max(xi)i={3,4,7,8} ,
y3=max(xi)i={9,10,13,14} ,
y4=max(xi)i={11,12,15,16} ,
在误差最小化的过程中(见式(1)),池化层没有可以优化的参数,因此无权值调整操作,主要将求得的权值向上一层传递。如,对于式(9),假设x5为最大值,则分别对x1,x2,x5,x6求偏导:
图3 ReLU激活函数及其导数(左),tanh激活函数及其导数(右)
图4 One-max池化操作
最后将卷积层和该池化层的权重向前一层传递记为ωy,则传递的值为1*ωy=ωy。由此得到的模型示意图如图5,可以看出卷积层之前为根据文本预训练的语言模型,卷积层之后为CNN的4个基本核心层,即卷积层、池化层、全连接层和softmax输出层。
综上,给出算法流程如图6,可以看出该算法包含了所有关键计算要素,在具体的执行上采用基本的神经网络思想,无复杂网络结构。下一节将在文本处理常用的数据集上,将该模型与主流的算法及当前最好的算法进行比较,以检测模型的实际效果。
图5 Simplified CNN结构示意图
算法1:Simplified CNNInput: 词向量:X=(x1,x2,…,xn)Output:输入数据的类别:Y=(c1,c2,…,ck), k表示类别1Do: 计算各层的输入输出2 计算输出层的误差3 修正网络的权值4Unitl: 满足精度要求或者达到训练次数
所有实验均是在同一台计算机上完成,计算机操作系统为Windows 10,64位,处理器参数为:Intel(R) Core(TM) i5-7300HQ,CPU的主频为2.5GHz,使用内存为24GB。实验全部由CPU完成计算。
实验选择8个基准数据集(5种),分别为MR、SST、IMDB、Yelp、Amazon。基本信息如表2,其中,‘Name’表示数据集的名称,‘Class’表示数据集包含有多少个类别,‘Length’表示经过处理后平均每条评论数据的单词个数,‘Train’表示训练集的样本个数,‘Test’表示测试集样本的个数,‘Dev’表示开发集的样本个数。
表2 情感分析(SA)常用数据集
实验中开发集被合并到训练集中,同时训练集和测试集的划分采用shuffle操作(随机打乱),避免指定划分测试集和训练集可能的缺陷。其他指标与数据的出处论文保持一致,需要注意的是,在处理上述数据集的过程中,实际的样本数据可能与给定的数据集的‘Size’存在细微差异,部分数据集存在一些数据错误,实验前进行了相应的预处理。
MR数据集:Movie Review(MR)数据集[18]是收集自IMDB网站的一个电影评论子集,被开发用于检测特定评论的情绪及判断该情绪的积极性或消极性任务,共包含10 662条评论,其中消极评论(negative)和积极评论(positive)各5 331条。
SST数据集:Stanford Sentiment Treebank(SST)数据集[19]是MR数据集的扩展,具有两个版本,分别为SST-5和SST-2,前者为5分类任务,后者为2分类任务,5分类任务分别为强消极、消极、中性、积极、强积极。该数据集被划分为训练集(train set)、测试集(test set)、开发集(development set)。需要指出的是,SST-1和SST-2是同一个数据集,SST-2是在SST-1数据集的基础上去除情感为中性的(neutral)词所得,该信息在很多使用此数据集的论文中未被提及,易造成误解。
IMDB数据集:Internet Movie Database(IMDB)[24]被开发用于对二极性情感的电影影评的分析,共有50 000条数据,正负各25 000条,测试集和训练集的比例划分为1∶1。
Yelp数据集[23]:与SST数据集类似,Yelp数据集包含两类数据,其中一种是二分类评论数据,称之为Yelp-2,另一种是5分类数据集,称之为Yelp-5。Yelp-5含有700 000条评论数据,其中训练集650 000条,测试集50 000条,Yelp-2包含598 000条评论数据,其中训练集560 000条,测试集38 000条。
Amazon数据集:该数据集收集亚马逊商城产品评论的数据[25],包含了从1995年6月至2013年3月份在2 441 053个产品上6 643 669位用户共34 686 770条评论,该数据集同SST数据集一样,是大规模数据集,但一般取其子集并把其划分为5分类(Amazon-5)和2分类(Amazon-2)两个版本,由于数据集较大,包含的评论种类较多,最新的数据源链接(1)https://nijianmo.github.io/amazon/index.html#subsets。
选取与本文使用的共同的数据集尽可能多的模型进行对比实验,陈列了目前最好的分类结果SOTA及参考文献。
将Simplified CNN分类模型在多个数据集上进行测试,以分类的准确率为指标:
其中,TP表示对于P类(positive)分正确的个数,TN表示N类(negative)分正确的个数,对多分类情况与之类似,Accuracy是由分类正确的类别样本数除以总样本数。结果如表2,‘*’表示模型在该数据集上内存溢出,为使实验顺利进行,舍弃了出现次数较少的特征并将测试集与训练集按1∶1划分(通过增大测试集数量,减少训练集数量进行分摊内存消耗),以满足内存要求,‘#’表示该数据集对于该模型过大,无法使用‘*’的方式解决内存溢出问题。
根据表3,取出部分数据集和部分模型进行比较,如图7所示,分析图7(a)可以发现,在实验所取的8个数据集上,前6个数据集虽然和SOTA相差一定的距离,但和LSTM相近甚至优于LSTM。随着数据集增大,简化模型分类效果逐渐逼近SOTA;分析图7(b),简化CNN分类器在中等规模数据集上的分类效果并不弱于深度学习复杂网络(CharCNN、BERT、LSTM和SOTA),分析图7(c)和7(d)可以发现,简化的模型在所有比较的模型中处于中等靠前位置,说明其简化操作并未削减分类性能。
表3 主流数据集上的分类效果比较
图7 不同数据集上模型之间的比较
在此基础上,进一步比较模型运行时间,如图8(分别在6个数据集和8个数据集上比较是因为SVM、LR、NB在Amazon数据集上内存溢出)可以发现,简化模型与传统机器学习模型相比较,运行时间较长,但与LSTM深度学习模型相比,运行时间大幅减少。
将图7、图8结合,分析分类效果和模型运行时间的关系(如图9),可以看出,在MR、IMDB、Yelp-2、Yelp-5数据集上简化模型效果优于其他模型,同时在运行时间上与传统机器学习模型相比并未表现出较大差距。
加入数据集的平均句子长度和数据集的大小两个指标进一步进行对比分析,观察到模型的分类效果与数据集自身特点的关系,如图10。对比图10左右两张图,简化后的模型在中等规模数据集上(几十万至几百万)分类效果并未下降,在Yelp-5和Amazon-5数据集上甚至分别优于LSTM和CharCNN,可能是因为CharCNN将输入的文本以单个字母作为卷积对象,在处理较大数据集5分类任务上会出现语义提取不足的情况,另外,由Yelp-5到Amazon-5的数据集句子长度减少,数据量增大,LSTM和简化模型均提高了分类准确率,而CharCNN分类效果却下降了,说明CharCNN不能很好地处理较大数据集下多类别的分类任务,反映了简化模型更能适应多种分类场景。
图8 模型运行时间比较(单位:h)
图9 部分数据集上模型的运行时间和分类效果比较
图10 部分数据集上的模型分类准确率(左)与数据集的大小和句子长度(右)
将简化的卷积神经网络与词嵌入预训练语言模型相结合的方法达到了一定的效果,但从实验结果来看,仍有待改进的地方,尤其是针对不同场景下的数据集要进行相应的模型参数调整,并不能用相同的参数去测试所有的数据集。同时可以看到,分类效果与SOTA存在一定的差距,仍需要探索后续的改进模型。