XDRush

深度学习在文本分类中的应用之CNN

1 背景说明

1.1 行文缘由

最近因为工作上的原因,接触到较多的文本分类相关的领域:比如在信息流广告或者搜索广告中,对关键词、广告创意进行行业分类等。于是,对传统的文本分类方法和目前比较流行的用深度学习进行文本分类做了一个归纳总结,这篇文章就是讲CNN在文本分类中的应用,也是行业中的一篇非常经典的文章。

1.2 传统的文本分类方法

传统的文本分类方法主要是靠人工特征工程+浅层分类模型组成,一般的流程见下图:
传统文本分类方法流程

(1)特征工程
特征工程在机器学习中往往是最耗时耗力的,但却极其的重要。抽象来讲,机器学习问题是把数据转换成信息再提炼到知识的过程,特征是“数据—>信息”的过程,决定了结果的上限,而分类器是“信息—>知识”的过程,则是去逼近这个上限。然而特征工程不同于分类器模型,不具备很强的通用性,往往需要结合对特征任务的理解。

文本分类问题所在的自然语言领域自然也有其特有的特征处理逻辑,传统分本分类任务大部分工作也在此处。文本特征工程分为文本预处理、特征提取、文本表示三个部分,最终目的是把文本转换成计算机可理解的格式,并封装足够用于分类的信息,即很强的特征表达能力。

文本预处理
文本预处理过程是在文本中提取关键词表示文本的过程,中文文本处理中主要包括文本分词和去停用词两个阶段。这里就不作介绍。

文本表示
文本表示的目的是把文本预处理后的转换成计算机可理解的方式,是决定文本分类质量最重要的部分。传统做法常用词袋模型(BOW, Bag Of Words)或向量空间模型(Vector Space Model),最大的不足是忽略文本上下文关系,每个词之间彼此独立,并且无法表征语义信息。词袋模型的示例如下:

           $$( 0, 0, 0, 0, .... , 1, ... 0, 0, 0, 0)$$

一般来说词库量至少都是百万级别,因此词袋模型有个两个最大的问题:高纬度、高稀疏性。词袋模型是向量空间模型的基础,因此向量空间模型通过特征项选择降低维度,通过特征权重计算增加稠密性。

特征提取
向量空间模型的文本表示方法的特征提取对应特征项的选择和特征权重计算两部分。特征选择的基本思路是根据某个评价指标独立的对原始特征项(词项)进行评分排序,从中选择得分最高的一些特征项,过滤掉其余的特征项。常用的评价有文档频率、互信息、信息增益、χ²统计量等。
特征权重主要是经典的TF-IDF方法及其扩展方法,主要思路是一个词的重要度与在类别内的词频成正比,与所有类别出现的次数成反比。

(2)浅层分类器
分类器基本都是统计分类方法了,基本上大部分机器学习方法都在文本分类领域有所应用,比如朴素贝叶斯分类算法(Naive Bayes)、KNN、SVM、最大熵和神经网络等等,传统分类模型不是本文重点,在这里就不展开了。

1.3 深度学习文本分类方法

我们知道,传统方法一般采用one-hot或者multi-hot来表示文本,由于文本词汇集的规模,势必会导致文本表示的高稀疏性,高稀疏性意味着输入的数据维度很高,如果紧接着的隐藏层只有几百个神经元的话,也会导致上亿甚至几十亿的参数规模,也就意味着需要更多的训练数据,伴随而来的是训练时间和成本。因此,神经网络对于传统的文本处理方法是无能为力的。

此外需要人工进行特征工程,成本很高。而深度学习最初在之所以图像和语音取得巨大成功,一个很重要的原因是图像和语音原始数据是连续和稠密的,有局部相关性。应用深度学习解决大规模文本分类问题最重要的是解决文本表示,再利用CNN/RNN等网络结构自动获取特征表达能力,去掉繁杂的人工特征工程,端到端的解决问题。

近几年随着深度学习的发展,深度学习天然的对特征的处理能够极大的提高文本分类的性能。特别是Word Embedding发展起来之后,并且这种Embedding思想为其他领域的发展也起到了积极作用(哈哈,这里顺便提一句Neural Embedding思想在CTR预估中的广泛应用)。

1.3.1 深度学习文本应用基础之词向量

分布式表示(Distributed Representation)其实Hinton 最早在1986年就提出了,基本思想是将每个词表达成 n 维稠密、连续的实数向量,与之相对的one-hot encoding向量空间只有一个维度是1,其余都是0。分布式表示最大的优点是具备非常powerful的特征表达能力,比如 n 维向量每维 k 个值,可以表征 $k^n$个概念。事实上,不管是神经网络的隐层,还是多个潜在变量的概率主题模型,都是应用分布式表示。下图是03年Bengio在 A Neural Probabilistic Language Model 的网络结构:
word2vector结构

这篇文章提出的神经网络语言模型(NNLM,Neural Probabilistic Language Model)采用的是文本分布式表示,即每个词表示为稠密的实数向量。NNLM模型的目标是构建语言模型:
NNLM目标

词的分布式表示即词向量(word embedding)是训练语言模型的一个附加产物,即图中的Matrix C。
尽管Hinton 86年就提出了词的分布式表示,Bengio 03年便提出了NNLM,词向量真正火起来是google Mikolov 13年发表的两篇word2vec的文章 Efficient Estimation of Word Representations in Vector Space 和 Distributed Representations of Words and Phrases and their Compositionality,更重要的是发布了简单好用的word2vec工具包,在语义维度上得到了很好的验证,极大的推进了文本分析的进程。下图是文中提出的CBOW 和 Skip-Gram两个模型的结构,基本类似于NNLM,不同的是模型去掉了非线性隐层,预测目标不同,CBOW是上下文词预测当前词,Skip-Gram则相反。

CBOW和skip-gram模型

除此之外,提出了Hierarchical Softmax 和 Negative Sample两个方法,很好的解决了计算有效性,事实上这两个方法都没有严格的理论证明,有些trick之处,非常的实用主义。详细的过程不再阐述了,有兴趣深入理解word2vec的,推荐读读这篇很不错的paper:word2vec Parameter Learning Explained。额外多提一点,实际上word2vec学习的向量和真正语义还有差距,更多学到的是具备相似上下文的词,比如“good”“bad”相似度也很高,反而是文本分类任务输入有监督的语义能够学到更好的语义表示。

至此,文本的表示通过词向量的表示方式,把文本数据从高纬度高稀疏的神经网络难处理的方式,变成了类似图像、语音的的连续稠密数据。深度学习算法本身有很强的数据迁移性,很多之前在图像领域很适用的深度学习算法比如CNN等也可以很好的迁移到文本领域了,接下来就看CNN是如何应用在文本分类任务中的。

2 CNN用于文本分类

这篇文章是2016 Yann LeCun团队发表的,至今已被它因近2000次,可见其价值。

CNN最初在图像领域取得了巨大成功,原理这里就不讲了,核心点在于可以捕捉局部相关性(CNN主要是捕捉空间上的相关性,RNN捕捉时间上的相关性),具体到文本分类任务中可以利用CNN来提取句子中类似n-gram的关键信息(其实一个n-gram代表的就是前后词语搭配的空间上的关系)。

2.1 模型结构

CNN模型结构如下图所示:
模型结构

2.2 模型解读之输入层

这里的输入层显示有两个channel,其实我们可以看作是一个,因为后文中说到这两个channel分别是static和non-static,即使用的词向量是否随着训练发生变化。non-static就是词向量随着模型训练变化(Fine tune),这样的好处是词向量可以根据数据集做适当调整,但是CS224d课程里也说过当数据集较小时不推荐此操作,否则容易产生过拟合现象。static就是直接使用word2vec训练好的词向量即可。此外,由图可知,输入层是将一个句子所有单词(padding)的词向量进行拼接成一个矩阵,每一行代表一个词。每个句子固定为某个数目个词,如果不够的补padding。

2.2 模型解读之卷积层

每个卷积核的大小为filter_size*embedding_size,filter_size代表卷积核纵向上包含单词个数,即认为相邻几个词之间有词序关系,文章中使用的是[3,4,5]。embedding_size就是词向量的维数。每个卷积核计算完成之后我们就得到了1个列向量,代表着该卷积核从句子中提取出来的特征。有多少和卷积核就能提取出多少种特征,即图中在纵深方向上channel的数量。
论文中指出用到的多个filter的大小不一样,如上面所说得[3,4,5],即分别将3、4、5个词拼接在一起,这样可以获取词序特征;
CNN卷积层结构

2.3 模型解读之pooling层

文中提到pooling操作就是将卷积得到的列向量的最大值提取出来。这样pooling操作之后我们会获得一个num_filters维的行向量,即将每个卷积核的最大值连接起来。这样做还有一个好处就是,如果我们之前没有对句子进行padding操作,那么句子的长度是不同的,卷积之后得到的列向量维度也是不同的,可以通过pooling来消除句子之间长度不同的差异;并且多个不同大小的filter经过卷积层之后维数也不一致,但是经过pooling层之后维数就变得一致了。
pooling层结构

2.4 模型解读之全连接层

为了将pooling层输出的向量转化为我们想要的预测结果,加上一个softmax层即可。针对电影评价的分类任务,就是将其转化为正面、负面两个结果。文中还提到了过拟合的问题,因为实验中所使用的数据集相对较小,很容易就会发生过拟合现象,在实验过程中也会发现当迭代3000多轮的时候准确率就会接近1。所以这里引如dropout来减少过拟合现象。此外还可以考虑L2正则化等方法实现防止过拟合的功能。
全连接层

全连接层的输出依赖于最终结果的分类类别个数;全连接之后再做softmax即可;

2.5 性能对比

CNN用于文本分类最终的性能表现如下:
CNN性能对比

模型最终的性能如上图,可以看出,CNN做文本分类相比于传统方法有较大的性能提升;

3 总结

个人认为这篇文章的主要创新点是:(1)充分利用CNN卷积核提取局部信息的能力,结合n-gram将CNN较好的应用在文本分类任务中;(2)提出双channel机制,针对特定的任务,可以调整预训练的word2vector来更好的同场景相适应,当然前提是数据集较大。