NLP研究中CNN的一些应用

1,548 阅读9分钟
原文链接: yudake.xin

author:yudake
1/17/2018 3:23:04 PM 

英文原文: Understanding Convolutional Neural Networks for NLP(有删减)

我将文章中的模型应用在色情文章检测项目中,取得了98%以上的准确率。
github:色情文章检测

怎样在NLP中应用CNN

与CV不同,在NLP中输入的不是图像像素,而是用矩阵表示的句子或文档。矩阵的每一行对应一个标记,通常是一个单词或者一个符号。

也就是说,每一行都是代表一个单词的行向量。

这一个向量就是 词嵌入 (一种低维矩阵表示),像 word2vec 或者 GloVe。或者可以用 one-hot向量 将单词索引到词汇表。

比如,一个有10个单词的句子,我们把每个单词用100维的向量表示,我们就有了一个10*100的矩阵作为输入。这就是我们的“图片”。

在CV领域,filter划过图像的部分区域(像素,典型的是3*3),但是在NLP中,我们用filter划过矩阵的整行,并且跨越多行。也就是一个filter提取的特征是多个单词的特征。因此,我们filter的宽度就是矩阵的宽度。而filter的高度,或者说区域大小,是一个范围,一般是2-5个单词。

综上所述,一个用于NLP的CNN可能看起来如下图所示:

CNN框架图
图1:这里给了三种filter型号:2,3和4。每一种型号都有两个filter。每一种filter卷积之后生成特征图。然后,对每一个特征图进行最大池化,然后将每个特征图池化后的特征进行拼接,生成一个6*1的列向量。最后将特征向量送入softmax层,这里假设输出有两种可能状态。 Source: Zhang, Y., & Wallace, B. (2015). A Sensitivity Analysis of (and Practitioners’ Guide to) Convolutional Neural Networks for Sentence Classification.

在CV中,位置不变性和局部合成对于图像来说很容易理解,但对NLP来说并不是这样。我们很关心某一单词出现在句子中的位置。图像中,邻近的像素可能在语义上是相关的,但对于单词并不总是这样。在一些语言中,一部分短语可以被其他单词分开。而且组成成分也不明显。显然的是,单词有一种方式进行组合,比如说形容词修饰名词,但是这种高级别的表示如何工作的并不像CV那样明显。

考虑到以上,CNN似乎不太适合NLP任务。而RNN更加直观,就像人类处理语言的方式一样,从左往右依次阅读。

幸运的是,有些CNN模型是有用的。事实证明,应用于NLP问题的CNN表现相当不错。简单的 Bag of Words(词袋模型) 是一种显而易见的简化,这一简化并不精确,但是多年来一直是标准方法,并取得了不错的效果。

CNN的一个主要优势就是速度快。CNN的卷积可以在GPU上进行运算。即使与 N-grams 相比,CNN在词汇表示方面也很有效。在大量词汇表下,计算超过3-grams是非常费时的,即使Google也不推荐超过5-grams。卷积核可以自动学习好的表示方式,而不需要整个词汇表。完全可以设定filter的大小在5以上。

第一层的filter功能非常类似(但不限于)n-gram,但是以更简洁的方式表示

CNN的超参数

宽卷积与窄卷积

窄卷积不使用零填充(如下左图)
宽卷积指的是在卷积时,使用零填充(如下右图)

窄卷积与宽卷积
图2:窄卷积与宽卷积。Filter size = 5, 输入size = 7.

其中,窄卷积产生(7-5)+1=3个输出。宽卷积产生(7+2*4-5)+1=11个输出。

n_out = (n_in+2*n_padding-n_filter)+1

步长

步长(stride)定义每一步filter移动的数量。上面的所有步长都是1。一维输入的步长一般是1或2。

步长

图3:卷积步长。左图:步长为1。右图:步长为2

池化层

通常用池化层对输入进行子采样。一般是用最大池化。以下举出了一个2*2窗口的最大池化(在NLP中,通常对一个filter的整个输出进行池化,每个滤波器只产生一个数字)。

池化
图4:CNN中的池化

为什么要池化?

  • 可以提供一个固定输出大小的矩阵

    • 也就是无论filter的大小或输入的大小如何,都能获得固定大小的输出。可以始终获得相同大小的输入进行分类。
  • 获取最显著的信息

    • 每个filter相当于检测某个特定功能。如果检测到本功能,就会输出一个比较大的数值,如果没有检测到,就会输出一个比较小的数值。通过执行最大池化可以获得本句是否有该特征信息。但是丢失了位置信息。

通道

在图像识别中,有RGB三个通道。在NLP中,可以有不同的 词嵌入(word embeddings) ,比如word2vec或者GloVe。或者同一个句子用不同的语言表达。

CNN在NLP中的应用

最适合CNN的应用是分类任务。比如情感分析,垃圾邮件检测或主题分类。卷积和合并操作会丢失有关本地字词顺序的信息,因此像词性标注(PoS Tagging)或者实体提取(Entity Extraction)不太适合CNN。

[1]验证了一种CNN结构,主要使用的是情感分析和主题分类数据集。这一CNN结构在数据集上取得了非常好的性能,并且有一些 尖端技术(state-of-art)

输 入 层 :由word2vec词嵌入拼接组成的句子
隐 藏 层 :带有多个filter的卷积层
Max\_pool:一个池化层
输 出 层 :送入softmax分类器

本文还利用两个通道分别是静态 词嵌入 和动态 词嵌入 进行实验,其中一个通道在训练期间会被调整,另一个不会。文献[2]提出了一个类似的但是更复杂的架构。[6]添加了一个额外的层,用来执行“语义聚类”。

Kim, Y. (2014). Convolutional Neural Networks for Sentence Classification
图5:NLP中的CNN模型

[4]从零开始训练向量,不需要word2vec或GloVe这样的预先训练的单词向量,而是直接把卷积应用在one-hot向量上。作者还为输入数据提出了一种节省空间的类词袋模型(bag-of-works-like),减少了神经网络需要学习的参数数量。[5]添加了一个额外的无监督的“区域嵌入”,通过CNN预测文本区域的上下文来学习。这个模型对长文本(比如影评)有效,在短文本(比如推文)上的表现还不清楚。

预先训练的词嵌入,对于短文本效果更好。

构建一个CNN框架需要选择很多超参数。其中包括:

  • 输入表示(word2vec,GloVe,one-hot)
  • filter的数量和型号
  • 池化策略(最大池化,平均池化)
  • 激活函数(ReLU,tanh)

[7]对CNN结构中各种超参数的影响进行了评估。结果是:

  • 最大池化总是优于平均池化
  • 理想滤波器型号很重要,但是具体依赖于任务
  • 在NLP任务中,正则化作用并不明显

以上这些结论使用的数据的长度差距不大,所以如果数据长度差距很大可能不适用。

并不是所有论文都把重点放在训练或研究嵌入学习的意义。大多数CNN框架都把词或句子嵌入(低维表示)作为训练过程的一部分。[13]提出了一种CNN框架用于预测facebook帖子的主题标签,同时为单词和句子生成了有意义的嵌入。然后,这一训练好的嵌入被成功用于其他任务——推荐感兴趣文档。

字符级别的CNN

到目前为止,所有的模型都是根据单词的。但是,也有一些研究将CNN应用于字符。[14]研究了字符嵌入,与预训练的词嵌入一起用于CNN做词性标注。[15-16]尝试让CNN直接从字符学习,不需要预训练的嵌入。作者使用了9层网络,将其用于情感分析和文本分析。结果显示,在大型数据集上工作得很好,在小型数据集上表现不佳。

Reference

—— by yudake.