前言
本文收集近年来深度学习中文本分类问题的主要模型并对相关模型架构进行大致的解读。目的是对有一定基础的学者能快速回忆起或者了解相关模型的大致结构,能对当前的研究或工作提供一个抛砖引玉的作用,同时可以让刚进入该领域的学者能对历年来的工作有个大概的了解,对深入学习提供一盏指路灯。也非常欢迎对相关论文非常熟悉的学者提出宝贵的意见。当前模型包括:
- fasttext
- TextCNN
- TextRNN
- TextRCNN
- TextHAN
Fasttext
Paper: Bag of Tricks for Efficient Text Classification
模型架构解析:该模型架构和word2vec中的cbow非常相似,只不过输出得是文档的类别标签。在输入方面fasttext使用N-gram作为附加特征来留存一些相近词序的部分信息。比如使用字符级别的bigram,“今天天气很好”,输入的是“今天”,“天天”,“天气”,“气很”,“很好”,上图中表示第个文本所有N-gram features的归一化特征袋(即所有特征词袋表示的平均值,N表示有共有N个文档)。
fasttext使用 softmax 函数 f 来计算已知分类的概率分布。对于 N 个文档而言,这就会导致在分类上负对数似然的最小化,这也是模型在整个数据上的loss,公式如下图:
第一个权重矩阵 是基于词的查找表,这样可以把词转换到向量形式,可以当做是该篇文档的向量形式,然后再输入线性分类器,是softmax层的权重矩阵。
PS: fasttext模型另一个重要的作用是可以学习词向量,其效果可能不亚于word2vec和glove。
TextCNN
Paper: Convolutional Neural Networks for Sentence Classification
模型架构解析:TextCNN用卷积来提取文本特征。由于CNN的输入维度大小是固定的,故首先需要将输入的句子填充或裁减为一个长度。每个词有其对于的词向量,这个可以使用预训练的词向量,也可以随机初始化交给神经网络训练。以下说明维度时不计batch的维度,输入的数据就是一个二维张量(如果考虑batch_size就是三维),每一行代表该行对应词的词向量,行数等于填充或裁减句子后的长度。输入层之后使用的是一维卷积,一维卷积可以把词向量的维度当做图像中的channel。卷积层可以采取不同尺寸的卷积核,从而可以获得不同的视野。由于是使用一维卷积相当于这是在做N-gram,只是在用卷积来提取特征,一维卷积层之后得到的也是二维张量,其中第二个维度等于该层使用卷积核的个数。上图中卷积之后的列向量表示的是每个卷积核作用的结果。然后再是经过一个池化层。该池化层取得是通过每个卷积核后得到的结果中所有元素的最大值,即max-pool,之后再把所有这样的最大值拼接起来得到一维张量(不计batch的size),维度就等于之前做cnn时使用卷积核的个数。这个操作相当于是把全局的序列信息保存下来,比如情感分析时:“我觉得这个地方景色还不错,但是人也实在太多了”,虽然前半句情感是积极的,但整个句子表达的是偏负面的情感。最后经过一个全连接层得到分类结果。
PS:文本本来是一维数据,虽然文本经过词向量表达后是二维数据,但是在embedding-level上的二维卷积没有意义,因此textcnn使用的是一维卷积。一维卷积也可以看成二维卷积的特殊情形。在使用tensorflow实现时可以用tf.nn.conv1d,同时也能用tf.nn.conv2d即二维卷积也能得到一样的结果,此时的二维卷积可以看做是输入通道为1,卷积层卷积核宽度为词向量的维度,池化层卷积核的宽度为序列长度减去池化层卷积核长度加上1,详见下面推荐的代码1(这里说的长度指行数,宽度指列数)。
实现textcnn的代码有很多,下面是亲测的两个能运行且star人数较多的github地址:
TextRNN
代表论文: Recurrent Neural Network for Text Classification with Multi-Task Learning
模型架构解析: TextRNN模型架构上有很多变种,比如循环体单元可以用基本RNN单元、LSTM、GRU等,可以使用双向,也可以使用单向。在模型输出层,可以取循环网络最后一个时刻的输出结果做分类(如上图),也可以每个时刻的输出结果取平均值做分类,此时一般会把句子输入时padding的部分构造一个mask向量乘以每个时刻的输出结果把padding的部分不计入分类。这两种不同的输出形式可以分别见如下1,2:
PS: 上述第二个代码的作者由于是公司的数据不便公布,笔者阅读了他的模型部分,代码是否能正确运行未实验。
TextRCNN
Paper: Recurrent Convolutional Neural Networks for Text Classification
模型解析:通俗来说,模型的大概过程就是将每一时刻的词以及它的上下文向量(left和right两个向量)拼接起来,再在向量的每一个位置的值都取所有时序上的最大值,得到最终的特征向量用于分类,如上图所示。下面主要详细解释一下怎么得到一个词的left context和right context两个向量,word embedding就是当前位置的词向量。如上图和下图公式所示,第时刻left context向量由第时刻left context向量和第时刻词向量得到(下图公式(1)),第时刻right context向量由第时刻right context向量和第时刻词向量得到(下图公式(2))。当计算第一个词的left context时,是需要学习的张量,为0,类似可计算最后一个词的right context。
TextHAN
Paper: Multilingual Hierarchical Attention Networks for Document Classification
模型架构解析:
参考链接:https://blog.csdn.net/liuchonge/article/details/73610734
TextHAN是分层构建了词和句子两个注意力层,所用的基础架构还是RNN或其拓展(LSTM,GRU等),这里只详细解读一下HAN的注意力层具体是怎么计算的,整个模型架构可参考上述论文或参考链接或提供的源码。如图所示,word attention和sentence attention基本类似,这里已word attention为例,公式如下图:
表示第个句子第时刻的状态输出,这里的attention先将经过一个激活函数为的全连接层得到。然后再将与作内积,其中也是需要学习的张量,将每个时刻得到的结果做softmax得到注意力权重 ,再加权求和(上图第三个公式)得到sentence encoder部分第时刻的输入。sentence attention也是一样的计算过程,只是将最后得到的结果用于分类。
PS:TextRCNN和TextHAN的实现可参考下面这个地址:
https://github.com/zhengwsh/text-classification
待续...
第一时刻查看更新可关注github地址:
https://github.com/1234560o/Text-classification-in-deep-learning