Press "Enter" to skip to content

CNN用于文本分类综述

本站内容均来自兴趣收集,如不慎侵害的您的相关权益,请留言告知,我们将尽快删除.谢谢.

作者:小川Ryan

 

https://zhuanlan.zhihu.com/p/55946246

 

知乎专栏:NLP成长之路

 

文本分类是自然语言处理中非常底层且至关重要的任务之一,其常见方法由以前的传统模型如朴素贝叶斯加之一些常规的特征提取操作,如TF-IDF、LDA等等,演变到如今一系列的深度模型,主要包括CNN及其变种, 以RNN为基础的诸多序列模型,以及后来的RCNN, RNN via attention等等。

 

但由于textCNN的实现简便、支持并行(从而运行速度很快),还是受到许多研究者的青睐,因而常常被用作一些数据集的baseline,特别对于一些语料中n-gram特征明显的语句,CNN无疑是一个很理想的选择(稍后你会知道为什幺),这篇文章就从基础的textCNN展开,并介绍在此之上的一些模型改进和训练细节,尽量做到全面而不失深度。

 

基础textCNN模型

CNN用于文本分类最经典的模型当属Kim在14年发表的CNN for sentence classification, 后来的诸多改进和变种都是基于此上的, 我们先对这个模型做一番剖析。

 

输入层是将语料经过预训练好的Word2Vec模型得到的词向量表达,你可能会感到疑惑,文本又不像图像那样是采用RGB编码的,上图中为何是有两个channel的?不要急,稍后我们会探讨这个问题。

 

得到了词向量表达后我们便可以对二维的矩阵做卷积了,设句子的长度为n, 词向量的维度为k,每个卷积核的窗口大小为h*k,将其对输入层进行一次卷积,可得到(n-h+1)维的特征集合,我们称之为一个feature map,由于卷积核的权重是共享的,因此一个卷积核只能提取到某一类特征,我们有必要采取不同大小的卷积核进行卷积,如h分别为2,3,4的相当于语言模型中的2-gram,3-gram, 4-gram.

尽管是做二维卷积,但由于卷积核的宽度与词向量维度大小相同(这样做的原因是词向量将每个词表达成k维的特征表示,若卷积核宽度小于k,会造成不小的信息损失),实际上也相当于是在做一维卷积。

 

利用不同的卷积核得到不同的feature map后,论文中采用max pooling的方式来做池化,这是最常见的一种做pooling的方式,其目的是对得到的每个feature map,只保留其中得分最高、最强的那个特征,抛弃其他特征,实现卷积后的进一步降维。这样做还有一个好处就是之前用不同大小卷积核得到的长短不一的feature map,经过这一步pooling得到的都是固定大小的特征表示,有几个卷积核pooling层就有几个神经元,后面的全连接层神经元的个数也得以固定。

 

 

池化之后传递到全连接层,为防止过拟合须进行drop-out,设 z 是经过池化后的特征向量,r是同维度的”masking”,以概率为p的大小赋值为1其余为0进行初始化(满足参数为p的伯努利分布),注意到时对测试集进行预测时,须将权重w也要乘以p进行预测。此外,论文中还对权重的l2范数进行了限制,若经过某次梯度下降后w的l2范数大于s, 会调整w使得其l2范数重置为s,即

 

有关模型改进的探讨

 

输入层

 

还记得刚才你产生的那个疑问吗,文本又不像图像那样是采用RGB编码的,论文图中为何是有两个channel?我们知道,词向量的嵌入矩阵是可以令其随着训练过程也进行调整的,当训练语料充足时,这样可以使得模型针对当前特定的任务提取到更”应景”的语义特征,论文的作者也做了这样的实验

上图是检查静态的和可调整的词向量中和一些词的语义最相近的词,如图在静态的词向量中,与”bad”最相近的词竟是”good”,这主要是因为这两个词出现场景以及所在句子的语法结构都颇为类似,而可调整的词向量找到的词都比较”得体”,与人类的想法也比较接近,甚至连缩写和标点符号都能”揣摩”到其含义。不过在某种程度上这种”过度推断”容易造成过拟合,因而作者受图像表示的启发将这两种词向量作为了输入层不同的channel来进行训练,在一定程度上进行了正则化,取得了还不错的效果

我将作者这种做法理解为是词向量的一种”融合”,实际操作中我们还可以进行其他的一些尝试,如一个channel用Word2Vec, 另一个channel用glove,或者将两种词向量拼接成一个(如300维的Word2Vec和300维的glove拼接成600维的”加长版”),也可以将两种或以上的同维度词向量平均或加权平均成一个词向量等等,都可以尝试。

 

不同的pooling方式

 

上面我们提到,max pooling是最常见的一种做sub-sample的方式,其可以提取出每个feature map中最强的特征,对特征进行降维、减少过拟合。但其有两个比较明显的缺陷:

 

一是未考虑任何特征的位置信息,这不论是对于图像还是文本的处理都是不利的,图像领域:曾看过一个人脸识别的例子,一张正常的人脸模型可以正确识别,但是利用PS将其五官经过错位、倒置等变换后,模型还是将其识别为人脸;文本分类领域:对于一些粒度较粗的分类问题如话题分类位置信息可能影响不大,但对于如情感分析这种粒度较细的分类问题位置信息不足便会导致一些问题,如”虽然他长的很帅,但是人品不好”和”虽然他人品不好,但他长得帅啊”,在情感倾向上区别还是比较明显的。

 

二是只取feature map中一个得分最高的特征,会容易忽视特征的强度,如得分最高的特征只出现了一次,而得分第二高的特征出现了很多次,得分第二高的特征可能比最高的特征还要重要,却被丢弃了,自然造成了不小的信息损失。

 

因此我们可以针对上述的缺陷对pooling方式进行改进

 

K-Max pooling

K-Max pooling保留位置顺序选取得分最高的前K个特征,一定程度改善了上述问题

 

Chunk-Max pooling

Chunk-Max pooling将一个feature map分为若干段,每段选取一个得分最高的特征。至于划分的方式,既可以在最开始就确定如何划分,也可以根据输入的不同”动态”地进行划分,论文 Event Extraction via Dynamic Multi-Pooling Convolutional Neural Networks  中便提出动态划分chunk的方案。

 

模型结构的改进

 

输入层、卷积层、全连接层等还可以进行一些结构上的改变,如输入层可以在词向量后加上一层LSTM以便捕捉更长距离的信息,再将LSTM隐藏节点的输出作为CNN的输入。张俊林博士的这篇博客

 

深度学习与自然语言处理之四:卷积神经网络模型

 

提出了不少关于textCNN结构上的改进设想,有兴趣可以参考一下。

 

总结

 

本文主要介绍了一下基础textCNN的模型结构、训练过程,以及针对输入层,pooling层等位置进行改善的一些设想,有新的想法还会继续补充,若各位有自己的见解非常欢迎一起交流,也请大家不吝批评指正。

 

参考文献

 

Yoon Kim Convolutional Neural Networks for Sentence Classification

 

Y Chen Event Extraction via Dynamic Multi-Pooling Convolutional Neural Networks

 

Convolutional Neural Networks for Sentence Classification论文解读

 

自然语言处理中CNN模型几种常见的Max Pooling操作

 

深度学习与自然语言处理之四:卷积神经网络模型

 

本文转载自公众号: 机器学习算法与自然语言处理,作者:章锦川

Be First to Comment

发表评论

邮箱地址不会被公开。 必填项已用*标注