干货 | 深度学习在文本分类中的应用

做者:llhthinker 我的博客:http://www.cnblogs.com/llhthinker/git

1 文本分类任务介绍

文本分类是天然语言处理的一个基本任务,试图推断出给定的文本(句子、文档等)的标签或标签集合。github

文本分类的应用很是普遍。如:网络

垃圾邮件分类:二分类问题,判断邮件是否为垃圾邮件架构

情感分析机器学习

二分类问题,判断文本情感是积极(positive)仍是消极(negative)ide

多分类问题,判断文本情感属于{很是消极,消极,中立,积极,很是积极}中的哪一类函数

新闻主题分类:判断新闻属于哪一个类别,如财经、体育、娱乐等性能

自动问答系统中的问句分类学习

社区问答系统中的问题分类:多标签分类,如知乎看山杯优化

更多应用:

让AI当法官: 基于案件事实描述文本的罚金等级分类(多分类)和法条分类(多标签分类)。

判断新闻是否为机器人所写: 二分类

......

不一样类型的文本分类每每有不一样的评价指标,具体以下:

二分类:accuracy,precision,recall,f1-score,...

多分类: Micro-Averaged-F1, Macro-Averaged-F1, ...

多标签分类:Jaccard类似系数, ...

2 传统机器学习方法

传统的机器学习方法主要利用天然语言处理中的n-gram概念对文本进行特征提取,而且使用TFIDF对n-gram特征权重进行调整,而后将提取到的文本特征输入到Logistics回归、SVM等分类器中进行训练。可是,上述的特征提取方法存在数据稀疏和维度爆炸等问题,这对分类器来讲是灾难性的,而且使得训练的模型泛化能力有限。所以,每每须要采起一些策略进行降维:

人工降维:停用词过滤,低频n-gram过滤等

自动降维:LDA等

值得指出的是,将深度学习中的word2vec,doc2vec做为文本特征与上文提取的特征进行融合,经常能够提升模型精度。

3 CNN用于文本分类

论文Convolutional Neural Networks for Sentence Classification提出了使用CNN进行句子分类的方法。

3.1 CNN模型推导

一个句子是由多个词拼接而成的,若是一个句子有n个词,且第i个词表示为xi,词xi经过embedding后表示为k维的向量,即xi∈ℜk,则一个句子x1:n为n∗k的矩阵,能够形式化以下:

3.2 优化CNN模型

  • 随机初始化 (CNN-rand)
  • 预训练词向量进行初始化,在训练过程当中固定 (CNN-static)
  • 预训练词向量进行初始化,在训练过程当中进行微调 (CNN-non-static)
  • 多通道(CNN-multichannel):将固定的预训练词向量和微调的词向量分别看成一个通道(channel),卷积操做同时在这两个通道上进行,能够类比于图像RGB三通道。

上图为模型架构示例,在示例中,句长n=9,词向量维度k=6,filter有两种窗口大小(或者说kernel size),每种有2个,所以filter总个数m=4,其中:

一种的窗口大小h=2(红色框),卷积后的向量维度为n−h+1=8

另外一种窗口大小h=3(黄色框),卷积后的向量维度为n−h+1=7

Dropout: 对全链接层的输入z向量进行dropout

y=W⋅(z∘r)+b

其中r∈ℜm为masking向量(每一个维度值非0即1,能够经过伯努利分布随机生成),和向量z进行元素与元素对应相乘,让r向量值为0的位置对应的z向量中的元素值失效(梯度没法更新)。

L2-norms: 对L2正则化项增长限制:当正则项‖W‖2>s时, 令‖W‖2=s,其中s为超参数。

3.3 一些结论

Multichannel vs. Single Channel Models: 虽然做者一开始认为多通道能够预防过拟合,从而应该表现更高,尤为是在小规模数据集上。但事实是,单通道在一些语料上比多通道更好;

Static vs. Non-static Representations: 在大部分的语料上,CNN-non-static都优于CNN-static,一个解释:预训练词向量可能认为‘good’和‘bad’相似(可能它们有许多相似的上下文),可是对于情感分析任务,good和bad应该要有明显的区分,若是使用CNN-static就没法作调整了;

Dropout能够提升2%–4%性能(performance);

对于不在预训练的word2vec中的词,使用均匀分布U[−a,a]随机初始化,而且调整a使得随机初始化的词向量和预训练的词向量保持相近的方差,能够有微弱提高;

能够尝试其余的词向量预训练语料,如Wikipedia[Collobert et al. (2011)]

Adadelta(Zeiler, 2012)和Adagrad(Duchi et al., 2011)能够获得相近的结果,可是所需epoch更少。

3.4 进一步思考CNN

3.4.1 为何CNN可以用于文本分类(NLP)?

为何CNN可以用于文本分类(NLP)?

RNN能够提取全局特征

RCNN(下文说明): RNN和CNN的结合

filter至关于N-gram ?

filter只提取局部特征?全局特征怎么办?能够融合吗?

3.4.2 超参数怎么调?

论文A Sensitivity Analysis of (and Practitioners' Guide to) Convolutional Neural Networks for Sentence Classification提供了一些策略。

用什么样的词向量

使用预训练词向量比随机初始化的效果要好

采起微调策略(non-static)的效果比固定词向量(static)的效果要好

没法肯定用哪一种预训练词向量(Google word2vec / GloVe representations)更好,不一样的任务结果不一样,应该对于你当前的任务进行实验;

filter窗口大小、数量

在实践中,100到600是一个比较合理的搜索空间。

每次使用一种类型的filter进行实验,代表filter的窗口大小设置在1到10之间是一个比较合理的选择。

首先在一种类型的filter大小上执行搜索,以找到当前数据集的“最佳”大小,而后探索这个最佳大小附近的多种filter大小的组合。

每种窗口类型的filter对应的“最好”的filter个数(feature map数量)取决于具体数据集;

可是,能够看出,当feature map数量超过600时,performance提升有限,甚至会损害performance,这多是过多的feature map数量致使过拟合了;

激活函数 (tanh, relu, ...)

Sigmoid, Cube, and tanh cube相较于Relu和Tanh的激活函数,表现很糟糕;

tanh比sigmoid好,这多是因为tanh具备zero centering property(过原点);

与Sigmoid相比,ReLU具备非饱和形式(a non-saturating form)的优势,并可以加速SGD的收敛。

对于某些数据集,线性变换(Iden,即不使用非线性激活函数)足够捕获词嵌入与输出标签之间的相关性。(可是若是有多个隐藏层,相较于非线性激活函数,Iden就不太适合了,由于彻底用线性激活函数,即便有多个隐藏层,组合后整个模型仍是线性的,表达能力可能不足,没法捕获足够信息);

所以,建议首先考虑ReLU和tanh,也能够尝试Iden

池化策略:最大池化就是最好的吗

对于句子分类任务,1-max pooling每每比其余池化策略要好;

这多是由于上下文的具体位置对于预测Label可能并非很重要,而句子某个具体的n-gram(1-max pooling后filter提取出来的的特征)可能更能够刻画整个句子的某些含义,对于预测label更有意义;

(可是在其余任务如释义识别,k-max pooling可能更好。)

正则化

0.1到0.5之间的非零dropout rates可以提升一些performance(尽管提高幅度很小),具体的最佳设置取决于具体数据集;

对l2 norm加上一个约束每每不会提升performance(除了Opi数据集);

当feature map的数量大于100时,可能致使过拟合,影响performance,而dropout将减轻这种影响;

在卷积层上进行dropout帮助很小,并且较大的dropout rate对performance有坏的影响。

3.5 字符级别的CNN用于文本分类

论文Character-level convolutional networks for text classification将文本当作字符级别的序列,使用字符级别(Character-level)的CNN进行文本分类。

3.5.1 字符级CNN的模型设计

首先须要对字符进行数字化(quantization)。具体以下:

定义字母表(Alphabet):大小为m (对于英文m=70,以下图,以后会考虑将大小写字母都包含在内做为对比)

字符数字化(编码): "one-hot"编码

序列(文本)长度:l0 (定值)

而后论文设计了两种类型的卷积网络:Large和Small(做为对照实验)

它们都有9层,其中6层为卷积层(convolutional layer);3层为全链接层(fully-connected layer):

Dropout的几率都为0.5

使用高斯分布(Gaussian distribution)对权重进行初始化:

最后一层卷积层单个filter输出特征长度(the output frame length)为 l6=(l0−96)/27,推

第一层全链接层的输入维度(其中1024和256为filter个数或者说frame/feature size):

Large: l6∗1024

Small: l6∗256

下图为模型的一个图解示例。其中文本长度为10,第一层卷积的kernel size为3(半透明黄色正方形),卷积个数为9(Feature=9),步长为1,所以Length=10-3+1=8,而后进行非重叠的max-pooling(即pooling的stride=size),pooling size为2,所以池化后的Length = 8 / 2 = 4。

3.5.2 字符级CNN的相关总结与思考

字符级CNN是一个有效的方法

数据集的大小能够为选择传统方法仍是卷积网络模型提供指导:对于几百上千等小规模数据集,能够优先考虑传统方法,对于百万规模的数据集,字符级CNN开始表现不错。

字符级卷积网络很适用于用户生成数据(user-generated data)(如拼写错误,表情符号等),

没有免费的午饭(There is no free lunch)

中文怎么办

中文中的同音词很是多,如何克服?

若是把中文中的每一个字做为一个字符,那么字母表将很是大

是否能够把中文先转为拼音(pinyin)?

论文Character-level Convolutional Network for Text Classification Applied to Chinese Corpus进行了相关实验。

将字符级和词级进行结合是否结果更好

英文如何结合

中文如何结合

3.5.3 使用同义词表进行数据加强

对于深度学习模型,采用适当的数据加强(Data Augmentation)技术能够提升模型的泛化能力。数据加强在计算机视觉领域比较常见,例如对图像进行旋转,适当扭曲,随机增长噪声等操做。对于NLP,最理想的数据加强方法是使用人类复述句子(human rephrases of sentences),可是这比较不现实而且对于大规模语料来讲代价昂贵。

一个更天然的选择是使用词语或短语的同义词或同义短语进行替换,从而达到数据加强的目的。具体作法以下:

英文同义词典: from the mytheas component used in LibreOffice1 project. http://www.libreoffice.org/

从给定的文本中抽取出全部能够替换的词,而后随机选择r个进行替换,其中r由一个参数为pp的几何分布(geometric distribution)肯定,即P[r]∼pr

给定一个待替换的词,其同义词可能有多个(一个列表),选择第s个的几率也经过另外一个几何分布肯定,即P[s]∼qs。这样是为了当前词的同义词列表中的距离较远(s较大)的同义词被选的几率更小。

论文实验设置:p=0.5,q=0.5。

4 RNN用于文本分类

策略1:直接使用RNN的最后一个单元输出向量做为文本特征

策略2:使用双向RNN的两个方向的输出向量的链接(concatenate)或均值做为文本特征

策略3:将全部RNN单元的输出向量的均值pooling或者max-pooling做为文本特征

策略4:层次RNN+Attention, Hierarchical Attention Networks

5 RCNN(RNN+CNN)用于文本分类

论文Recurrent Convolutional Neural Networks for Text Classification设计了一种RNN和CNN结合的模型用于文本分类。

5.1 RCNN模型推导

5.1.1 词表示学习

使用双向RNN分别学习当前词wi的左上下文表示cl(wi)和右上下文表示cr(wi),再与当前词自身的表示e(wi)链接,构成卷积层的输入xi。具体以下:

而后将xi做为wi的表示,输入到激活函数为tanh,kernel size为1的卷积层,获得wi的潜在语义向量(latent semantic vector)

将kernel size设置为1是由于xi中已经包含wi左右上下文的信息,无需再使用窗口大于1的filter进行特征提取。可是须要说明的是,在实践中仍然能够同时使用多种kernel size的filter,如[1, 2, 3],可能取得更好的效果,一种可能的解释是窗口大于1的filter强化了wi的左右最近的上下文信息。此外,实践中可使用更复杂的RNN来捕获wi的上下文信息如LSTM和GRU等。

5.1 2 文本表示学习

通过卷积层后,得到了全部词的表示,而后在通过最大池化层和全链接层获得文本的表示,最后经过softmax层进行分类。具体以下:

下图为上述过程的一个图解:

5.2 RCNN相关总结

NN vs. traditional methods: 在该论文的全部实验数据集上,神经网络比传统方法的效果都要好

Convolution-based vs. RecursiveNN: 基于卷积的方法比基于递归神经网络的方法要好

RCNN vs. CFG and C&J: The RCNN能够捕获更长的模式(patterns)

RCNN vs. CNN: 在该论文的全部实验数据集上,RCNN比CNN更好

CNNs使用固定的词窗口(window of words), 实验结果受窗口大小影响

RCNNs使用循环结构捕获普遍的上下文信息

6 必定要CNN/RNN吗

上述的深度学习方法经过引入CNN或RNN进行特征提取,能够达到比较好的效果,可是也存在一些问题,如参数较多致使训练时间过长,超参数较多模型调整麻烦等。下面两篇论文提出了一些简单的模型用于文本分类,而且在简单的模型上采用了一些优化策略。

6.1 深层无序组合方法

论文Deep Unordered Composition Rivals Syntactic Methods for Text Classification提出了NBOW(Neural Bag-of-Words)模型和DAN(Deep Averaging Networks)模型。对比了深层无序组合方法(Deep Unordered Composition)和句法方法(Syntactic Methods)应用在文本分类任务中的优缺点,强调深层无序组合方法的有效性、效率以及灵活性。

6.1.1 Neural Bag-of-Words Models

论文首先提出了一个最简单的无序模型Neural Bag-of-Words Models (NBOW model)。该模型直接将文本中全部词向量的平均值做为文本的表示,而后输入到softmax 层,形式化表示以下:

6.1.2 Considering Syntax for Composition

一些考虑语法的方法:

Recursive neural networks (RecNNs)

能够考虑一些复杂的语言学现象,如否认、转折等 (优势)

实现效果依赖输入序列(文本)的句法树(可能不适合长文本和不太规范的文本)

须要更多的训练时间

Using a convolutional network instead of a RecNN

时间复杂度一样比较大,甚至更大(经过实验结果得出的结论,这取决于filter大小、个数等超参数的设置)

6.1.3 Deep Averaging Networks

Deep Averaging Networks (DAN)是在NBOW model的基础上,经过增长多个隐藏层,增长网络的深度(Deep)。下图为带有两层隐藏层的DAN与RecNN模型的对比。

6.1.4 Word Dropout Improves Robustness

针对DAN模型,论文提出一种word dropout策略:在求平均词向量前,随机使得文本中的某些单词(token)失效。形式化表示以下:

Word Dropout可能会使得某些很是重要的token失效。然而,使用word dropout每每确实有提高,这多是由于,一些对标签预测起到关键性做用的word数量每每小于可有可无的word数量。例如,对于情感分析任务,中立(neutral)的单词每每是最多的。

Word dropout 一样能够用于其余基于神经网络的方法。

Word Dropout或许起到了相似数据加强(Data Augmentation)的做用?

6.2 fastText

论文Bag of Tricks for Efficient Text Classification提出一个快速进行文本分类的模型和一些trick。

6.2.1 fastText模型架构

fastText模型直接对全部进行embedded的特征取均值,做为文本的特征表示,以下图。

6.2.2 特色

当类别数量较大时,使用Hierachical Softmax

将N-gram融入特征中,而且使用Hashing trick[Weinberger et al.2009]提升效率

7 最新研究

根据github repo: state-of-the-art-result-for-machine-learning-problems ,下面两篇论文提出的模型能够在文本分类取得最优的结果(让AI当法官比赛第一名使用了论文Learning Structured Text Representations中的模型):

Learning Structured Text Representations

Attentive Convolution

论文Multi-Task Label Embedding for Text Classification 认为标签与标签之间有可能有联系,因此不是像以前的深度学习模型把标签当作one-hot vector,而是对每一个标签进行embedding学习,以提升文本分类的精度。

References

[1] Le and Mikolov - 2014 - Distributed representations of sentences and documents

[2] Kim - 2014 - Convolutional neural networks for sentence classification

[3] Zhang and Wallace - 2015 - A Sensitivity Analysis of (and Practitioners' Guide to) Convolutional Neural Networks for Sentence Classification

[4] Zhang et al. - 2015 - Character-level convolutional networks for text classification

[5] Lai et al. - 2015 - Recurrent Convolutional Neural Networks for Text Classification

[6] Iyyer et al. - 2015 - Deep unordered composition rivals syntactic methods for Text Classification

[7] Joulin et al. - 2016 - Bag of tricks for efficient text classification

[8] Liu and Lapata - 2017 - Learning Structured Text Representations

[9] Yin and Schütze - 2017 - Attentive Convolution

[10] Zhang et al. - 2017 - Multi-Task Label Embedding for Text Classification

相关文章
相关标签/搜索