1 背景说明
1.1 行文缘由
最近因为工作上的原因,接触到较多的文本分类相关的领域:比如在信息流广告或者搜索广告中,对关键词、广告创意进行行业分类等。于是,对传统的文本分类方法和目前比较流行的用深度学习进行文本分类做了一个归纳总结,这篇文章就是讲 CNN 在文本分类中的应用,也是行业中的一篇非常经典的文章。
1.2 传统的文本分类方法
传统的文本分类方法主要是靠人工特征工程 + 浅层分类模型组成,一般的流程见下图:
(1)特征工程
特征工程在机器学习中往往是最耗时耗力的,但却极其的重要。抽象来讲,机器学习问题是把数据转换成信息再提炼到知识的过程,特征是 “数据—> 信息”的过程,决定了结果的上限,而分类器是 “信息—> 知识”的过程,则是去逼近这个上限。然而特征工程不同于分类器模型,不具备很强的通用性,往往需要结合对特征任务的理解。
文本分类问题所在的自然语言领域自然也有其特有的特征处理逻辑,传统分本分类任务大部分工作也在此处。文本特征工程分为文本预处理、特征提取、文本表示三个部分,最终目的是把文本转换成计算机可理解的格式,并封装足够用于分类的信息,即很强的特征表达能力。
文本预处理
文本预处理过程是在文本中提取关键词表示文本的过程,中文文本处理中主要包括文本分词和去停用词两个阶段。这里就不作介绍。
文本表示
文本表示的目的是把文本预处理后的转换成计算机可理解的方式,是决定文本分类质量最重要的部分。传统做法常用词袋模型(BOW, Bag Of Words)或向量空间模型(Vector Space Model),最大的不足是忽略文本上下文关系,每个词之间彼此独立,并且无法表征语义信息。词袋模型的示例如下:
1 | $$( 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 个值,可以表征 knknk^n 个概念。事实上,不管是神经网络的隐层,还是多个潜在变量的概率主题模型,都是应用分布式表示。下图是 03 年 Bengio 在 A Neural Probabilistic Language Model 的网络结构:
这篇文章提出的神经网络语言模型(NNLM,Neural Probabilistic Language Model)采用的是文本分布式表示,即每个词表示为稠密的实数向量。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 则相反。
除此之外,提出了 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 模型结构
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 个词拼接在一起,这样可以获取词序特征;
2.3 模型解读之 pooling 层
文中提到 pooling 操作就是将卷积得到的列向量的最大值提取出来。这样 pooling 操作之后我们会获得一个 num_filters 维的行向量,即将每个卷积核的最大值连接起来。这样做还有一个好处就是,如果我们之前没有对句子进行 padding 操作,那么句子的长度是不同的,卷积之后得到的列向量维度也是不同的,可以通过 pooling 来消除句子之间长度不同的差异;并且多个不同大小的 filter 经过卷积层之后维数也不一致,但是经过 pooling 层之后维数就变得一致了。
2.4 模型解读之全连接层
为了将 pooling 层输出的向量转化为我们想要的预测结果,加上一个 softmax 层即可。针对电影评价的分类任务,就是将其转化为正面、负面两个结果。文中还提到了过拟合的问题,因为实验中所使用的数据集相对较小,很容易就会发生过拟合现象,在实验过程中也会发现当迭代 3000 多轮的时候准确率就会接近 1。所以这里引如 dropout 来减少过拟合现象。此外还可以考虑 L2 正则化等方法实现防止过拟合的功能。
全连接层的输出依赖于最终结果的分类类别个数;全连接之后再做 softmax 即可;
2.5 性能对比
模型最终的性能如上图,可以看出,CNN 做文本分类相比于传统方法有较大的性能提升;
3 总结
个人认为这篇文章的主要创新点是:(1)充分利用 CNN 卷积核提取局部信息的能力,结合 n-gram 将 CNN 较好的应用在文本分类任务中;(2)提出双 channel 机制,针对特定的任务,可以调整预训练的 word2vector 来更好的同场景相适应,当然前提是数据集较大。