本文将分 3 期进行连载,共介绍 20 个在文本分类任务上曾取得 SOTA 的经典模型。
第 1 期:RAE、DAN、TextRCNN、Multi-task、DeepMoji、RNN-Capsule
第 2 期:TextCNN、DCNN、XML-CNN、TextCapsule、Bao et al.、AttentionXML
第 3 期:ELMo、GPT、BERT、ALBERT、X-Transformer、LightXML、TextGCN、TensorGCN
您正在阅读的是其中的第 2 期。前往 SOTA!模型资源站(sota.jiqizhixin.com)即可获取本文中包含的模型实现代码、预训练模型及 API 等资源。
第1期回顾:TextRCNN、TextCNN、RNN…你都掌握了吗?一文总结文本分类必备经典模型(一)
本期收录模型速览
模型 | SOTA!模型资源站收录情况 | 模型来源论文 |
TextCNN | https://sota.jiqizhixin.com/models/models/5d977df9-be84-4956-b672-7d4aff0b6bda 收录实现数量:2 支持框架:TensorFlow、PyTorch |
Convolutional neural networks for sentence classification |
DCNN | https://sota.jiqizhixin.com/models/models/e84e2b4a-058c-485b-a011-3707d6e43161 收录实现数量:1 支持框架:TensorFlow |
A convolutional neural network for modelling sentences |
XML-CNN | https://sota.jiqizhixin.com/models/models/06a8ba14-a96e-404b-b47a-549b606c9b3d 收录实现数量:1 支持框架:PyTorch |
Deep learning for extreme multi-label text classification |
TextCapsule | https://sota.jiqizhixin.com/models/models/3a9c6a86-16be-4d75-9a65-353bdcdffc18 收录实现数量:1 |
Investigating capsule networks with dynamic routing for text classification |
Bao et al. | https://sota.jiqizhixin.com/models/models/d7a53e59-7faa-4258-904c-d1fd8a716b88 收录实现数量:1 |
Few-shot Text Classification with Distributional Signatures |
AttentionXML | https://sota.jiqizhixin.com/models/models/839883d4-569c-4d5c-9457-e5a374375875 收录实现数量:1 |
AttentionXML: Label Tree-based Attention-Aware Deep Model for High-Performance Extreme Multi-Label Text Classification |
文本分类是自然语言处理中最基本、最经典的任务,大部分自然语言处理任务都可以看作是分类任务。近年来,深度学习在众多研究领域中获得了巨大的成功,如今,也成为了 NLP 领域的标配技术,广泛渗透入文本分类任务中。
与数字、图像不同,对文本的处理强调精细化的处理能力。传统的文本分类方法一般需要对输入模型的文本数据进行预处理,此外还需要通过人工标注的方法来获得良好的样本特征,然后使用经典的机器学习算法对其进行分类。类似的方法包括 NaiveBayes(NB)、K 近邻(KNN)、支持向量机 SVM 等。特征提取的水平对文本分类效果的影响甚至高于图像分类,而文本分类中的特征工程往往非常耗时且计算成本高。2010 年后,文本分类的方法逐渐过渡到深度学习模型。应用于文本分类的深度学习通过学习一系列的非线性变换模式将特征工程直接映射到输出,从而将特征工程集成到模型拟合过程中,一经应用就获得了巨大的成功。
与图像分类模型不同,文本分类模型一般不会采用堆叠模块、修改深度模型结构等方式去改进,更多则是通过引入其它技术手段改进模型效果,例如引入注意力机制、预训练、图神经网络、胶囊网络等。所以在介绍经典文本分类模型时,更多的是介绍为了解决文本分类中的哪一类具体问题,针对性地引入了哪些专门的技术 trick,以及这些引入的 trick 是如何与原有的经典架构融合的。
此外,NLP 领域中大量工作都聚焦于前端的词、语句、文本的处理或语义理解,目的是为下游的各类任务服务,当然也包括文本分类任务。为了更聚焦于文本分类模型,我们在这篇文章中只介绍专门的文本分类模型,其它 NLP 模型会放在后续的专题报告中介绍。最后,文本分类模型以 BERT 的出现明显呈现出两个不同的发展阶段,BERT 提出后(2019 年之后),单纯基于 RNN、CNN 改进的且效果比较突出的方法就比较少了。
一、CNN
卷积神经网络(CNN)最初用于图像分类,其卷积滤波器可以提取图片的特征。与RNN不同的是,CNN可以同时将不同内核定义的卷积应用于一个序列的多个块中。对于文本分类,文本需要被表示为一个类似于图像表示的向量,并且文本特征可以从多个角度进行过滤,如图1所示。首先,输入文本的词向量被拼接成一个矩阵。然后,该矩阵被送入卷积层,该层包含不同维度的多个过滤器。最后,卷积层的结果通过集合层,并将集合结果连接起来,得到文本的最终向量表示。类别由最终的向量来预测。
图1 CNN架构
1.1 TextCNN
TextCNN是最经典的应用于NLP的CNN,论文发表在EMNLP 2014中。它可以通过一层卷积更好地确定最大集合层中的判别性短语,并通过保持词向量的静态来学习除词向量以外的超参数。
TextCNN就是简单CNN的应用,因此结构简单,效果还很好。输入数据首先通过一个嵌入层,得到输入语句的嵌入表示,然后通过一个卷积层提取语句的特征,最后通过一个全连接层得到最终的输出。模型架构如图2。
1)嵌入层。主要作用是将输入的自然语言编码成分布式表征,方法类似于word2vec。可以使用预训练好的词向量,也可以直接在训练TextCNN的过程中训练出一套词向量。如果使用预训练好的词向量,又分为static方法和no-static方法,前者是指在训练TextCNN过程中不再调节词向量的参数,后者在训练过程中调节词向量的参数。
2)卷积层。主要是通过卷积,提取不同的n-gram特征。输入的语句或者文本,通过嵌入层后转变成一个二维矩阵。假设文本的长度为|T|,词向量的大小为|d|,则该二维矩阵的大小为|T|X|d|。卷积工作就是对这一个|T|X|d|的二维矩阵进行的。
3)最大池化层。对卷积后得到的若干一维向量取最大值,然后拼接起来作为本层的输出值。如果卷积核的size=2,3,4,5,每个size有128个kernel,则经过卷积层后会得到4X128个一维的向量,再经过最大池化之后,会得到4X128个scalar值,拼接在一块,得到最终的结构512X1的向量。最大池化层的意义在于对卷积提取的n-gram特征,提取激活程度最大的特征。
4)全连接层。在最大池化层后再拼接一层,作为输出结果。实际中为了提高网络的学习能力,可以拼接多个全连接层。
当前 SOTA!平台收录 TextCNN 共 2 个模型实现资源。
模型 | SOTA!平台模型详情页 |
TextCNN | 前往 SOTA!模型平台获取实现资源:https://sota.jiqizhixin.com/models/models/5d977df9-be84-4956-b672-7d4aff0b6bda |
1.2 DCNN
DCNN(Dynamic Convolutional Neural Network)是在ACL 2014中提出的,主要用于对句子进行语义建模,以为后续的分类或生成任务奠定基础。模型采用动态的K—max pooling(取出得分top k的特征值)处理不同长度的句子,不依赖于解析树并且适用于任何语言,利用宽卷积和k-max pooling采样,构造了一种类似parse tree的结构,能够提取长距离的信息。DCNN的架构如下图。
图3 包含七个词的输入句子的DCNN。词嵌入的大小为d=4。该网络有两个卷积层,每个层有两个特征图。这两个层的过滤器的宽度分别为3和2,k-max集合层的k值为5和3
1)嵌入。这一步骤和一般的网络没有区别,将输入句子s中的每个词w映射为d维向量,同时在训练的过程中对初始化的向量进行修改。
2)宽卷积。卷积部分用的是one-dim卷积,也就是filter的height固定为1。此外,宽卷积指的是在卷积操作时对输入矩阵的边缘进行padding补零,这样的好处是不会丢失边缘信息,其输出使feature map 的宽度更宽。
3)动态 k-Max Pooling。k-max pooling是max-pooling更一般的形式,相比后者,k-max在序列p中,p>=k,提取出序列中前k个最大的值,同时保留它们的相对顺序。k-max pooling的好处在于提取了句子中不止一个的重要信息,保留了它们的相对位置。并且由于最后的卷积层只需提取K个值,所以允许不同长度的输入,只要大于K。动态k-max pooling的意义在于,从不同长度的句子中提取出相应数量的语义特征信息,以保证后续的卷积层的统一性。比如,在情感预测中,首要特征所对应的单词提取出K1个,次要特征提取出k2个单词。
4)非线性特征函数。在k-max pooling之后,与传统的CNN一样,对于pooling后的结果加上一个偏置b进行非线性激活。
5)多个feature map。与传统CNN一样,会提取出多个featured map以保证提取特征的多样性。
6)折叠操作。之前的宽卷积是在输入矩阵d×s中的每一行内进行计算操作,其中d是word vector的维数,s是输入句子的词语数量。而折叠操作则是考虑相邻的两行之间的某种联系,将两行的vector相加;该操作没有增加参数数量,但是提前(在最后的全连接层之前)考虑了特征矩阵中行与行之间的某种关联,从而在没有增加任何参数的情况下,能够在全连接层之前提前考虑到词向量维度上的某些关联。
当前 SOTA!平台收录 DCNN 共 1 个模型实现资源。
模型 | SOTA!平台模型详情页 |
DCNN | 前往 SOTA!模型平台获取实现资源:https://sota.jiqizhixin.com/models/models/e84e2b4a-058c-485b-a011-3707d6e43161 |
1.3 XML-CNN
XML-CNN发表在SIGIR 2017。这篇论文主要解决的是extreme multi-label(XML)问题,即,标签种类特别多,达到成百、上千的级别。在这种extreme multi-label情况下,容易出现数据稀疏问题,即某个label可能只有一条数据。此外,由于标签量级高,往往导致训练和预测计算量大。为了解决上述问题,作者提出利用CNN来解决XML问题。XML-CNN的架构如下图所示,从现在的角度来看,这一架构是比较简单的。
图4 XML-CNN与样本例句。XML-CNN整体包括:嵌入层(Embedding Layer)、卷积层(Convolutional Layer)、池化层(Pooling Layer)、全连接层(FC)、分类层(sigmoid output)
1)嵌入层。嵌入层的输入为一个文本,文本由m个word组成,词向量维度为k,可以通过word2vec、fasttext等工具预训练得到词向量,也可以随机初始化生成。嵌入层的输出为文本向量。
2)卷积层。应用窗口大小为h(h-gram)进行卷积操作,主要目的是提取label对应的词特征。
3)池化层。池化层是应用NLP的必选步骤。一般主要应用Max-pooling以保留最显著的特征,过滤掉其它不重要的特征,同时降低模型复杂度。XML-CNN使用的是Dynamic K-Max-Pooling,与DCNN相同。
4)全连接层。XML-CNN在池化和输出层之间增加了一个全连接层,在论文中称为hidden bottleneck layer,即全连接层的隐藏单元数量远小于前后两个层的隐藏单元数量。XML-CNN中引入全连接层的原因一是池化层的单元太多,导致计算量太大;二是隐藏单元太多,不利于后面的表达和预测。
5)输出层。最终的输出层即为分类层。XML-CNN采用的是sigmoid函数,损失函数为binary entropy loss。
当前 SOTA!平台收录 XML-CNN 共 1 个模型实现资源。
模型 | SOTA!平台模型详情页 |
XML-CNN | 前往 SOTA!模型平台获取实现资源:https://sota.jiqizhixin.com/models/models/06a8ba14-a96e-404b-b47a-549b606c9b3d |
1.4 TextCapsule
TextCapsule发表在EMNLP 2018,探索将动态路由的胶囊网络与CNN相结合(区别于RNN-Capsule)。TextCapsule的架构如下图所示,主要包括四层:n-gram的卷积层、初始胶囊层、卷积胶囊层和全连接的胶囊层。另外,提出两个胶囊网络连接这4部分。
图5 TextCapsule架构图
1)N-gram卷积层。该层是标准的卷积层,它通过各种卷积过滤器提取句子不同位置的n-gram特征。输入x为句子的表示,其中,x_i为对应于句子中第i个单词的V维单词向量。输出为B个特征图,B为过滤器数量。
2)初始胶囊层。这是第一层胶囊层,其中,胶囊用矢量输出胶囊替换CNN的标量输出特征检测器,以保留实例化的参数,例如单词的局部顺序和单词的语义表示。
3)动态路由。动态路由的基本思想是以迭代方式构造一个非线性映射,以确保每个胶囊的输出被发送到后续层中的适当父级。对于每个潜在的父对象,胶囊网络都可以通过动态路由来增加或降低各个神经元的连接强度,这比DNN中原始路由策略(Max-pooling)更为有效,该策略基本上可以检测文本的任何位置是否存在特征, 但会丢失有关要素的空间信息。作者探索了三种策略,可通过减轻某些噪声胶囊的干扰来提高路由过程的准确性:(i)孤立类别:向网络中添加了一个额外的“孤立”类别,目的是捕获文本的“背景”信息,例如停用词和与特定类别无关的词,从而帮助胶囊网络更有效率地为孩子父母关系建模。(ii)Leaky-Softmax。引入Leaky-Softmax以取代标准softmax,同时更新子胶囊与其父母之间的连接强度。尽管在最后一个胶囊层中引入了孤立类别,我们还需要在两个连续的层之间使用轻量级方法来将噪声子胶囊路由到额外的维度,而无需任何其他参数和计算量。(iii)系数修正。使用下层子胶囊中实体存在的概率来迭代地修改连接强度。
4)卷积胶囊层。在这一层中,每个胶囊仅连接到下层空间上的局部区域K_2 × C 。该区域中的胶囊会乘以转换矩阵以学习父子之间的关系,然后通过协议路由以在上一层中生成父胶囊。
5)全连接胶囊层。将下层中的胶囊平铺为一个胶囊列表,并带入到全连接胶囊层中,将胶囊乘以变换矩阵后进行协议路由,从而为每个类别生成最终胶囊和概率。
图6 两种胶囊网络架构
与RNN-Capsule类似,TextCapsule也提出了两种胶囊网络架构,如图6所示。Capsule-A从嵌入层开始,将语料库中的每个词转化为300维(V = 300)的词向量,然后是一个具有32个滤波器(B = 32)、步长为1的ReLU非线性的3-gram(K1 = 3)卷积层。所有其他层都是胶囊层,从具有32个滤波器(C=32)的B×d初级胶囊层开始,然后是具有16个滤波器(D=16)的3×C×d×d(K2=3)卷积胶囊层和一个全连接的胶囊层,依次进行。每个胶囊都有16维(d=16)的实例化参数,其长度(规范)可以描述胶囊存在的概率。胶囊层由转换矩阵连接,每个连接也要乘以路由系数,该系数由路由协议机制动态计算得出。
Capsule-B的基本结构与Capsule-A相似,只是在N-gram卷积层中采用了三个平行网络,过滤窗口(N)为3、4、5。全连接的胶囊层的最终输出被送入平均池以产生最终结果。通过这种方式,Capsule-B可以学习到更有意义和全面的文本表示。
当前 SOTA!平台收录 TextCapsule 共 1 个模型实现资源。
模型 | SOTA!平台模型详情页 |
TextCapsule | 前往 SOTA!模型平台获取实现资源:https://sota.jiqizhixin.com/models/models/3a9c6a86-16be-4d75-9a65-353bdcdffc18 |
4.5 Bao et al.
该模型发表在ICLR 2020,是将元学习的方法与CNN结合应用于NLP中。目标是通过从输入的分布签名中学习高质量的注意力来提高少许的分类性能。给定一个特定的场景,从source pool和support set中提取相关的统计数据。
图7 对N=3、K=1、L=2的场景的模型说明。attention generator将来自source pool和support set的分布签名转化为每个输入例子x的注意力α(5a)。ridge regressor利用生成的注意力对词汇表征进行加权(5b)。然后,从support set中学习(5c)并对查询集进行预测(5d)
该模型由两部分组成,如图7所示。第一个是 attention generator,它将分布签名转化为注意力分数,以反映单词对分类的重要性。根据注意力生成器的输出,该模型的第二个部分即 ridge regressor,在只看到几个训练例子后就能迅速学会做出预测。attention generator在所有的场景中都是共享的,而 ridge regressor则是为每个单独的场景从头开始训练。后者的预测损失为attention generator提供监督。
注意力生成器(attention generator)。这个模块通过结合source pool和support set的分布统计生成特定类别的注意力(图7a)。生成的注意力为 ridge regressor提供了一个关于单词重要性的归纳偏见,根据 ridge regressor的反馈来训练这个模块。注意生成器的目标是从每个输入的分布签名中评估单词的重要性。分布式签名有很多选择,具体本文的模型使用的是 unigram 统计的函数,这些函数被证明对单词替换扰动具有鲁棒性。模型利用大型source pool来告知模型一般单词的重要性,并利用小型的support set来估计特定类别的单词重要性。生成的注意力稍后将用于构建下游分类的输入表示。
ridge regressor。对于每个场景,该模块使用从分布特征中得到的注意力构建词汇表征(图7b)。这个模块的目标是在向support set学习后,对查询集进行预测(图7c和7d)。它的预测损失相对于注意力生成器来说是端到端的可分的,从而实现有效的训练。首先,对于给定场景/任务中的每个示例,构建一个专注于重要单词的词汇表示,如注意力分数。接下来,给定这些词汇表示,从头开始在support set上训练ridge regressor。最后,对query set进行预测,并使用损失来教注意力生成器产生更好的注意力。
当前 SOTA!平台收录 Bao et al. 共 1 个模型实现资源。
模型 | SOTA!平台模型详情页 |
Bao et al. | 前往 SOTA!模型平台获取实现资源:https://sota.jiqizhixin.com/models/models/d7a53e59-7faa-4258-904c-d1fd8a716b88 |