1.CNN使用原理

  • (1) 相对于图片像素,在NLP任务中,将句子和文章作为一个矩阵来输入给CNN网络,矩阵中的每一行代表一个标记token,通常是一个词语,但是,也可以是一个字符。也就是说,矩阵中的每行是一个向量,这个向量代表一个词语。通常这个向量是词嵌入向量(低维表示),比如word2vec、glove,但是有时候单个词语也可以使用one-hot编码来表示该单词在词汇表中的索引。对于一个由10个单词组成的句子,使用一个100维的词嵌入向量来表示每个单词,那么这个句子可以表示为10*100为的矩阵,这个矩阵就可以作为CNN网络的输入,也就类似于图像领域的“图片”。
  • (2) 在计算机视觉领域,卷积核是滑过整个图片。但是,在NLP领域我们通常使用卷积核滑过矩阵的整行,相当于滑过句子中的词语。换句话说是,卷积核的宽度通常与(1)中输入的矩阵宽度相同。但是,卷积核的高度通常是变化的,通常每次滑过的单词宽度是windows words 是2~5,将所有卷积核提取的结果合并在一起,NLP中的一个卷积神经网络工作原理如下图所示:
    如何在NLP领域应用卷积神经网络CNN_qt

2.NLP中的CNN不同之处

  • (1) 我们对计算机视觉的直觉如何?位置不变性和局部组合性对图像有直观的意义,但对于NLP则不那么重要。你可能会关注在一个句子中出现同一个词语。彼此接近的像素可能在语义上相关(对同一图像的一部分而言),但对于词语而言并非总是如此。在许多语言中,短语的一部分可以用几个其他单词分开,词语外观上也不明显。很明显,在某些方面单词的构成,例如修饰名词的形容词,但这究竟是如何工作的,更高级别的表示实际上“含义”并不像计算机视觉那样明显。
  • (2) 考虑到上述描述的问题,CNN似乎无法在NLP任务中使用。幸运的是,上述存在的问题并不能意味着CNN在NLP任务中无法应用。正如名言" All models are wrong, but some are useful"所说,从事实角度出发,CNN在NLP任务上的应用反而很好。简单的Bag of Words模型显然过于简单化,但多年来一直是常用方法,并取得了相当不错的结果。
  • (3)对于CNN网络,一直认为它都是一个很快的网络。卷积操作是计算机图像方向的核心操作,在GPU硬件上的实现。与n-grams语言模型对比,从词语的表示形式上来说,CNN更加有效。当一个词汇表中有很多单词时,计算超过tri-grams时将会浪费很多的计算成本。即使是Google公司也不会提供超过5-grams的语言模型。卷积核可以自动学习到词语好的表示形式,不需要表示出整个词汇表。卷积核的数量超过5个是完全合理的,我认为卷积核在第一层捕捉到的特征与n-grams语言模型捕捉到的特征是相似的,但是前者以一种更紧凑的方式表现出来的。

3.CNN中的超参数

在解释CNN如何应用在NLP任务中之前,先让我们看看搭建CNN时需要做出的一些选择,希望这有助于您更好地了解该领域的文献。

  • (1) Narrow vs. Wide convolution
    • a. 当我解释上面的卷积操作时,我忽略了使用卷积核过程中的一些细节。应用一个3*3的卷积核在矩阵的中间部分时,得到的结果会很好,但是矩阵的边缘部分该如何处理?如何将卷积核应用在一个没有左上角元素的矩阵的第一个元素上?答案是使用padding操作,所有在矩阵边缘的元素都可以在边缘元素的外部用0填充。通过这个操作,你可以将卷积核应用在输入矩阵的任意位置上,获得一个更大且相同大小的输出。增加zero-padding操作也被称为是wide convolution,没有用0元素填充的操作称为narrow convolution.下图中n_filter=5,n_in=7,n_padding=4
      如何在NLP领域应用卷积神经网络CNN_qt_02
      如何在NLP领域应用卷积神经网络CNN_qt_03
    • b.当你有一个与输入矩阵尺寸相关且很大的卷积核时,通过上图,你可以看出wide convolution是有用的,甚至是必要的操作。如上图所示,narrow convolution生成的输出尺寸是(7-5)+1=3,wide convolution生成的输出尺寸是(7-2*4-5)+1=11。更加普遍的情况是,计算公式如下图所示:
      如何在NLP领域应用卷积神经网络CNN_qt_04
  • (2) Stride Size
    • a.卷积神经网络中的另一个超参数是stride size,这个参数定义了卷积核每次在输入矩阵中的移动步长大小。上面的所有例子中stride size=1,重复的应用这个步长来移动卷积核。步长越大,卷积核的移动次数越少,输出的尺寸越小。下面的图来自CS231课程
      如何在NLP领域应用卷积神经网络CNN_qt_05
      如何在NLP领域应用卷积神经网络CNN_qt_06
    • b.通常在文献中stride size=1,当stride size太大时,我们可以构建出一个类似于循环神经网络结构的模型。
  • (3) Pooling Layers
    • a.CNN中的一个关键方面是池化层,这层通常在卷积层之后应用。通常对卷积核得到的输出应用一个max操作实现池化功能。你不需要对整个矩阵进行池化操作,你可以将矩阵分隔成几个窗口,对每个窗口进行池化操作。例如,下图中max操作时,窗口的大小是2*2(在NLP领域中,我们通常在卷积层的输出矩阵上应用池化操作,每个卷积核池化后得到一个实数),具体如下图所示:
      如何在NLP领域应用卷积神经网络CNN_qt_07
    • b.为什么要进行池化操作?主要有以下几个原因:池化层的一个特点是提供一个固定大小的输出矩阵,这个输出矩阵通常被用作分类。比如,你有1000个卷积核,你将池化操作应用在卷积层输出的矩阵后,不论卷积核的大小、输入矩阵的大小,你都会得到一个1000维的池化后的输出矩阵。这允许你可以使用可变大小的句子长度和可变大小的过卷积核,但最终获得相同的输出维度来提供给分类器。
    • c.池化操作还可以减少输出矩阵的维度,但是同时也保持了最显著的特征。你可以将每个卷积核理解成检测特定功能的特征提取器。例如,检测句子是否包含“not amazing”等这样的否定词语。如果此词语出现在句子中的某处时,则将卷积核应用于该区域,结果将产生较大的值,但在其他区域中产生较小的值。通过执行最大池化操作,能够将这个词语是否出现在句子中的信息保留下来,但是也丢失有关词语出现在句子何处的信息。但后者的这个信息不太重要,它类似于bag of n-grams模型。你正在丢失关于这个词语在一个句子中全局位置信息,但同时卷积核正在捕捉这个词语在这个句子中的局部位置信息,比如"not amazing"与"amazing not"显然是不同的。
    • d.在图像识别领域,池化操作提供了图片移动和旋转的基本不变特性。当你对某个区域执行池化操作,即使你将图像移动/旋转几个像素,输出也将保持大致相同,因为最大池化操作无论如何都会选择相同的值。
  • (4) Channels
    最后,我们必须理解通道这个概念,通道是对输入数据的不同视角理解。例如,在图像识别领域,通常有RGB(红、绿、蓝)3个通道,你可以贯穿整个通道来执行卷积操作,使用相同或不同的权重。在NLP中,你可以想象有不同的通道,如:你可以分别为不同的词嵌入(word2vec/glove)使用一个独立的通道,或者你也可以为不同语言中相同含义的句子设置一个通道。

4.Convolutional Neural Networks applied to NLP

下面让我们看一下CNN在自然语言处理中的使用,我尝试总结CNN在这个领域上一些研究成果。研究结果总是我会想起许多有趣的应用程序(请在评论中告诉我),但我希望至少涵盖一些更受欢迎的结果。

  • (1)CNN在NLP中的最适合的应用似乎是分类任务,比如情感分析、垃圾邮件识别、观点分类等。卷积和池化操作丢失关于单词的局部位置信息,因此序列标注(如位置标注、实体提取)任务上应用一个纯CNN网络是有一点困难的。文献[1]在一个多分类数据集上评价一个CNN网络结构的效果,主要包括情感分析和主题分类任务。CNN网络结构在整个数据集上获得非常好的效果。令人意外的是文章中使用的网络非常简单,但是功能强大。输入层是一个句子,这个句子是由word2vec词嵌入表示的词向量表示。卷积层使用了多个卷积核,卷积层之后使用一个最大池化层,最后是一个softmax分类器。文章中使用静态和动态两种不同的词嵌入的通道,动态的通道在训练过程中能自动调整词嵌入。文献[2]使用更加复杂的网络结构,文献[3]中增加一个额外的一层来执行"语义聚类"任务。
    如何在NLP领域应用卷积神经网络CNN_qt_08

5.论文复现结果

如何在NLP领域应用卷积神经网络CNN_qt_09
如何在NLP领域应用卷积神经网络CNN_qt_10
如何在NLP领域应用卷积神经网络CNN_qt_11
如何在NLP领域应用卷积神经网络CNN_qt_12
如何在NLP领域应用卷积神经网络CNN_qt_13
如何在NLP领域应用卷积神经网络CNN_qt_14

6.参考文献及博客

参考文献1
参考文献2
参考文献3
本文翻译原文链接
参考博客