文本分类大纲
文本分类这个系列将会有十篇左右,包括基于word2vec预训练的文本分类,与及基于最新的预训练模型(ELMo,BERT等)的文本分类。总共有以下系列:
- word2vec预训练词向量
- textCNN 模型
- charCNN 模型
- Bi-LSTM 模型
- Bi-LSTM + Attention 模型
- RCNN 模型
- Adversarial LSTM 模型
- Transformer 模型
Word2Vec预训练词向量
一般模型结构是Word2vec+分词器.这个应该是最简单的,因为Word2vec本质上是由CNN网络生成词向量的一种深度学习模型.
TextCNN模型
将Text的词向量拼接在一起,就好比一张图,只不过这个图只是一个channel的.这里使用的就是Conv1d.
模型的结构是:
- Embedding layer
- Convolutional layer:可以用不同尺度的filter产生多个feature map
- MaxPooling Layer
- Feedfoward layer
- Softmax Layer
CharCNN模型
在此之前很多基于深度学习的模型都是使用更高层面的单元对文本或者语言进行建模,比如单词(统计信息或者 n-grams、word2vec 等),短语(phrases),句子(sentence)层面,或者对语义和语法结构进行分析,但是CharCNN则提出了从字符层面进行文本分类,提取出高层抽象概念。
字符编码层 为了实现 CharCNN,首先要做的就是构建字母表,本文中使用的字母标如下,共有 69 个字符,对其使用 one-hot 编码,外加一个全零向量(用于处理不在该字符表中的字符),所以共 70 个,所以每个字符转化为一个 70 维的向量。文中还提到要反向处理字符编码,即反向读取文本,这样做的好处是最新读入的字符总是在输出开始的地方。:
结构
模型卷积 - 池化层 文中提出了两种规模的神经网络–large 和 small。(kernel——size的不同)都由 6 个卷积层和 3 个全连接层共 9 层神经网络组成。这里使用的是 1-D 卷积神经网络。除此之外,在三个全连接层之间加入两个 dropout 层以实现模型正则化。
BiLSTM模型
Bi-LSTM即双向LSTM,较单向的LSTM,Bi-LSTM能更好地捕获句子中上下文的信息。
双向循环神经网络(BRNN)的基本思想是提出每一个训练序列向前和向后分别是两个循环神经网络(RNN),而且这两个都连接着一个输出层。这个结构提供给输出层输入序列中每一个点的完整的过去和未来的上下文信息。下图展示的是一个沿着时间展开的双向循环神经网络。六个独特的权值在每一个时步被重复的利用,六个权值分别对应:输入到向前和向后隐含层(w1, w3),隐含层到隐含层自己(w2, w5),向前和向后隐含层到输出层(w4, w6)。值得注意的是:向前和向后隐含层之间没有信息流,这保证了展开图是非循环的。
Recurrent CNN模型
在文本表示方面,会有超过filter_size的上下文的语义缺失,因此本篇文章利用RNN来进行文本表示,中心词左侧和右侧的词设为trainable,然后将中心词左侧和右侧的词concat作为中心词的表示。 当前step的中心词不输入lstm,仅仅与左侧词和右侧词在lstm的输出concat。
先经过1层双向LSTM,该词的左侧的词正向输入进去得到一个hidden state(从上往下),该词的右侧反向输入进去得到一个hidden state(从下往上)。再结合该词的词向量,生成一个 1 * 3k 的向量。
再经过全连接层,tanh为非线性函数,得到y2。
再经过最大池化层,得出最大化向量y3.
再经过全连接层,sigmod为非线性函数,得到最终的多分类。
1、结合了中心词窗口的输入,其输出的representation能很好的保留上下文语义信息
2、全连接层+pooling进行特征选择,获取全局最重要的特征
RCNN 整体的模型构建流程如下:
1)利用Bi-LSTM获得上下文的信息,类似于语言模型。
2)将Bi-LSTM获得的隐层输出和词向量拼接[fwOutput,wordEmbedding, bwOutput]。
3)将拼接后的向量非线性映射到低维。
4)向量中的每一个位置的值都取所有时序上的最大值,得到最终的特征向量,该过程类似于max-pool。
5)softmax分类。
Transformer模型
创新之处在于使用了scaled Dot-Product Attention和Multi-Head Attention
Encoder部分
上面的Q,K和V,被作为一种抽象的向量,主要目的是用来做计算和辅助attention。根据文章我们知道Attention的计算公式如下:
接着是Multi-head Attention:
这里的positional encoding需要说明一下:
公式中pos就代表了位置index,然后i就是index所对应的向量值,是一个标量,然后dmodel就是512了。之所以选择这个函数是因为作者假设它能够让模型通过相关的位置学习Attend。
(引入这个的原因就是因为模型里没有用到RNN和CNN,不能编码序列顺序,因此需要显示的输入位置信息.之前用到的由position embedding,作者发现上述方法与这个方法差不多.位置特征在这里是一种重要特征。)
Decoder部分
对比单个encoder和decoder,可以看出,decoder多出了一个encoder-decoder Attention layer,接收encoder部分输出的向量和decoder自身的self attention出来的向量,然后再进入到全连接的前馈网络中去,最后向量输出到下一个的decoder
最后一个decoder输出的向量会经过Linear层和softmax层。Linear层的作用就是对decoder部分出来的向量做映射成一个logits向量,然后softmax层根据这个logits向量,将其转换为了概率值,最后找到概率最大值的位置。这样就完成了解码的输出了。