面向文本分类的BERT-CNN模型
2023-05-16秦全易军凯
秦全,易军凯
(北京信息科技大学 自动化学院,北京 100192)
0 引言
随着自然语言处理(natural language processing,NLP)的不断发展,文本分类作为自然语言处理的任务之一,被应用于许多方面,比如敏感信息过滤、新闻分类、情感分析等。基于自然语言处理的文本分类技术主要围绕文本表示、特征提取和特征分类三个方面。词嵌入作为自然语言处理领域早期的预训练技术,能够很好地进行词向量表示。Mikolov等[1]提出了一种词向量训练工具——Word2Vec,可以从大规模没有标注的语料中生成词的向量表示,但这种方法只考虑到了文本的局部信息,没有充分提取上下文信息。Peng等[2]结合了现有微博热点话题检测方法,提出了一种基于用户喜好的热点话题检测算法,该算法能检测微博中的热点话题,并能去除含有歧义的热点话题。姚艳秋等[3]基于点互信息与信息检索算法,提出了一种Laplace平滑情感判定算法用于情感词典的扩充,细化文本语义的规则来计算文本情感值。Guo等[4]提出了一种基于内容和上下文机制的方法,该方法使用BERT-BiLSTM-Attention(bidirectional encoder representations from transformers-bidirectional long short-term memory-attention)模型来提取文本中的特征。Jan Neerbek[5]将循环神经网络(recurrent neural network,RNN)应用于文本分类任务,虽然RNN模型在检测准确度上比其他模型性能要高,但是训练模型的时间较长,随着时间的增加,很容易出现“梯度消失”或“梯度爆炸”。沈麒宁[6]将Elmo模型(embeddings from language models)和卷积神经网络(convolutional neural network,CNN)相结合,提出了一种改进的Elmo-CNN文本分类模型用于敏感文档信息的检测。Devlin等[7]引入动态词向量BERT模型,利用Transformer结构的编码器(encoder)部分对文本进行双向学习和处理,通过对目标单词进行掩码来预测词语的向量,利用自注意力机制学习词与词之间的关系,使得词向量的表示能够融入句子级的语义信息。Liu 等[8]将ALBERT(a lite BERT)与CNN相结合来处理不同粒度不同层次的文本,但是由于CNN缺少记忆能力,并且卷积核不能太大,因此获取远程特征信息的能力较差。Li等[9]提出了BiLSTM-CNN方法,采用BiLSTM模型获得两个方向的表示,然后通过卷积神经网络将两个方向的表示组合成一个新的模型,提高了长文本分类的准确性。段丹丹[10]针对现有文本分类算法存在特征稀疏的问题,提出了一种基于Transformer的双向编码器表示的中文文本分类算法,此算法能有效表示句子层面的语义信息,具有更好的中文短文本分类效果。
本文将BERT模型与CNN模型相结合,提出了BERT-CNN文本分类模型。首先利用BERT中的自注意力(self-attention)机制获取词与词之间的语义关系,然后通过 CNN[11]提取文本特征,最后通过全连接层进行二分类。此模型充分提取了上下文文本信息,从而提高了文本分类精度。
1 BERT-CNN分类模型
本文提出BERT-CNN模型实现分类任务,其流程如图1所示,主要由BERT模型层、卷积神经网络层和全连接层组成。首先每条中文文本进入BERT模型层前先进行文本预处理,包括去除符号、分词和停用词等;然后将处理好的文本代入BERT模型层生成词向量;之后利用卷积神经网络层提取文本特征;最后将每条文本经过全连接层进行分类输出。
图1 BERT-CNN模型实现流程
1.1 基于BERT模型的文本表示
BERT[12]以Transformer的encoder结构为基础,主要包含MLM(masked language model)掩码任务和NSP(next sentence prediction)语句预测任务。BERT模型如图2所示,从整体来看,BERT的结构主要由输入层、编码层和输出层组成。
图2 BERT模型
1.1.1 输入层
在输入层中,输入向量由词向量(token embeddings)、段向量(segment embeddings)和位置向量(positions embeddings)三个向量相叠加而成,[CLS]和[SEP]分别作为一句话开头和结束的标志,并且[CLS]形成的向量可以作为整句话的语义表示,从而用于下游的分类任务。BERT有着并行化的优点,能很大程度上减少模型的训练时间,但这也导致了输入文本失去了词序性,因此我们加入位置编码P来获取词与词之间的位置关系。位置编码P按式(1)式(2)计算:
(1)
(2)
式中:p为当前词在句子中的位置;d为词嵌入维度;i为向量的某一维度。根据其位置的奇偶性,以余弦或正弦的形式表示其位置信息。以段向量ES表示当前词所在句子的编码,位置向量EP表示一个词所在的位置,词向量ET表示文本嵌入转换的向量。这样,输入文本X=[X1,X2,…,Xn]向量形式E(X)可表示为:
E(X)=EP⨁ES⨁ET
(3)
1.1.2 编码层
编码层是BERT模型中核心的部分,其内部是由多层双向Transformer编码器组成。Transformer编码器主要包含多头注意力层[13](multi-headed attention)和前馈全连接层 (feed forward neural network)两个部分。
多头注意力是Transformer编码器乃至整个BERT模型的核心,因为它可以学习到一句话中词与词之间的关系,且没有距离限制。多头注意力层有h个并行的注意力层,每一个注意力层被称为一个头,如图3所示。查询向量Q、键向量K、值向量V,通过3个线性层进行投影,然后进入注意力层得到注意力分数,学习词与词之间的语义关系,最后这h个头的输出将会被拼接,之后输入到最后一个线性层Wo进行整合,得到多头注意力。
图3 多头注意力机制结构
多头注意力分数和注意力分数的计算如式(4)式(5)所示。
M(Q,K,V)=C(H1,H2,…,Hh)Wo
(4)
Hi=A(QiWQ,KiWK,ViWV)
(5)
式中:M(Q,K,V)为多头注意力;C(H1,H2,…,Hh)为连接函数;Hi为第i个注意力分数;A(QiWQ,KiWK,ViWV)为注意力函数;WiQ、WiK、WiV是输入线性层的权重矩阵;Wo是输出线性层的权重矩阵。
多头注意力机制是注意力机制的一个特殊形式,可将计算注意力分数的操作分为三个阶段,实现过程如图4所示。首先计算查询向量Q与每个键向量K的相似性得出权重系数QKT;然后将上一步得到的权重系数进行归一化,使得原始数据的所有元素权重之和相加为1,通常使用Softmax函数计算;最后将权重向量与相应的值向量V进行相乘得到了最终的注意力矩阵A。注意力矩阵A的计算如式(6)所示。
(6)
图4 注意力机制实现过程
图中X是指输入矩阵,每一行代表一个词,序列里面的每一个词经过注意力加权之后,当前这个词等于用这句话中其他所有词重新表达了一遍,每个词含有了这句话中所有成分的信息[14]。即词与词之间存在着一定的“相关性”,当前词与其它词之间的权重系数越大,其“相关性”就越大。
1.1.3 输出层
输入文本序列X=[X1,X2,…,Xn]在经过输入层和编码层后,得出基于BERT模型的动态词向量矩阵T=[T1,T2,…,Tn]。
1.2 基于卷积神经网络的文本特征提取
在文本向量化表示中,如果词向量维度过大,则会造成维数灾难,导致大部分维度的向量只占据极小部分的权重,对最终分类结果有着很大的影响。因此需要对数据进行降维,以达到提取主要特征的目的。CNN在用于文本分类任务时,利用卷积层和池化层可以很好地对文本特征进行提取,因此。本文采用CNN完成对动态词向量矩阵T的特征提取,CNN的结构如图5所示。
图5 卷积神经网络
1.2.1 卷积层
CNN使用矩阵来表示一个句子,每一行表示一个词,列数代表词嵌入维度大小。卷积核在动态词向量矩阵T=[T1,T2,…,Tn]上通过上下滑动来提取特征,移动过程相当于提取n-gram特征,其中卷积核的长度主要用于捕获d个词之间的关系,卷积核的宽度就是词嵌入维度。之后利用不同尺寸的卷积核对动态词向量矩阵T进行卷积,最后通过ReLU激活函数得到维度大小为(n-d+1)×1的特征映射矩阵[15]Ci=[C1,C2,…,Cn-d+1],具体计算如下:
Ci=f(Wi·T+b)
(7)
式中:Wi为卷积核的权重矩阵;b为偏置项。
1.2.2 池化层
该层主要对卷积层的特征映射矩阵C进行压缩,提取主要局部特征。利用卷积神经网络CNN的最大池化层(max-pooling)获得主要的局部特征,丢弃掉不重要的特征,将得到的局部特征拼接构成新矩阵,具体计算公式如下:
Mi=max(Ci)=max(C1,C2,…,Cn-d+1)
(8)
式中:Mi为特征矩阵;max(C1,C2,…,Cn-d+1)为最大值函数。
1.2.3 全连接输出层
在得到特征矩阵Mi后,将其输入到全连接层中。为避免过拟合,通常会在在全连接层后接一个Dropout,Dropout的作用是以一定的概率丢弃神经元,将其置为0,然后用Sigmoid作为激活函数进行二分类:
(9)
式中:S(Mi)为Sigmoid激活函数。
2 实验与分析
2.1 实验环境
本实验运行平台的CPU为AMD Ryzen 75 800Hz,显卡为 Radeon 3.20 GHz,内存为16 GB,GPU为NVIDIA GeForce RTX3050,操作系统为Windows11,编程语言为Python,深度学习框架为Pytorch1.1。
2.2 实验数据集
本文将整个数据集分为“正常文本”和“敏感文本”标签,通过爬虫技术爬取今日头条、新浪微博20 854条中文文本作为“正常文本”标签的数据,然后通过维基百科下载和爬取14 873条中文文本作为“敏感文本”标签的数据,共35 727条,组成数据集,随后把数据集按7∶2∶1的比例分别分为训练集24 979条,测试集7 178条,验证集3 570条。
2.3 模型参数设置
本文的Word2Vec、Glove词向量的词嵌入维度d=256。BERT预训练模型采用的是由hugging-face团队发布的BERT-base-Chinese模型,模型参数为:Transformer 编码器层个数L=12,隐层单元H=768,注意力机制头数A=12。模型参数和训练参数如表1和表2所示。
表1 CNN模型参数设置
表2 训练参数设置
2.4 评价指标
评价指标是评价模型性能的标准,是数据分析中非常重要的部分,本实验采用准确率(accuracy)、精确率(precision)、召回率(recall)和F1 值(F-score)这4个评价指标对模型进行分析,各个评价指标的计算如下:
(10)
(11)
(12)
(13)
式中:ACC为准确率;P为精确率;R为召回率;F1为F1值。nTP为真阳性,表示实际类别为正类,预测类别为正类的数量;nTN为真阴性,表示的是实际类别为负类,预测类别为负类的数目;nFP为假阳性,表示的是实际类别为负类,但预测类别为正类的数目;nFN为假阴性,表示的是实际类别为正类,但预测类别为负类的数目。本文将“正常文本”设为正类,“敏感文本”设为负类。
2.5 实验结果与分析
为验证BERT-CNN模型的文本分类性能,尤其是在词向量的动态表示与静态表示上,本文分别选取了Word2Vec和Glove两种静态词向量模型与卷积神经网络模型组成Word2Vec-CNN和Glove-CNN两种对比模型。两者在文本分类领域中已经得到广泛的应用并在性能上有着较好的效果。其实验结果如表3所示。
表3 不同词向量模型的比较
从表4可以看出,相比于随机词嵌入与CNN模型结合,各个词向量在CNN模型上的分类效果更好;BERT-CNN模型的精确率比Word2Vec-CNN模型和Glove-CNN模型分别提升了0.57%和3.95%;BERT-CNN模型的F1值比Word2Vec-CNN模型和Glove-CNN模型分别提升了12.73%和9.1%;BERT-CNN模型的准确率比Word2Vec-CNN模型和Glove-CNN模型分别提高了10.07%和7.07%。总的来说,相比于Word2Vec-CNN模型和Glove-CNN模型,BERT-CNN模型的分类效果会更好,因为它能够通过注意力机制来提取上下文信息。
3 结束语
本文将BERT模型与CNN模型相结合,提出了BERT-CNN文本分类模型。首先,利用BERT模型里的注意力机制获取词与词之间的语义关系,解决了Word2Vec等模型形成的词向量忽视了上下文信息的问题;然后利用CNN模型提取文本的主要特征,从而达到降维的目的;最后将提取到的特征经过全连接层进行二分类。实验结果表明,本文提出的BERT-CNN模型相对于Word2Vec-CNN模型和Glove-CNN模型,在性能上有更好的表现。在今后的工作中,将对BERT-CNN模型进行优化,提高文本特征提取精度,从而进一步提升模型的准确率。