宽、窄卷积神经网络
当我在上文中解释卷积的时候,我忽略了一点运用过滤器的小细节。我们在一个矩阵的中心有3×3的过滤器工作得很棒,但是它在边界的表现如何呢?你应该如何应用这个过滤器于矩阵的第一个元素(没有任何相邻的上方元素和左边元素)? 你可以用0来填充边界。所有超过矩阵边界的元素都当做0来处理。这么做之后呢,你就可以将过滤器用于矩阵中的每一个元素,并且获得更大的等大小的输出。使用0填充的(zero-padding)也称为宽卷积(wide convolution),不用0填充称为窄神经网络。下面是一个例子。

步长(Stride size)
另一个卷积的超参是步长,也就是每一步你想移动你的过滤器多少距离。上述的所有的例子,步长均为1。对连续应用过滤器采样子矩阵,就会导致采样信息的重叠。一个更大的步长意味着更少地使用过滤器和更小的输出。下面的例子来自于the Stanford cs231 website 展示了步长为1和步长为2运用于一维输入的情况:

Convolution Stride Size.
Left: Stride size 1. Right: Stride size 2. Source:
在文献中我们通常看到的都是步长大小为1的情景,但是较大的步幅让你建立一个处理过程类似RNN的模型,就像树型结构。
池层(POOLING LAYERS)
卷积神经网络的另一个关键在于Pooling layers,它通常在卷积层后面使用。Pooling layers用于下采样上一层的输入。最简单也是最常见的做法是,取每个过滤器中的最大值为输出。你不必对一个完整的矩阵都做pooling操作,你可以对一个小窗口做pooling。如下图,展示一个在2×2窗口的max pooling操作(在NLP问题中,我们通常要对整个输入进行pooling操作,产生每个过滤器产生一个单独的数字输出):

Max pooling in CNN. Source:
为什么要进行Pooling操作呢?有以下这么几个原因。
Pooling操作的一个优势在于它能够产生一个固定大小的输出矩阵。这个矩阵通常被用于分类。例如,如果你有1000个过滤器并且你对每一个过滤器都进行了Max Pooling操作,那么你就得到了1000维的输出。不管你过滤器的大小,也不管你输入的大小,你的输出大小就是固定的。这样你就可以用各种各样长度的句子和各种各样大小的过滤器,但是总会得到相同的输出维度,从而进行分类。
Pooling的使用也可以减少输出的维度,同时(我们希望这样)保存最显著的信息。你可以想象一下,每个过滤器能够识别出一种特征,例如,识别出这个句子有没有含有一个类似”not amazing”的否定词。如果句子中的某个地方出现了这个词组,那么扫描采样这一块的过滤器就会产生一个大的数值,在别的区域产生一个小的值。这样做之后呢,你就能够保持那些关于某些特征有没有出现在句子中的信息,而损失了这个特征究竟出现在句子的哪个位置的信息。但是,损失的这个信息并没有什么用途吧?对啊,这是有一点像a bag of n-grams model所做的那样。你损失了关于定位的全局信息(某些东西出现在句子中的某些地方),但是你保留下来了被你的过滤器采样到的局部信息,就像”not amazing”与”amazing not”非常不同一样。(这就是我上文说的一个有疑问的说法)
在图像识别中,Pooling也可以提供基础的平移、旋转不变性。当你对于某个区域进行Pooling操作的时候,结果通常来说会保持一致,无论你是旋转还是平移你图像的像素,因为Max Pooling会最终识别出同样的数值。
通道(CHANNELS)
我们需要理解的最后一个理论是通道。通道是输入数据的一种不同的‘样子’。例如,在图像识别中,我们一般使用的是RGB(red, green, blue) 通道。在通道里应用卷积的时候,你可以采用不同的或者相同的权值。在NLP问题中,你可以想到通道的种类是非常多的:用不同的word embeddings(word2vec and GloVe for example)来区分通道,或者,你可以为不同的语言表达的同样意思的句子、单词设计一个通道。
用于NLP的CNN
现在让我们看看一些CNN在自然语言处理中的应用。我会尝试总结一些研究成果与结论。总之,我会漏了描述很多有趣的应用(请在评论中告诉我),但我希望至少覆盖一些比较流行的结果。
CNN天生就适合用于分类任务,例如情感分析,垃圾邮件检测或主题分类。卷积和池操作会丢失单词的局部顺序,所以呢,句子标记,例如词性标注或实体提取,是有点难以适应纯CNN架构(也不是不可能,你可以添加位置特征的输入)。
[1] 评估一个CNN结构在各种分类数据集中的表现,主要包括情感分析和主题分类的任务。 CNN结构跨数据集的问题上有着非常不错的表现,同时最新的技术也使得它在小数据上表现优异。 出人意料的是,论文中使用的网络是非常简单的,这就是为什么它非常的有效。输入层是一个由连续的word2vec word embeddings组成的句子。在卷积层的后面跟着多个过滤器,然后是一个max-pooling layer,最后是一个softmax分类器。该论文也对两个不同的通道做实验,通道是以静态和动态word embeddings形式的,并且其中一个能够在训练中被调整,一个不能被调整。一个相似的但是更加复杂的结构在[2]中被提出。[6] 加入了一个新增的层用于在网络结构中进行“语义聚合”(semantic clustering) 。

[4]从头训练一个CNN,不需要pre-trained word向量,例如word2vec或者GloVe。它直接将卷积用于one-hot向量。作者还提出了一种空间节约的bag-of-words似的输入数据表示方法 ,减少了网络需要训练的参数个数。在[5]中,作者用一个二外的无监督“region embedding”扩展了这个模型,该扩展是学习用CNN来预测文本区域的内容。这些论文中使用的方法似乎在长文本(例如,电影评论)的处理中做得不错,但是他们在短文本(例如,微博)中的处理效果还不得而知。直观地来看,这确实很有道理。对短文本使用pre-trained word embeddings将会产生更大的收益,相比将它们用于处理长文本。
建立一个CNN解耦狗意味着许多超参可供选择,就像我上文提到的那样:输入表示法(word2vec, GloVe, one-hot),卷积过滤器的数量和大小,池操作的策略(max, average),以及激活函数(ReLU, tanh)。[7]通过调整CNN结构的超参,多次运行程序,研究、分析其的性能和方差,从而得出验证性的评价。如果你想要将你的CNN用于文本分类,用这篇论文的结论作为基础起始点是再好不过的了。一些脱颖而出的结论是,max-pooling的效果总是好于average_pooling;一个理想状况下的过滤器大小是很重要的,但是大部分还是依具体情况而定;正则化与否在NLP问题中似乎没有多大影响。这项研究的需要注意的是,在文件长度方面,所有的数据集都颇为相似。所以呢,同样的准则看清了并不适用于那些看起来相当不同的数据。
[8]研究了CNN对关系抽取和关系分类的应用。除了单词向量,作者用了单词与关注的实体(译者:attention mechanism里的概念)之间的相对位置作为卷积层的另一个输入。这个模型假定实体的位置已经被给定,并且各实例的输入包含一个上述的关系。[9]和[10]也研究的是同样的模型。
在微软的[11]和[12]研究中,能够发现一个CNN在NLP中有趣的应用。这些论文描述的是如果得知那些可以被用于信息检索的句子的语义上有意义的表示方法。论文中的例子包括,根据读者现在阅读的文章,推荐出读者可能感兴趣的文章。句子的表示方法是用基于搜索引擎的日志数据来进行训练的。
大多数的CNN结构以用这种或者那种方式从embeddings (低维表示法) 中学习作为它们训练过程的一部分。并非所有的论文都关注于如果训练或者研究分析learned embeddings意义何在。[13]展示了一个CNN结构。这个结构用于预测Facebook的位置标签,同时,产生有意义的单词和句子的embeddings。这些learned embeddings随后被成功地用于其他的问题: 以点击流数据作为训练集,将用户可能产生潜在兴趣的文章推荐给用户。
字符级CNN(CHARACTER-LEVEL CNNS)
这个专业名词翻译是我自己猜的,也可能是汉字、个性之类的。
目前为止,所有模型的表示方法都是基于单词的。但是也有将CNN应用于字符的研究。 [14] 研究了character-level embeddings,将它们和pre-trained word embeddings结合在一起,并且将CNN用于词性标注 (Part of Speech tagging). [15][16] 研究了直接用CNN从字符中进行训练,不需要接住任何的pre-trained embeddings。值得注意的是,作者用了一个共9层的深度神经网络,并将其用于情感分析和文本分类的作用。结果表明,在大数据的情况下,直接从字符级输入的学习效果非常好(百万级的例子),但是在较小的数据集上面表现得比较差(百条、千条例子)。 [17] 研究了字符级CNN在语言模型(Language Modeling)上面的应用,用字符级CNN的输出作为LSTM(长期短期记忆单元)的输入。同样的模型可以用于多个语言。
最让人惊奇的是上面所说的所以论文都是在最近的1-2年内发表的。非常明显的,CNN在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.
电子发烧友App









评论