原文:Understanding Convolutional Neural Networks for NLP
作者:DENNY BRITZ
时间:2015/11/7

了解用于NLP的卷积神经网络


当我们听到卷积神经网络(Convolutional Neural Network)时,我们通常会想到计算机视觉。从 Facebook 的自动标记照片到自动驾驶汽车,CNNs 在图像分类方面有重大突破,并且是当今大多数计算机视觉系统的核心。

最近,我们也开始将 CNNs 应用于自然语言处理中的问题,并得到了一些有趣的结果。在这篇文章中,我将尝试总结一下 CNNs 是什么,以及它们在 NLP 中的用法。CNNs 背后的直觉对于计算机视觉用例来说是比较容易理解的,所以我会从这里开始,然后慢慢地转向 NLP。

什么是卷积?


对于我来说,理解卷积最简单的方法就是把它看作是应用于矩阵的滑动窗口函数。这很拗口,但视觉化后看起来就很清晰:

【NLP】了解用于NLP的卷积神经网络(译)
与3×3滤波器卷积。图片来源:
http://deeplearning.stanford.edu/wiki/index.php/Feature_extraction_using_convolution

想象一下,左边的矩阵表示黑白图像。每个条目对应一个像素,0 表示黑色,1 表示白色(灰度图像的典型值在 0 到 255 之间)。滑动窗口被称为内核(kernel)、过滤器(filter)或特征检测器(feature detector)。 这里我们使用一个 3×3 的过滤器,将它的值乘以原始矩阵,然后将它们相加。为了得到完整的卷积,我们通过在整个矩阵上滑动过滤器来为每个元素做相同的操作。

你可能想知道你可以用这个做什么。这里有一些直观的例子。

平均每个像素与其相邻的像素值用于模糊图像:

【NLP】了解用于NLP的卷积神经网络(译)【NLP】了解用于NLP的卷积神经网络(译)

取像素与其相邻像素之间的差异检测边界:
(为了直观地理解这一点,考虑一下图像中平滑的部分,像素的颜色等于其邻居的颜色:加法消除,结果值为 0 或黑色。如果亮度尖锐,例如从白色到黑色的过渡,会产生很大的差异,并产生白色的值)

【NLP】了解用于NLP的卷积神经网络(译)【NLP】了解用于NLP的卷积神经网络(译)

GIMP手册 有一些其他的例子。要更多地了解卷积如何工作,我还建议查看 Chris Olah 在该话题上的文章。

什么是卷积神经网络?


现在你知道什么是卷积。但是 CNNs 呢?CNNs 基本上只是几层具有非线性**函数的卷积, 如 ReLUtanh 应用于结果。在传统的前馈神经网络中,我们将每个输入神经元连接到下一层中的每个输出神经元。这也被称为完全连接层,或仿射层。在 CNNs 我们不这样做。相反,我们使用输入层上的卷积来计算输出。这导致了局部连接,其中输入的每个区域连接到输出中的神经元。 每层应用不同的过滤器,通常是数百或数千个,如上所示,并结合其结果。还有一些东西叫池化(subsampling)层,我会在稍后介绍。在训练阶段,CNNs 根据你想要执行的任务自动学习过滤器的值。例如,在图像分类中,CNNs 可以学习从第一层中的原始像素检测边缘,然后使用边缘检测第二层中的简单形状,然后使用这些形状来检测(原文deter不知道是不是typo)更高级的特征,例如面部形状在更高层。最后一层是使用这些高层特征的分类器。

【NLP】了解用于NLP的卷积神经网络(译)
卷积神经网络(Clarifai)

这个计算有两个方面值得关注:位置不变性和组合性。假设你想分辨一幅图像中是否有一头大象。因为你在整个图像上滑动你的过滤器,所以你并不在乎大象在哪里出现。在实践中, 池化还可以让你不受平移、旋转和缩放的影响,但是在后面更多。第二个关键方面是(局部)组合性。每个过滤器组成将较低级别特征的局部补丁转换为更高级的表示。这就是 CNNs 在计算机视觉领域如此强大的原因。从直观的角度来看,你可以从像素、边缘形状以及形状中更复杂的对象构建边缘。

那么,这些如何适用于 NLP 呢?

大多数 NLP 任务的输入不是图像像素,而是以矩阵表示的句子或文档。矩阵的每一行对应一个标记,通常是一个单词,但它也可以是一个字符。也就是说,每一行都是代表一个单词的向量。通常这些向量是像 word2vecGloVe 这样的词嵌入(低维表示),但是它们也可以是将单词索引到词汇表中的一个 one-hot 向量。对于使用 100 维嵌入的 10 个字的句子,我们将有一个 10×100 的矩阵作为我们的输入。这就是是我们的“图像”。

在计算机视觉上,我们的过滤器在图像的局部区域上滑动,但是在 NLP 中,我们通常使用滑过整行矩阵(单词)的过滤器。因此,我们的滤波器的“宽度”通常与输入矩阵的宽度相同。高度或区域大小可能会有所不同,通常使用一次滑动 2-5 个字的窗口。综合以上所述,一个用于 NLP 的卷积神经网络可能看起来像这样(花几分钟,试着理解这幅图,以及这些维是如何计算的,现在可以忽略池化,我们将在后面解释):

【NLP】了解用于NLP的卷积神经网络(译)

用于句子分类的卷积神经网络(CNN)体系结构图。 这里我们描述了三个过滤器的大小:2,3和4,每个大小都有2个过滤器。 每个过滤器对句子矩阵执行卷积并生成(可变长度)特征映射。 然后在每个特征图上执行1-max池化,即记录来自每个特征图的最大数。 因此,从六个特征图生成一元特征向量,并且这六个特征被连接以形成倒数第二层的特征向量。 最后的softmax层接收这个特征向量作为输入,并用它来分类句子;这里我们假设二进制分类,因此描述了两种可能的输出状态。 来源:Zhang, Y., & Wallace, B. (2015). A Sensitivity Analysis of (and Practitioners’ Guide to) Convolutional Neural Networks for Sentence Classification.

那么我们对于计算机视觉的直觉呢?位置不变性和局部合成对于图像来说是直观的,但对于 NLP 来说并不那么重要。你可能会在句子出现的地方做很多事情。彼此靠近的像素可能在语义上是相关的(同一对象的一部分),但对于单词而言,这并不总是对的。在很多语言中,部分短语可以被其他几个词分开。组合性方面也不明显。显然,在某些方面,词汇构成了一个名词形式的修饰形式,但是这个形式究竟是如何运作的,更高层次的表达实际上“意味着什么”并不像计算机视觉中的那样明显。

考虑到这一切,CNNs 似乎不太适合 NLP 任务。循环神经网络(Recurrent Neural Networks)更直观。它们类似于我们如何处理语言(或者至少我们如何认为我们处理语言):从左至右依次阅读。幸运的是,这并不意味着 CNNs 不起作用。所有模型都是错误的,但有些是有用的。事实证明,应用于 NLP 问题的 CNNs 表现相当不错。简单的词袋模型 是一个明显过分简化的假设,但却是多年来的标准方法,取得了相当不错的成绩。

CNN的一个重要论点是,它们很快。非常快。卷积是计算机图形的核心部分,并在 GPUs 上的硬件级别上实现。与 n-grams 相比,CNNs 在表达方面也是有效的。有了大量的词汇,计算超过 3-grams 的任何东西都可能很快变得昂贵。即使是 Google 也不提供超过 5-grams 的任何东西。卷积过滤器自动学习好的表征,而不需要表示整个词汇表。我认为,第一层中的许多学习过滤器捕获与 n-gram 非常相似(但不限于)的特征,但是以更紧凑的方式表示它们。

CNN 超参数


在解释如何将 CNNs 应用到 NLP 任务之前,让我们看看在构建 CNNs 时需要做的一些选择。希望这会帮助你更好地理解这个领域的文献。

窄卷积 vs. 宽卷积

当我解释上面的卷积时,忽略了如何应用过滤器的一些细节。在矩阵的中心应用一个 3×3 的过滤器可以正常工作,但是边缘怎么样?你将如何把过滤器应用到矩阵的第一个元素,它的顶部和左侧没有任何相邻的元素?你可以使用零填充。所有将落在矩阵之外的元素都取为零。通过这样做,您可以将过滤器应用于输入矩阵的每个元素,并获得更大或相同大小的输出。添加零填充也被称为宽卷积,而不使用零填充将是一个窄卷积。1D 中的一个例子如下所示:

【NLP】了解用于NLP的卷积神经网络(译)

窄与宽卷积。 来源:A Convolutional Neural Network for Modelling Sentences (2014)

你可以看到当你有一个相对于输入大小的大过滤器时,宽卷积是有用的,甚至是必要的。在上面,窄卷积产生尺寸输出为:(7-5)+ 1 = 3;宽卷积尺寸输出为:(7 + 2 * 4 - 5)+ 1 = 11。更一般地说,输出大小的公式是【NLP】了解用于NLP的卷积神经网络(译)

步长大小

卷积的另一个超参数是步长大小,定义你想在每一步移动你的过滤器的数量。在上面所有的例子中,步长大小都是 1,并且过滤器的连续应用是重叠的。较大的步长导致较少的过滤器应用和较小的输出尺寸。来自 Stanford cs231 website 的以下内容显示了 1 和 2 的步长大小适用于一维输入:

【NLP】了解用于NLP的卷积神经网络(译)

卷积步幅大小。 左:步幅 1;右:步幅 2。资料来源:http://cs231n.github.io/convolutional-networks/

在文献中,我们通常会看到步幅为 1,但更大的步幅可能允许您创建一个与递归神经网络有点相似的模型,即看起来像一棵树。

池化层

卷积神经网络的一个关键方面是池化层, 通常应用在卷积层之后。池化层对其输入进行子采样。最常用的方法是将 max 操作应用于每个过滤器的结果。你不一定需要把整个矩阵放在一起,你也可以把它放在一个窗口上。例如,以下显示了 2×2 窗口的最大池化(在 NLP 中,我们通常将整个输出应用于池化,每个过滤器只产生一个数字):

【NLP】了解用于NLP的卷积神经网络(译)

在CNN最大化池。资料来源:http://cs231n.github.io/convolutional-networks/#pool

为什么要池化?有几个原因。池化的一个特性是它提供了一个固定大小的输出矩阵,这通常是分类所必需的。例如,如果你有 1000 个过滤器,并且将最大池化应用于每个过滤器,则无论过滤器的大小或输入的大小如何,都将获得 1000 维输出。这使您可以使用可变大小的句子和可变大小的过滤器,但始终可以获得相同的输出大小以输入分类器。

池化也会降低输出的维度,但是(希望)会保留最显着的信息。你可以将每个过滤器都视为检测某个特定特征,例如检测句子是否包含“not amazing”等否定。如果这个短语出现在句子的某个地方,那么将过滤器应用到该区域的结果将会产生一个大的值,而在其他的区域中则会产生一个小的值。通过执行最大池化操作,你可以保存有关该特征是否出现在句子中的信息,但是你正在丢失关于它出现的位置的信息。但这不是关于地方的信息真的有用吗?是的,这和词袋 n-gram 模型有点相似。你正在失去关于地方的全局信息(在一个句子中发生了什么),但你保持由你的过滤器获取的局部信息,如”not amazing”是非常不同于”amazing not”的。

在想象认识中,池化还提供了平移(移位)和旋转的基本不变性。当你在一个区域上池化时,即使你将图像移位/旋转几个像素,输出也将保持大致相同,因为无论如何执行 max 操作都会选取相同的值。

通道

我们需要了解的最后一个概念是通道。通道是你的输入数据的不同的“视图”。例如,在图像识别中,通常有 RGB(红,绿,蓝)通道。你可以跨通道应用卷积,可以使用不同或相等的权重。在 NLP 中,你可以想象有不同的通道:你可以有不同的单词嵌入通道(例如 word2vec 和 GloVe),或者你可以为不同语言表达的同一句子建立一个通道,或者用不同的方式表达不同的通道。

卷积神经网络应用于 NLP


现在我们来看看 CNNs 在自然语言处理中的一些应用。我将尝试总结一些研究成果。我总是会错过许多有趣的应用程序(请在评论中告诉我),但我希望至少涵盖一些更受欢迎的结果。

对于 CNNs 来说,最自然的选择似乎是分类任务,如情感分析,垃圾邮件检测或主题分类。卷积和池化操作会丢失有关本地字词顺序的信息,因此像 PoS 标记或实体提取中的序列标记有点难以适应纯粹的 CNNs 体​​系结构(尽管不是不可能的,你可以向输入添加位置特征)。

[1]在各种分类数据集上评估 CNNs 体系结构,主要由情感分析和主题分类任务组成。CNNs 体系结构在数据集之间取得了非常好的性能,并且在一些数据集上还有最新的技术。令人惊讶的是,本文使用的网络非常简单,这就是它的强大之处。输入层是一个由连接的 word2vec 单词嵌入。接下来是一个带有多个过滤器的卷积层,然后是一个最大池化层,最后是一个 softmax 分类器。本文还以静态和动态词嵌入的形式对两个不同的通道进行了实验,其中一个通道在训练期间进行了调整,另一个则没有。文献[2]中曾经提出过一个类似但是比较复杂的结构。[6]添加一个额外的层,执行“语义聚类”到这个网络架构。

【NLP】了解用于NLP的卷积神经网络(译)

Kim,Y.(2014)。卷积神经网络用于句子分类

[4]从零开始训练 CNNs,而不需要像 word2vec 或 GloVe 这样的预先训练的词向量。它将卷积直接应用于一个 one-hot 向量。作者还为输入数据提出了一种节省空间的词袋表示法,减少了网络需要学习的参数数量。在[5]作者扩展模型与另外一个无监督的“区域嵌入”,这是通过使用 CNNs 预测文本区域的上下文来学习的。这些论文中的方法似乎对于长篇文本(如电影评论)来说效果不错,但是他们在短文本(比如推文)上的表现还不清楚。直观地说,对于短文本使用预先训练的单词嵌入会比使用长文本产生更大的收益。

构建一个 CNN 体系结构意味着有许多超参数可供选择,其中一些是我在上面介绍的:输入表示(word2vec,GloVe,one-hot),卷积过滤器的数量和大小,池化策略(最大值,平均值)和**函数(ReLU,tanh)。[7]对 CNN 体系结构中各种超参数的影响进行了实证评估,研究了它们在多次运行中对性能和方差的影响。如果你正在寻求实现你自己的 CNN 文本分类,以本文的结果为出发点将是一个很好的主意。一些突出的结果是,最大池化总是击败平均池化,理想的过滤器大小是重要的,但任务依赖,正则化似乎并没有在所考虑的 NLP 任务大大不同。

[8]探讨 CNNs 的关系提取和关系分类任务。除了单词向量之外,作者还使用词的相对位置作为卷积层的输入。这个模型假设实体的位置是给定的,并且每个示例输入包含一个关系。[9]和[10]探索了类似的模型。

另外一个有趣的使用情况是 NLP 中的 CNNs 可以在[11]和[12]中找到。这些论文描述了如何学习可用于信息检索的句子的语义上有意义的表示。论文中给出的例子包括根据用户正在阅读的内容向用户推荐可能感兴趣的文档。句子表示是根据搜索引擎日志数据进行训练的。

大多数 CNN 体系结构都以某种方式学习单词和句子的嵌入(低维表示)作为其训练过程的一部分。并不是所有的论文都把重点放在训练的这个方面,或者研究学习嵌入的意义。[13]提出了 CNN 架构来预测 Facebook 帖子的主题标签,同时为单词和句子生成有意义的嵌入。 然后将这些学习到的嵌入成功地应用于另一项任务 - 向用户推荐可能感兴趣的文档,并根据点击流数据进行培训。

字符级CNN

到目前为止,所有提供的模型都是基于单词的。但也有一些将 CNNs 直接应用于字符的研究。学习字符级别的嵌入,将它们与预先训练的单词嵌入相结合,并将 CNNs 用于词性标注。[15] [16]探索使用 CNNs 直接从字符学习,而不需要任何预先训练的嵌入。值得注意的是,作者使用了总共​​9层的相对较深的网络,并将其应用于情感分析和文本分类任务。结果显示,直接从字符级输入学习在大型数据集(数百万个示例)上工作得非常好,但是在较小的数据集(数十万个示例)上表现不佳。[17]探讨了字符级卷积在语言建模中的应用,在每个时间步使用字符级 CNNs 的输出作为 LSTM 的输入。相同的模型适用于各种语言。

令人惊奇的是,基本上所有的论文都是在过去的1 - 2年内发表的。很显然,在自然语言处理(几乎是从头开始)之前,与 CNNs 在 NLP 方面已经有了很好的合作,但是新出现的结果的速度和现有技术系统的发展速度正在加快。

问题或反馈?让我知道在评论中。谢谢阅读!

参考文献

  • [1] Kim, Y. (2014). Convolutional Neural Networks for Sentence Classification. Proceedings of the 2014 Conference on Empirical Methods in Natural Language Processing (EMNLP 2014), 1746–1751.
  • [2] Kalchbrenner, N., Grefenstette, E., & Blunsom, P. (2014). A Convolutional Neural Network for Modelling Sentences. Acl, 655–665.
  • [3] Santos, C. N. dos, & Gatti, M. (2014). Deep Convolutional Neural Networks for Sentiment Analysis of Short Texts. In COLING-2014 (pp. 69–78).
  • [4] Johnson, R., & Zhang, T. (2015). Effective Use of Word Order for Text Categorization with Convolutional Neural Networks. To Appear: NAACL-2015, (2011).
  • [5] Johnson, R., & Zhang, T. (2015). Semi-supervised Convolutional Neural Networks for Text Categorization via Region Embedding.
  • [6] Wang, P., Xu, J., Xu, B., Liu, C., Zhang, H., Wang, F., & Hao, H. (2015). Semantic Clustering and Convolutional Neural Network for Short Text Categorization. Proceedings ACL 2015, 352–357.
  • [7] Zhang, Y., & Wallace, B. (2015). A Sensitivity Analysis of (and Practitioners’ Guide to) Convolutional Neural Networks for Sentence Classification,
  • [8] Nguyen, T. H., & Grishman, R. (2015). Relation Extraction: Perspective from Convolutional Neural Networks. Workshop on Vector Modeling for NLP, 39–48.
  • [9] Sun, Y., Lin, L., Tang, D., Yang, N., Ji, Z., & Wang, X. (2015). Modeling Mention , Context and Entity with Neural Networks for Entity Disambiguation, (Ijcai), 1333–1339.
  • [10] Zeng, D., Liu, K., Lai, S., Zhou, G., & Zhao, J. (2014). Relation Classification via Convolutional Deep Neural Network. Coling, (2011), 2335–2344.
  • [11] Gao, J., Pantel, P., Gamon, M., He, X., & Deng, L. (2014). Modeling Interestingness with Deep Neural Networks.
  • [12] Shen, Y., He, X., Gao, J., Deng, L., & Mesnil, G. (2014). A Latent Semantic Model with Convolutional-Pooling Structure for Information Retrieval. Proceedings of the 23rd ACM International Conference on Conference on Information and Knowledge Management – CIKM ’14, 101–110.
  • [13] Weston, J., & Adams, K. (2014). # T AG S PACE : Semantic Embeddings from Hashtags, 1822–1827.
  • [14] Santos, C., & Zadrozny, B. (2014). Learning Character-level Representations for Part-of-Speech Tagging. Proceedings of the 31st International Conference on Machine Learning, ICML-14(2011), 1818–1826.
  • [15] Zhang, X., Zhao, J., & LeCun, Y. (2015). Character-level Convolutional Networks for Text Classification, 1–9.
  • [16] Zhang, X., & LeCun, Y. (2015). Text Understanding from Scratch. arXiv E-Prints, 3, 011102.
  • [17] Kim, Y., Jernite, Y., Sontag, D., & Rush, A. M. (2015). Character-Aware Neural Language Models.

分类:

技术点:

相关文章: