文本分类:2、经典Deep Learning方法
使用Deep Learning 自动从文本中提取特征,实现端到端的训练,效果也较好。常用的模型有 Fasttext、TextCNN、DPCNN、TextRNN、TextRCNN 、HAN、Transformer 等。
腾讯 Pytorch汇总版代码 NeuralNLP-NeuralClassifier、TF版代码
1、Fasttext : 词向量计算 & 文本分类 fasttext
核心思想:将整篇文档的词及n-gram向量叠加平均得到文档向量,然后使用文档向量做softmax多分类。
技巧:字符级n-gram特征、分层softmax分类 ----> 速度很快
与word2vec的区别:
word2vec (CBOW) 把语料库中的每个单词当成原子的,为每个单词生成一个向量----忽略了单词内部的形态。(输入是目标单词的上下文并进行one-hot编码)
fasttext使用字符级别n-grams表示一个单词----低频词的词向量更好(共享n-gram特征),OOV词仍可构建词向量(叠加字符级n-gram向量)
输入层:CBOW的输入是目标单词的上下文并进行one-hot编码,fastText的输入是多个单词embedding向量,并将单词的字符级别的n-gram向量作为额外的特征;
从输入层到隐藏层,CBOW会将上下文单词向量叠加起来并经过一次矩阵乘法(线性变化)并应用**函数,而fastText省略了这一过程,直接将embedding过的向量特征求和取平均;
输出层,一般的CBOW模型会采用Softmax作为输出,而fastText则采用了Hierarchical Softmax,大大降低了模型训练时间。CBOW的输出是目标词汇,fastText的输出是文档对应的类标。
2、TextCNN:和fasttext比较、示例代码、gitHub代码
输入每个词的词向量,CNN & maxpooling 提取与类别相关的“关键词”,但是忽略了句子结构信息。
下图中第一层输入为7*5的词向量矩阵,其中词向量维度为5,句子长度为7,然后第二层使用了3组宽度分别为2、3、4的卷积核(长度为词向量维度5),图中每种宽度的卷积核使用了2个。
其中每个卷积核在整个句子长度上滑动(每次滑1步),得到n个**值,图中卷积核滑动的过程中没有使用padding,因此宽度为4的卷积核在长度为7的句子上滑动得到4个特征值(卷积:按位相乘再求和)。然后出场的就是卷积的好基友全局池化了,每一个卷积核输出的特征值列向量通过在整个句子长度上取最大值,得到了6个特征值组成的feature map来供后级分类器作为分类的依据。
TextCNN在做什么:卷积过后直接就是全局max pooling,那么它只能是在卷积的过程中计算与某些关键词的相似度,然后通过max pooling层来得出模型关注那些关键词是否在整个输入文本中出现,以及最相似的关键词与卷积核的相似度最大有多大。
TextCNN的问题:全局的max pooling丢失了结构信息,因此很难去发现文本中的转折关系等复杂模式。可以尝试k-max pooling做一些优化,k-max pooling针对每个卷积核保留前k个最大值,并且保留按照文本中的位置顺序来排列这k个最大值。
3、DPCNN : 腾讯发表DPCNN、加强版 VDCNN
类似于TextCNN,网络加深----提取更高层次的特征、相邻位置maxpooling----每次丢失的结构信息更少。 TextCNN 不能通过卷积获得文本的长距离依赖关系,而DPCNN通过不断加深网络,可以抽取长距离的文本依赖关系。
4、TextRNN :汇总文章、TRNN分类示例
CNN最大的问题是固定filter_size视野(特征表达),无法建模更长的序列信息(LSTM更适合)。 LSTM的输出直接接 全连接FC + softmax层输出。但是,一个时间步的输出依赖前一个输出,无法并行、速度慢。
5、TextRNN + Attention:
RNN无法记住太长久的东西,越靠后的字词对最终输出的影响越大。但是这和人类阅读文本的习惯是不一样的,一句话中对文本意义影响最大一必定是句子中间的某几个重点词汇。
假设RNN每个时刻的输出为 ,在TextRNN中最后时刻的输出会用作softmax的输入,既。Attention层其实就是普通的一层,它接收 ,执行得到一个相应score,并经过归一化代表当前词的重要性。Attention向量是每个时刻输出的加权平均,既。最终输出为。
5、TextRCNN :
RNN使得后面的词比前面的重要,CNN的滑动窗口大小不容易确定。二者结合,前者获取上下文信息、保留语序,后者pooling提取重要部分。
利用LSTM得到每个词的前、后向上下文表示,将词表示变为—[词向量,前向上下文表示,后向上下文表示],然后再用TextCNN的卷积层&pooling层。唯一不同的是卷积层 filter_size = 1就可以了,不再需要更大 filter_size 获得更大视野,这里词的表示也可以只用双向RNN输出。
6、HAN : Hierarchy Attention Network
相较于TextCNN,HAN最大的进步在于完全保留了文章的结构信息,并且特别难能可贵的是,基于attention结构有很强的解释性。
输入词向量序列,通过词级别的Bi-GRU后,每个词输出隐向量h,再通过向量与每个时间步的h向量点积得到分数、归一得权重,然后把h序列做一个加权和,得到句子summary向量。每个句子再通过同样的Bi-GRU结构再加attention得到最终输出的文档特征向量v向量,然后v向量通过后级dense层再加分类器得到最终的文本分类结果。模型结构非常符合人的从词->句子->篇章的理解过程。
最重要的是该模型在提供了更好的分类精度的情况下,可视化效果非常好。同时在调参过程中,发现attention部分对于模型的表达能力影响非常大,整个模型在所有位置调整L2-Loss对模型表达能力带来的影响远不如在两处attention的地方大,这同时也能解释为什么可视化效果比较好,因为attention对于模型的输出贡献很大,而attention又恰恰是可以可视化的。
7、Transformer : 使用示例
多头attention抽取任意位置的关键词、并行效率高。