理解自然语言处理中的卷积神经网络

 原文链接:Understanding Convolutional Neural Networks for NLP

当我们听到卷积神经网络时,我们通常会想到计算机视觉。卷积神经网络(CNN)在图形分类的进步中起着主要的作用,也是现在大多数计算机视觉系统的核心,它也运用于facebook的自动驾驶汽车上的自动图片标记模块。

最近我们已经开始使用CNN(卷积神经网络)解决NLP(自然语言处理)上的问题并且得到了一些有意思的结果。本文中我会尝试描述什么是CNN (卷积神经网络)以及它是怎么运用在NLP (自然语言处理)当中的。从计算机视觉的运用示例当中理解卷积神经网络(CNN)会更简单而且更直观,所以我会从计算机视觉开始讲解,然后慢慢过渡到自然语言处理(NLP)

什么是卷积?

对我来说最简单的理解卷积的方式是将它理解为一个矩阵当中滑动的窗口。这可能有点拗口,但当它以图片的形式展示时会变得非常清晰。



3×3的卷积窗口。源自:

http://deeplearning.stanford.edu/wiki/index.php/Feature_extraction_using_convolution

 

想象左边的矩阵代表了一张黑白图片。每一个方框对应了一个像素,0代表黑色,1代表白色(对于彩色图片来说数字通常会从0-255)。这个滑动的窗口通常被称为一个核心,过滤器,或者说特征检测器。这里我们使用了一个3×3的窗口从原始的矩阵当中获取多个元素,然后将他们加起来。为了获得全部的卷积我们通过在整个矩阵当中滑动这个窗口来对每一个元素这么做。

你也许想要知道你通过做这个实际上可以做什么。这里是一些直观的例子。

将每一个像素旁边的值进行平衡来模糊一张图片:

 

  

 获取一个像素和它的相邻边的像素的差异:

(想要直观的理解这个,思考在这个光滑的一个像素的颜色与它相邻的元素相同的图像上的一部分发生了什么:将额外的信息剔除并且将结果值变为0,或者说是黑色。如果有一个尖锐的边,比如说从白色到黑色,你就获得了一个巨大的差异并将结果值设置为白色)

 

GIMP有一些其他的例子。为了更多的理解卷积是如何工作的,我同样推荐此话题下Chris Olah’s的文章。

什么是卷积神经网络?

现在你知道卷积是什么了。但是什么是CNNs(卷积神经网络)?卷积神经网络是基于非线性的活动功能(像是ReLUtanh)的几层卷积。在一个传统的前馈神经网络当中,我们将每一层的输入神经元连接到输出神经元。那也被称作全连接层或是仿射变换层。在卷积神经网络(CNNs)中,我们不那么做。我们通过卷积输入层来计算的到输出。这会在本地连接中得到结果,每一层输入层都会连接到输出的神经元。每一层提供了不同的过滤器,通常会有成百上千个那样的过滤器展示出来,并且整合了它们的结果。也有一些被称为采样层的东西,但是我会晚点再介绍。在训练阶段,一个卷积神经网络(CNN)会基于你想要实现的任务对过滤器的值进行自学习。比如说,在图像分类中,一个卷积神经网络(CNN)也许在第一层会学习将横向的像素边连接起来,然后在第二层使用这些边来连接一个简单的形状。然后最后的一层就是一个使用高级特性的分类器了。




在计算当中有两方面值得关注的地方:位置的不变性和组合性。让我们假设你想要区分一个图片中是否有一只大象。因为你会在整张图片上滑动你的过滤器,所以你并不在乎大象出现在哪里。在训练当中,池塘也给了你在平移、旋转和缩放当中的不变性,而且不仅仅是这些。第二个关键的方面是组合性。每个过滤器都把本地的一系列低级特性组合成了高级表现形式。这就是卷积神经网络在计算机视觉当中如此给力的原因。它给了你很直观的感觉,把像素构造成边,把边构造成面,并且把面构造成更多的复杂的物体。

 

所以,应该如何把这个运用到自然语言处理(NLP)上呢?

与图片像素不同,绝大多数自然语言处理(NLP)的任务的输入是表示为矩阵的句子或者是段落。矩阵的每一行对应着一个记号,通常是一个单词,但是也可以是一个字母。也就是说,每一行都是代表了一个单词的向量。通常来说,这些向量都是词语植入(低维代表),比如word2vecGloVe,但是他们也可以成为一个将单词索引到词典的独热向量。对于一个十个单词的句子,我们使用一个一百维的植入,可以有一个10×100的矩阵作为我们的输入。那就是我们的“图片”。

 

在视觉当中,我们的过滤器在图片的块上滑动,但是在自然语言处理(NLP)中我们通常使用过滤器来滑过矩阵(单词集)的整行。因此我们的过滤器的“宽度”通常和输入矩阵的宽相等。高度或者说范围大小也许会不一样,但是滑动窗口大小通常在2-5个单词之间。综上所述,一个自然语言处理(NLP)上的卷积神经网络可能看起来会像这样(花上几分钟来尝试着理解这张图和维度是如何计算的。你可以先忽视存储层,我们会在稍后解释它)



一个对于卷积神经网络(CNN)在语句分类上的结构例图。这里我们提供了三个过滤器范围尺寸:2,3和4,它们每个都包含两个过滤器。每个过滤器在句子矩阵上进行卷积并且得到(多种长度)特征映射。然后一个最大的存储展现在了每一个映射之上,比如说,每一个特征映射上最大的数字被记录了下来,并且这6个特征在倒数第二层被一个特性向量联系起来。最后的softmax层接着接收到了这个特征向量作为输入并且用它来分类句子;这里我们采取了二元分类并且明确的提供了两种可能的输出状态。摘自:Zhang, Y., &Wallace, B. (2015). A Sensitivity Analysis of (and Practitioners’Guide to) Convolutional Neural Networks for Sentence Classification

那么为什么我们在计算机视觉上拥有的极棒的感觉?位置的不变性和本地的组合性为图片带来了直观的感觉,但是在自然语言处理(NLP)上并没有。你可能真的很关注一个词语在句子的什么地方出现了。相邻的像素们很容易产生联系(一部分是完全相同的),但是对于单词来说却不总是这样的。在很多语言当中,部分短语可以被几个其他的单词分开。组合性也不是明确的。明确的说,单词以一些方式组合起来,像是一个形容词修饰了一个名词,但是它在一个更高级的表达形式下实际上表达了什么意思并没有像是在计算机视觉的情形下那么明确。

说了那么多,感觉起来好像卷积神经网络(CNNs)并不适合在自然语言处理(NLP)任务上使用。循环神经网络带来了更直观的感受。它们和我们加工语言的方式相似(或者至少和我们思考语言的方式相似):按照顺序从左到右读取。幸运地,这并不是意味着卷积神经网络(CNN)不会生效。所有的模型都是错误的,但是一些很有用。实际上卷积神经网络在处理自然语言处理(NLP)问题上表现得非常好。这个简单的词袋模型在不正确的假设中显然过于简单了,但是它在多年的研究过程中也带来了相当不错的结果。

 

关于卷积神经网络(CNNs)的一个很大的争论在于它们是否很快。答案是肯定的。卷积是计算机图形的核心部分,而且是在显卡(GPU)上的硬件级实现。和其他的算法(比如n-gram)相比较,卷积神经网络(CNNs)的表现也十分的高效。在计算一个很大的词典的时候,计算任何一个大于3-gram的目标时计算量可以急剧上升。甚至Google都不支持超过5-gram的计算。卷积过滤器自动地学到了良好的表现形式,在不需要展示整个词典的前提下。有一个大小大于5的过滤器是完全合理的。我认为很多学习后的过滤器在第一层的捕获特征和n-gram非常类似(但不仅仅是),但是用一个更加紧密的方式表现了出来。

CNN(卷积神经网络)的高级参数

在解释CNNs(卷积神经网络)怎么在NLP(自然语言处理)任务上工作之前,让我们看看你需要在构造CNN(卷积神经网络)之前所做的选择。希望这可以帮助你更好的理解这个领域当中的文章。

窄卷积与宽卷积

之前解释卷积的时候我忽略了一些关于怎么产生过滤器的细节。在矩阵的中心产生一个3×3的过滤器效果很好,但是如果在边缘产生呢?你会在什么情况下把你的过滤器放到一个和顶部的元素以及顶部的元素完全不相邻的矩阵的第一个元素上?你可以使用零边距。所有可能掉到矩阵外的元素都被置为0。添加零边距在卷积当中也是被广泛运用的,并且不使用零边距就会是一个窄卷积。一个一维的例子看起来像是这样:



宽窄卷积。过滤器大小为5,输入大小为7。摘自:A Convolutional NeuralNetwork for Modelling Sentences (2014)---对于模型句子的一个卷积神经网络。你可以看到当你有一个和输入大小相关的巨大过滤器时卷积神经网络的运用是多么的广泛,甚至说是必要。在上图当中,窄卷积得到了一个大小为(7-5)+1=3
的输出,并且一个宽卷积得到了一个大小为(7+2*4-5)+1=11
的输出。总的来说,输出大小的公式为:

跨度大小

另一个卷积当中的核心属性是跨度大小,由你每次移动你的过滤器的距离来定义。在上述所有例子中跨度的大小都是1,并且过滤器的连续应用是重叠的。一个更大的跨度会导致更少的过滤器的应用以及一个更小的输出大小。来自斯坦福cs231的网页的下图展示了跨度1与跨度2在一维输入时的状态:



卷积跨度。左:跨度1。右:跨度2。摘自:

http://cs231n.github.io/convolutional-networks/

 

在著作中我们经常看到跨度为1的情况,但是一个大一点的跨度也许会允许你构造一个表现得和循环神经网络相似的模型,比如说看起来像一棵树。

存储层

卷积神经网络的一个关键点是存储层,通常产生于卷积层之后。存储层将特们的输入划分开。将它们放到存储层的最通常的方式是提供一个名为max的函数来计算每一个过滤器的结果。你不必存储下完整的矩阵,你可以只存下一个窗户。举个例子,下图展示了一个2×2的窗口的最大存储器(在NLP(自然语言处理)当中我们通常会存储完整的输出,而每一个过滤器只产生一个简单的数字):

 

CNN当中的最大存储。摘自:

http://cs231n.github.io/convolutional-networks/#pool

 

为什么要有存储层?这里有一些原因。一个可能性是它提供了一个多种大小的输出矩阵,这通常被用来进行分类。举个例子,如果你有1000个过滤器并且你给每个都提供了最大存储器,你会得到一个1000维的输出,忽略了你的过滤器的大小以及你的输入的大小。这允许你使用不同长度的句子,以及不同大小的过滤器,但却总能得到同样的输出维度来供给一个分类器。

存储层同样也降低了输出层的维度并且保留了最为主要的信息。你可以认为每一个过滤器可以连接到一个特定的特征,比如说连接到一个包含了”not amazing”的短语的句子。如果这个短语在句子当中出现了,该域的过滤器的结果会是一个很大的值,而其他的域当中就会是一个小值。通过取得最大值你保留了所关注的特征是否出现在句子中这个信息,但是你却丢掉了它出现的准确位置信息。但是难道它出现的位置就真的没有用吗?是的,没错,而且这就和一系列的n-grams模型所做的一样。你正在丢失所有的关于位置的信息(该信息在句子中所出现的位置),但是你保留了你通过你的过滤器所筛选的信息,像是”not amazing”就和”amazing not”差别巨大。

在图像识别当中,存储池也提供了用以平移与旋转的基础不变性。当你在存储一个域的时候,即使你将图片平移或者旋转了一些像素,输出也会保持大约一致,因为max运算符会筛选出相同的值来忽视掉。

属性值

我们需要理解的最后一点就是属性值。属性值与你的输入数据有不同的表现形式。举个例子,在图片识别中你通常有RGB(red,green绿,blue)属性值。你可以以相同或者不同的权重来将属性值进行卷积。在NLP(自然语言处理)当中你可以想象有着如下的属性值:你可以拥有一个对于不同的词语而区分的属性值(比如word2vecGloVe),或者你可以有一个针对于句子相同的属性值,不管它是在不同的语言中或者以不同的语法构成。

卷积神经网络运用到自然语言处理(NLP)

现在让我们看一些卷积神经网络在自然语言处理上的运用。我会尝试着总结一些研究结果。我依然会忽略掉许多有趣的应用(请在评论当中让我知道),但是我希望能够至少覆盖到一些更热门的结果。

CNNs(卷积神经网络)最适合的地方看起来是分类任务,比如情感分析,垃圾邮件检测以及主题分类。卷积和存储操作丢掉了词语的顺序信息,所以序列化的标记像是词性标注和实体抽取在纯粹的CNN(卷积神经网络)当中会变得有一点困难(虽然不可能,但是你可以在输入数据当中加入位置特征)

[1]在不同的分类数据集当中求得一个CNN(卷积神经网络)结构的值,主要是由情感分析和主题分类任务组成的。CNN(卷积神经网络)结构在数据集当中实现了非常好的表现,并且有一些新的艺术般的结果。令人惊喜的,这篇文章当中用到的网络相当的简单,并且这才是它强大的原因。输入层是一个由word2vec获取的单词所联系起来的句子。接下来是一个由多个过滤器组成的卷积层,然后是最大存储层,然后最后是一个softmax分类器。本文章也同时体验了在静态词语和动态词语下的两种不同属性值,一种属性值是在训练当中调整的而另一种不是。一个相似的但是更加复杂的结构在[2]当中被推荐。[6]加入了一个额外的层来将“情感聚类”表现到这个网络结构当中。

 

Kim, Y. (2014).语句分类器当中的卷积神经网络

[4]scratch当中训练一个CNN(卷积神经网络),并不需要像word2vec或者GloVe那样进行单词向量的预处理。它支持对独热向量直接卷积。作者同样也提出了一个空间高效的“相似词包”模型来代表输入数据,降低了网络需要学习的参数数量。在[5]当中作者继承了一个额外的通过CNN(卷积神经网络)学习的非监督域植入模型来预测文本域的上下文。这些文章当中的方法看起来在长文章(比如影评)中效果很好,但是在短文本(像是推特)当中的表现就不太清晰。直观的,使用经过预训练的单词映射集在短文本上会比在长文本上产生更多的收获。

构造一个CNN(卷积神经网络)结构意味着会有很多核心属性进行挑选,一些我在上面提到的:输入代表(word2vecGloVe,独热),卷积过滤器的数量和大小,存储池的策略(最大,平均),以及活动功能(ReLUtanh)[7]表现出了一个在CNN结构上如何挑选核心属性的有经验的方式,研究它们在表现上的影响和在多种运行方式上的区别。如果你想要在文本分类上实现你自己的CNN,使用这篇文章上的结果作为起始点会是一个极棒的主意。一些被提出的结果是最大存储器总是打败了平均存储器,合理的过滤器大小是重要的但是一定要基于任务,并且正则化并没有像预想的那样在NLP(自然语言处理)任务上起到重大的改变。这项研究的一个警告是,所有的数据集在文档长度上都非常相似,因此相同的指导方针可能不适用于看起来非常不同的数据。

[8]探讨了CNNs在关系抽取和关系分类任务上的运用。对于词向量,作者使用了词语位置对于兴趣实体的相关性作为卷积层的输入。这个模型预测了所给出的实体的位置,以及每一个输入的例子都包含一个关系。[9][10]探讨了相似的模型。

CNNsNLP上的另外一个有趣的使用方式可以在[11][12]上被找到,由微软研究室提出。这些文章介绍了怎么学习句子中有意义的情感表现,这能被用来做信息检索。文章中给出的例子包含了基于使用者最近所读的文档来记录它们可能感兴趣的部分。这些句子的展示是基于搜索引擎的日志数据。

多数的CNN结构以一种方式或者其他方式作为它们的训练程序的一部分来学习单词和句子的降维(低维展现形式)。也并不是所有的文章都聚焦于在训练或研究中学习降维有多么的有意义。[13]表现了一个CNN结构来预测Facebook文章的哈希标签,并同时总结对于单词和句子有意义的降维。这些学习后的降维也可以成功的运用于其他任务-基于点击流数据来进行训练从而记录用户可能感兴趣的文档。

 

字母级的CNNs

说了那么多,所有的模型都是基于单词进行表现的。但是也有对于将CNNs运用到字母的研究。[14]学习了字母级的降维,带着预训练的单词映射表加入它们,并且使用CNN来作为演讲标签中的部分。[15][16]研究了CNNs从字母当中直接学习的方法,并不需要经过预训练的映射集。显著的,作者运用了一个总共9层的关联型的深度网络,并且将其运用到了情感分析和文本分类的任务上。结果展示了基于大量的数据集(上百万的实例)来直接从字母级的输入来学习的效果非常好,但是在少量数据集(几百几千的实例)时表现就不如更简单的模型。[17]探讨了字母级的卷积在语言模型上的运用,使用字母级的CNN的输出来作为一个LSTM的每一步的输入。这个相同的模型被运用于多种语言。

令人惊喜的是以上这些所有的高效有用的文章都是在过去的一两年内发布的,显然它们之前就已经使用CNNNLP上工作得非常好了,正如ScratchNLP上的运用,不仅如此,新的研究成果和高级的系统还在不断的出现。



  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值