卷积神经网络 paddingzeropadding可以为负吗

卷积神经网络 - Stinky tofu - 推酷
卷积神经网络 - Stinky tofu
在上篇中介绍的输入层与隐含层的连接称为全连接,如果输入数据是小块图像,比如8&8,那这种方法是可行的,但是如果输入图像是96&96,假设隐含层神经元100个,那么就有一百万个(96&96&100)参数需要学习,向前或向后传播计算时计算时间也会慢很多。
解决这类问题的一种简单方法是对隐含单元和输入单元间的连接加以限制:每个隐含单元仅仅只能连接输入单元的一部分。例如,每个隐含单元仅仅连接输入图像的一小片相邻区域。这也是卷积神经网络的基本思想,它是一种特殊的MLP,这个概念是从生物里面演化过来的. 根据Hubel和Wiesel早期在猫的视觉皮层上的工作, 我们知道在视觉皮层上面存在一种细胞的复杂分布,这些细胞对一些局部输入是很敏感的,它们被成为感知野, 并通过这种特殊的组合方式来覆盖整个视野. 这些过滤器对输入空间是局部敏感的,因此能够更好得发觉自然图像中不同物体的空间相关性。
对一副图片的局部特性的提取在整个视野上是可重复的,比如我们在96&96图像中选取8&8作为样本,在样本上学习到的特征应用到整幅图像上,即利用8&8中学习到的特征在96&96图像上做卷积,从而获得不同的特征值,所需要学习的参数也从96&96降到了8&8,这样成为一个特征图。我们需要从一副图像上学习的特征肯定不止一种,所以需要建立n个特征图来学习不同的特征。即使是这样,算法的复杂度也比之前全连接的方法大大的降低了。
上图即一个特征图的三个隐藏神经元对m-1层输入做卷积,其中共享三个w参数。
卷积神经网络的另外一个步骤是池化(pooling),它把输入图像分割成不重叠的矩形,对于每个矩形取最大值(max pooling),另外一种池化方法叫做(mean pooling),它对每个矩形取平均值。
池化的优势是(1)它降低了上层的计算复杂度 (2)它提供了一种变换不变量的。对于第二种益处,我们可以假设把一个池化层和一个卷积层组合起来,对于单个像素,输入图像可以有8个方向的变换。如果共有最大层在2*2的窗口上面实现,这8个可能的配置中,有3个可以准确的产生和卷积层相同的结果。如果窗口变成3*3,则产生精确结果的概率变成5/8.可见,池化对位置信息提供了附加的鲁棒性,它以一种非常聪明的方式减少了中间表示的维度。下图就是简单的池化过程,右侧矩阵的每个值是左侧每个红色矩阵中元素的最大值(或平均值)。
下图是卷积层和池化层的结合,相同颜色的神经元共享权重。
卷积神经网络的训练过程与全联通神经网络类似,首先随机初始化参数,再利用向后传导算法来训练参数。CNN反向传播求导时的具体过程可以参考论文Notes on Convolutional Neural Networks, Jake Bouvrie,该论文讲得很全面。
下面是tornadomeet的博客中对CNN反向传播过程的介绍,很通俗易懂。
问题二:当接在卷积层的下一层为 pooling 层时,求卷积层的误差敏感项。
假设第 l( 小写的 l ,不要看成数字 '1' 了 ) 层为卷积层,第 l+1 层为 pooling 层,且 pooling 层的误差敏感项为:
卷积层的误差敏感项为:
& , 则两者的关系表达式为:
这里符号 ● 表示的是矩阵的点积操作,即对应元素的乘积。卷积层和 unsample() 后的 pooling 层节点是一一对应的,所以下标都是用 j
表示。后面的符号
表示的是第
l 层第 j 个节点处激发函数的导数 ( 对节点输入的导数 ) 。
其中的函数 unsample() 为上采样过程,其具体的操作得看是采用的什么 pooling 方法了。但 unsample 的大概思想为: pooling 层的每个节点是由卷积层中多个节点 ( 一般为一个矩形区域 ) 共同计算得到,所以 pooling 层每个节点的误差敏感值也是由卷积层中多个节点的误差敏感值共同产生的,只需满足两层见各自的误差敏感值相等,下面以 mean-pooling 和 max-pooling 为例来说明。
假设卷积层的矩形大小为 4&4, pooling 区域大小为 2&2, 很容易知道 pooling 后得到的矩形大小也为 2*2 (本文默认 pooling 过程是没有重叠的,卷积过程是每次移动一个像素,即是有重叠的,后续不再声明) , 如果此时 pooling 后的矩形误差敏感值如下:
则按照 mean-pooling ,首先得到的卷积层应该是 4&4 大小,其值分布为 ( 等值复制 ) :
因为得满足反向传播时各层见误差敏感总和不变,所以卷积层对应每个值需要平摊(除以 pooling 区域大小即可,这里 pooling 层大小为 2&2=4) ),最后的卷积层值
mean-pooling 时的 unsample 操作可以使用 matalb 中的函数 kron() 来实现,因为是采用的矩阵 Kronecker 乘积。 C=kron(A, B) 表示的是矩阵 B 分别与矩阵 A 中每个元素相乘,然后将相乘的结果放在 C 中对应的位置。比如:
如果是 max-pooling ,则需要记录前向传播过程中 pooling 区域中最大值的位置,这里假设 pooling 层值 1,3,2,4 对应的 pooling 区域位置分别为右下、右上、左上、左下。则此时对应卷积层误差敏感值分布为:
当然了,上面 2 种结果还需要点乘卷积层激发函数对应位置的导数值了,这里省略掉。
问题三:当接在
层的下一层为卷积层时,求该 pooling 层的误差敏感项。
假设第 l 层 (pooling 层 ) 有 N 个通道,即有 N 张特征图,第 l+1 层 ( 卷积层 ) 有 M 个特征, l 层中每个通道图都对应有自己的误差敏感值,其计算依据为第 l+1 层所有特征核的贡献之和。下面是第 l+1 层中第 j 个核对第 l 层第 i 个通道的误差敏感值计算方法:
符号 ★ 表示的是矩阵的卷积操作,这是真正意义上的离散卷积,不同于卷积层前向传播时的相关操作,因为严格意义上来讲,卷积神经网络中的卷积操作本质是一个相关操作,并不是卷积操作,只不过它可以用卷积的方法去实现才这样叫。而求第 i 个通道的误差敏感项时需要将 l+1 层的所有核都计算一遍,然后求和。另外因为这里默认 pooling 层是线性激发函数,所以后面没有乘相应节点的导数。
举个简单的例子,假设拿出第 l 层某个通道图,大小为 3&3 ,第 l+1 层有 2 个特征核,核大小为 2&2 ,则在前向传播卷积时第 l+1 层会有 2 个大小为 2&2 的卷积图。如果 2 个特征核分别为:
反向传播求误差敏感项时,假设已经知道第 l+1 层 2 个卷积图的误差敏感值:
离散卷积函数 conv2() 的实现相关子操作时需先将核旋转 180 度 ( 即左右翻转后上下翻转 ) ,但这里实现的是严格意义上的卷积,所以在用 conv2() 时,对应的参数核不需要翻转(在有些 toolbox 里面,求这个问题时用了旋转,那是因为它们已经把所有的卷积核都旋转过,这样在前向传播时的相关操作就不用旋转了。并不矛盾)。且这时候该函数需要采用 'full' 模式,所以最终得到的矩阵大小为 3&3, (其中 3=2+2-1 ) , 刚好符第 l 层通道图的大小。采用 'full' 模式需先将第 l+1 层 2 个卷积图扩充,周围填 0,padding 后如下:
扩充后的矩阵和对应的核进行卷积的结果如下情况:
可以通过手动去验证上面的结果,因为是离散卷积操作,而离散卷积等价于将核旋转后再进行相关操作。而第 l 层那个通道的误差敏感项为上面 2 者的和,呼应问题三,最终答案为:
那么这样问题 3 这样解的依据是什么呢?其实很简单,本质上还是 bp 算法,即第 l 层的误差敏感值等于第 l+1 层的误差敏感值乘以两者之间的权值,只不过这里由于是用了卷积,且是有重叠的, l 层中某个点会对 l+1 层中的多个点有影响。比如说最终的结果矩阵中最中间那个 0.3 是怎么来的呢?在用 2&2 的核对 3&3 的输入矩阵进行卷积时,一共进行了 4 次移动,而 3&3 矩阵最中间那个值在 4 次移动中均对输出结果有影响,且 4 次的影响分别在右下角、左下角、右上角、左上角。所以它的值为 2&0.2+1&0.1+1&0.1-1&0.3=0.3, 建议大家用笔去算一下,那样就可以明白为什么这里可以采用带 'full' 类型的 conv2() 实现。
问题四:求与卷积层相连那层的权值、偏置值导数。
前面 3 个问题分别求得了输出层的误差敏感值、从 pooling 层推断出卷积层的误差敏感值、从卷积层推断出 pooling 层的误差敏感值。下面需要利用这些误差敏感值模型中参数的导数。这里没有考虑 pooling 层的非线性激发,因此 pooling 层前面是没有权值的,也就没有所谓的权值的导数了。现在将主要精力放在卷积层前面权值的求导上 ( 也就是问题四 ) 。
假设现在需要求第 l 层的第 i 个通道,与第 l+1 层的第 j 个通道之间的权值和偏置的导数,则计算公式如下:
其中符号⊙表示矩阵的相关操作,可以采用 conv2() 函数实现。在使用该函数时,需将第 l+1 层第 j 个误差敏感值翻转。
例如,如果第 l 层某个通道矩阵 i 大小为 4&4, 如下:
第 l+1 层第 j 个特征的误差敏感值矩阵大小为 3&3, 如下:
很明显,这时候的特征 Kij 导数的大小为 2&2 的,且其结果为:
而此时偏置值 bj 的导数为 1.2 ,将 j 区域的误差敏感值相加即可 (0.8+0.1-0.6+0.3+0.5+0.7-0.4-0.2=1.2) ,因为 b 对 j 中的每个节点都有贡献,按照多项式的求导规则 ( 和的导数等于导数的和 ) 很容易得到。
为什么采用矩阵的相关操作就可以实现这个功能呢?由 bp 算法可知, l 层 i 和 l+1 层 j 之间的权值等于 l+1 层 j 处误差敏感值乘以 l 层 i 处的输入,而 j 中某个节点因为是由 i+1 中一个区域与权值卷积后所得,所以 j 处该节点的误差敏感值对权值中所有元素都有贡献,由此可见,将 j 中每个元素对权值的贡献 ( 尺寸和核大小相同 ) 相加,就得到了权值的偏导数了 ( 这个例子的结果是由 9 个 2&2 大小的矩阵之和 ) ,同样,如果大家动笔去推算一下,就会明白这时候为什么可以用带 'valid' 的 conv2() 完成此功能。
池化矩阵一般为2&2,对于非常大的图像可能会使用4&4,但取值时要谨慎,这可能会损失掉太多的输入信息。
由于特征图中神经元的数量会随着层数的深入而减小,靠近输入层的特征图数量应该更多点来平衡每一层的计算量,为了不使输入信息丢失,应该使每一层的激活值数量(特征图数量乘以像素值)一致,特征图数量大小取决于算法的复杂度,数量太多会使得计算复杂度大幅上升。
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致更多公众号:gh_e306cf07d303学习日记、思考日记最新文章相关推荐搜狗:感谢您阅读卷积神经网络新手指南之二,本文可能来自网络,如果侵犯了您的相关权益,请联系管理员。QQ:MOPCNN_code matlab 和C++下联合编程构建的多尺度无序的卷积神经网络,是对caffe的一种扩充 AI-NN-PR 人工智能/
238万源代码下载-
&文件名称: MOPCNN_code
& & & & &&]
&&所属分类:
&&开发工具: matlab
&&文件大小: 987 KB
&&上传时间:
&&下载次数: 1
&&提 供 者:
&详细说明:matlab 和C++下联合编程构建的多尺度无序的卷积神经网络,是对caffe的一种扩充-MOPCNN source code
文件列表(点击判断是否您需要的文件,如果是垃圾请在下面评价投诉):
&&MOPCNN_code&&...........\feature extraction&&...........\..................\.DS_Store&&...........\..................\caffe.mexa64&&...........\..................\cleanSUN.m&&...........\..................\extractFeature.m&&...........\..................\extractPatch.m&&...........\..................\Feature_SUN.m&&...........\..................\ilsvrc_2012_mean.mat&&...........\..................\matcaffe.cpp&&...........\..................\matcaffe_demo.m&&...........\..................\prepare_image.m&&...........\..................\readme.txt&&...........\..................\samplemodel&&...........\..................\...........\.DS_Store&&...........\..................\...........\imagenetfeature128.prototxt&&...........\..................\...........\imagenetfeature256.prototxt&&...........\..................\...........\imagenetfeature64.prototxt&&...........\pooling&&...........\.......\.DS_Store&&...........\.......\BuildALLGlobal.m&&...........\.......\buildVLADALL.m&&...........\.......\dist_mat.m&&...........\.......\FisherVector.m&&...........\.......\fkmeans.m&&...........\.......\learnCodebook.m&&...........\.......\normalize.m&&...........\.......\normalizeL1.m&&...........\.......\readme.txt&&...........\.......\ScalPCA.m&&...........\.......\SUN_GetData.m&&...........\readme.txt&&...........\__MACOSX&&...........\........\._readme.txt&&...........\........\feature extraction&&...........\........\..................\._.DS_Store&&...........\........\..................\._caffe.mexa64&&...........\........\..................\._cleanSUN.m&&...........\........\..................\._extractFeature.m&&...........\........\..................\._extractPatch.m&&...........\........\..................\._Feature_SUN.m&&...........\........\..................\._ilsvrc_2012_mean.mat&&...........\........\..................\._matcaffe.cpp&&...........\........\..................\._matcaffe_demo.m&&...........\........\..................\._prepare_image.m&&...........\........\..................\._readme.txt&&...........\........\..................\._samplemodel&&...........\........\..................\samplemodel&&...........\........\..................\...........\._.DS_Store&&...........\........\..................\...........\._imagenetfeature128.prototxt&&...........\........\..................\...........\._imagenetfeature256.prototxt&&...........\........\..................\...........\._imagenetfeature64.prototxt&&...........\........\pooling&&...........\........\.......\._.DS_Store&&...........\........\.......\._buildVLADALL.m&&...........\........\.......\._dist_mat.m&&...........\........\.......\._FisherVector.m&&...........\........\.......\._fkmeans.m&&...........\........\.......\._learnCodebook.m&&...........\........\.......\._normalize.m&&...........\........\.......\._normalizeL1.m&&...........\........\.......\._readme.txt&&...........\........\.......\._ScalPCA.m&&...........\........\.......\._SUN_GetData.m
&输入关键字,在本站238万海量源码库中尽情搜索:
&[] - 基于部件模型的弱监督方法kfan源码,可用于检测和识别
&[] - 车道线检测,在vs2010配置opencv的情况下亲测可用,代码没有做出透视变换Deep Learning(43)
之前的博文已经介绍了CNN的基本原理,本文将大概总结一下最近CNN在NLP中的句子建模(或者句子表示)方面的应用情况,主要阅读了以下的文献:
Kim Y. Convolutional neural networks for sentence classification[J]. arXiv preprint arXiv:, 2014.
Kalchbrenner N, Grefenstette E, Blunsom P. A convolutional neural network for modelling sentences[J]. arXiv preprint arXiv:, 2014.
Hu B, Lu Z, Li H, et al. Convolutional neural network architectures for matching natural language sentences[C]//Advances in Neural Information Processing Systems. -2050.
He H, Gimpel K, Lin J. Multi-perspective sentence similarity modeling with convolutional neural networks[C]//Proceedings of the 2015 Conference on Empirical Methods in Natural Language Processing. -1586.
Wenpeng Yin, Hinrich Schütze. Convolutional Neural Network for Paraphrase Identification. The 2015 Conference of the North American Chapter of the Association for Computational Linguistics
Zhang Y, Wallace B. A Sensitivity Analysis of (and Practitioners’ Guide to) Convolutional Neural Networks for Sentence Classification[J]. arXiv preprint arXiv:, 2015.
下面对文献中CNN的结构和细节进行梳理。
Kim Y’s Paper
模型结构及原理
模型的结构如下:
说明如下:
如图所示,输入层是句子中的词语对应的word vector依次(从上到下)排列的矩阵,假设句子有&nn&个词,vector的维数为&kk&,那么这个矩阵就是&n×kn×k&的。
这个矩阵的类型可以是静态的(static),也可以是动态的(non static)。静态就是word vector是固定不变的,而动态则是在模型训练过程中,word vector也当做是可优化的参数,通常把反向误差传播导致word vector中值发生变化的这一过程称为Fine
对于未登录词的vector,可以用0或者随机小的正数来填充。
第一层卷积层
输入层通过卷积操作得到若干个Feature Map,卷积窗口的大小为&h×kh×k&,其中&hh&表示纵向词语的个数,而&kk&表示word
vector的维数。通过这样一个大型的卷积窗口,将得到若干个列数为1的Feature Map。
接下来的池化层,文中用了一种称为Max-over-time Pooling的方法。这种方法就是简单地从之前一维的Feature
Map中提出最大的值,文中解释最大值代表着最重要的信号。可以看出,这种Pooling方式可以解决可变长度的句子输入问题(因为不管Feature Map中有多少个值,只需要提取其中的最大值)。
最终池化层的输出为各个Feature Map的最大值们,即一个一维的向量。
全连接 + Softmax层
池化层的一维向量的输出通过全连接的方式,连接一个Softmax层,Softmax层可根据任务的需要设置(通常反映着最终类别上的概率分布)。
最终实现时,我们可以在倒数第二层的全连接部分上使用Dropout技术,即对全连接层上的权值参数给予L2正则化的限制。这样做的好处是防止隐藏层单元自适应(或者对称),从而减轻过拟合的程度。
实验用到的数据集如下(具体的名称和来源可以参考论文):
2. 模型训练和调参
修正线性单元(Rectified linear units)滤波器的h大小:3,4,5;对应的Feature Map的数量为100;Dropout率为0.5,L2正则化限制权值大小不超过3;mini-batch的大小为50;
这些参数的选择都是基于SST-2 dev数据集,通过网格搜索方法(Grid Search)得到的最优参数。另外,训练过程中采用随机梯度下降方法,基于shuffled mini-batches之上的,使用了Adadelta update rule(Zeiler, 2012)。
3. 预训练的Word Vector
这里的word vector使用的是公开的数据,即连续词袋模型(COW)在Google News上的训练结果。未登录次的vector值是随机初始化的。
4. 实验结果
实验结果如下图:
其中,前四个模型是上文中所提出的基本模型的各个变种:
CNN-rand: 所有的word vector都是随机初始化的,同时当做训练过程中优化的参数;CNN-static: 所有的word vector直接使用无监督学习即Google的Word2Vector工具(COW模型)得到的结果,并且是固定不变的;CNN-non-static: 所有的word vector直接使用无监督学习即Google的Word2Vector工具(COW模型)得到的结果,但是会在训练过程中被Fine
tuned;CNN-multichannel: CNN-static和CNN-non-static的混合版本,即两种类型的输入;
博主自己下载了论文作者的实现程序(),最终在MR数据集上的运行结果如下:
CNN-rand: 0.7669CNN-static: 0.8076CNN-non-static: 0.8151
和论文中的结果差不多。
CNN-static较与CNN-rand好,说明pre-training的word
vector确实有较大的提升作用(这也难怪,因为pre-training的word vector显然利用了更大规模的文本数据信息);CNN-non-static较于CNN-static大部分要好,说明适当的Fine
tune也是有利的,是因为使得vectors更加贴近于具体的任务;CNN-multichannel较于CNN-single在小规模的数据集上有更好的表现,实际上CNN-multichannel体现了一种折中思想,即既不希望Fine
tuned的vector距离原始值太远,但同时保留其一定的变化空间。
值得注意的是,static的vector和non-static的相比,有一些有意思的现象如下表格:
原始的word2vector训练结果中,bad对应的最相近词为good,原因是这两个词在句法上的使用是极其类似的(可以简单替换,不会出现语句毛病);而在non-static的版本中,bad对应的最相近词为terrible,这是因为在Fune
tune的过程中,vector的值发生改变从而更加贴切数据集(是一个情感分类的数据集),所以在情感表达的角度这两个词会更加接近;句子中的!最接近一些表达形式较为激进的词汇,如lush等;而,则接近于一些连接词,这和我们的主观感受也是相符的。
Kim Y的这个模型很简单,但是却有着很好的性能。后续Denny用TensorFlow实现了这个模型的简单版本,可参考;以及Ye
Zhang等人对这个模型进行了大量的实验,并给出了调参的建议,可参考。
下面总结一下Ye Zhang等人基于Kim Y的模型做了大量的调参实验之后的结论:
由于模型训练过程中的随机性因素,如随机初始化的权重参数,mini-batch,随机梯度下降优化算法等,造成模型在数据集上的结果有一定的浮动,如准确率(accuracy)能达到1.5%的浮动,而AUC则有3.4%的浮动;词向量是使用word2vec还是GloVe,对实验结果有一定的影响,具体哪个更好依赖于任务本身;Filter的大小对模型性能有较大的影响,并且Filter的参数应该是可以更新的;Feature Map的数量也有一定影响,但是需要兼顾模型的训练效率;1-max pooling的方式已经足够好了,相比于其他的pooling方式而言;正则化的作用微乎其微。
Ye Zhang等人给予模型调参者的建议如下:
使用non-static版本的word2vec或者GloVe要比单纯的one-hot
representation取得的效果好得多;为了找到最优的过滤器(Filter)大小,可以使用线性搜索的方法。通常过滤器的大小范围在1-10之间,当然对于长句,使用更大的过滤器也是有必要的;Feature Map的数量在100-600之间;可以尽量多尝试激活函数,实验发现ReLU和tanh两种激活函数表现较佳;使用简单的1-max pooling就已经足够了,可以没必要设置太复杂的pooling方式;当发现增加Feature Map的数量使得模型的性能下降时,可以考虑增大正则的力度,如调高dropout的概率;为了检验模型的性能水平,多次反复的交叉验证是必要的,这可以确保模型的高性能并不是偶然。
论文附录中还附上了各种调参结果,感兴趣的可以前往阅读之。
Kalchbrenner’s Paper
Kal的这篇文章引用次数较高,他提出了一种名为DCNN(Dynamic Convolutional Neural Network)的网络模型,在上一篇(Kim’s Paper)中的实验结果部分也验证了这种模型的有效性。这个模型的精妙之处在于Pooling的方式,使用了一种称为动态Pooling的方法。
下图是这个模型对句子语义建模的过程,可以看到底层通过组合邻近的词语信息,逐步向上传递,上层则又组合新的Phrase信息,从而使得句子中即使相离较远的词语也有交互行为(或者某种语义联系)。从直观上来看,这个模型能够通过词语的组合,提取出句子中重要的语义信息(通过Pooling),某种意义上来说,层次结构的feature
graph的作用类似于一棵语法解析树。
DCNN能够处理可变长度的输入,网络中包含两种类型的层,分别是一维的卷积层和动态k-max的池化层(Dynamic k-max pooling)。其中,动态k-max池化是最大化池化更一般的形式。之前LeCun将CNN的池化操作定义为一种非线性的抽样方式,返回一堆数中的最大值,原话如下:
The max pooling operator is a non-linear subsampling function that returns the maximum of a set of values (LuCun et al., 1998).
而文中的k-max pooling方式的一般化体现在:
pooling的结果不是返回一个最大值,而是返回k组最大值,这些最大值是原输入的一个子序列;pooling中的参数k可以是一个动态函数,具体的值依赖于输入或者网络的其他参数;
模型结构及原理
DCNN的网络结构如下图:
网络中的卷积层使用了一种称之为宽卷积(Wide Convolution)的方式,紧接着是动态的k-max池化层。中间卷积层的输出即Feature
Map的大小会根据输入句子的长度而变化。下面讲解一下这些操作的具体细节:
相比于传统的卷积操作,宽卷积的输出的Feature Map的宽度(width)会更宽,原因是卷积窗口并不需要覆盖所有的输入值,也可以是部分输入值(可以认为此时其余的输入值为0,即填充0)。如下图所示:
图中的右图即表示宽卷积的计算过程,当计算第一个节点即s1s1时,可以假使s1s1节点前面有四个输入值为0的节点参与卷积(卷积窗口为5)。明显看出,狭义上的卷积输出结果是宽卷积输出结果的一个子集。
2. k-max池化
给出数学形式化的表述是,给定一个kk值,和一个序列p∈Rpp∈Rp(其中p≥kp≥k),k-max
pooling选择了序列pp中的前kk个最大值,这些最大值保留原来序列的次序(实际上是原序列的一个子序列)。
k-max pooling的好处在于,既提取除了句子中的较重要信息(不止一个),同时保留了它们的次序信息(相对位置)。同时,由于应用在最后的卷积层上只需要提取出kk个值,所以这种方法允许不同长度的输入(输入的长度应该要大于kk)。然而,对于中间的卷积层而言,池化的参数kk不是固定的,具体的选择方法见下面的介绍。
3. 动态k-max池化
动态k-max池化操作,其中的kk是输入句子长度和网络深度两个参数的函数,具体如下:
Kl=max(ktop,?L-lLs?)Kl=max(ktop,?L-lLs?)
其中ll表示当前卷积的层数(即第几个卷积层),LL是网络中总共卷积层的层数;ktopktop为最顶层的卷积层pooling对应的kk值,是一个固定的值。举个例子,例如网络中有三个卷积层,ktop=3ktop=3,输入的句子长度为18;那么,对于第一层卷积层下面的pooling参数k1=12k1=12,而第二层卷积层对于的为k2=6k2=6,而k3=ktop=3k3=ktop=3。
动态k-max池化的意义在于,从不同长度的句子中提取出相应数量的语义特征信息,以保证后续的卷积层的统一性。
4. 非线性特征函数
pooling层与下一个卷积层之间,是通过与一些权值参数相乘后,加上某个偏置参数而来的,这与传统的CNN模型是一样的。
5. 多个Feature Map
和传统的CNN一样,会提出多个Feature Map以保证提取特征的多样性。
6. 折叠操作(Folding)
之前的宽卷积是在输入矩阵d×sd×s中的每一行内进行计算操作,其中dd是word
vector的维数,ss是输入句子的词语数量。而Folding操作则是考虑相邻的两行之间的某种联系,方式也很简单,就是将两行的vector相加;该操作没有增加参数数量,但是提前(在最后的全连接层之前)考虑了特征矩阵中行与行之间的某种关联。
模型的特点
保留了句子中词序信息和词语之间的相对位置;宽卷积的结果是传统卷积的一个扩展,某种意义上,也是n-gram的一个扩展;模型不需要任何的先验知识,例如句法依存树等,并且模型考虑了句子中相隔较远的词语之间的语义信息;
1. 模型训练及参数
输出层是一个类别概率分布(即softmax),与倒数第二层全连接;代价函数为交叉熵,训练目标是最小化代价函数;L2正则化;优化方法:mini-batch + gradient-based (使用Adagrad update rule, Duchi et al., 2011)
2. 实验结果
在三个数据集上进行了实验,分别是(1)电影评论数据集上的情感识别,(2)TREC问题分类,以及(3)Twitter数据集上的情感识别。结果如下图:
可以看出,DCNN的性能非常好,几乎不逊色于传统的模型;而且,DCNN的好处在于不需要任何的先验信息输入,也不需要构造非常复杂的人工特征。
Hu’s Paper
模型结构与原理
1. 基于CNN的句子建模
这篇论文主要针对的是句子匹配(Sentence Matching)的问题,但是基础问题仍然是句子建模。首先,文中提出了一种基于CNN的句子建模网络,如下图:
图中灰色的部分表示对于长度较短的句子,其后面不足的部分填充的全是0值(Zero Padding)。可以看出,模型解决不同长度句子输入的方法是规定一个最大的可输入句子长度,然后长度不够的部分进行0值的填充;图中的卷积计算和传统的CNN卷积计算无异,而池化则是使用Max-Pooling。
卷积结构的分析
下图示意性地说明了卷积结构的作用,作者认为卷积的作用是从句子中提取出局部的语义组合信息,而多张Feature Map则是从多种角度进行提取,也就是保证提取的语义组合的多样性;而池化的作用是对多种语义组合进行选择,过滤掉一些置信度低的组合(可能这样的组合语义上并无意义)。
2. 基于CNN的句子匹配模型
下面是基于之前的句子模型,建立的两种用于两个句子的匹配模型。
模型结构如下图:
简单来说,首先分别单独地对两个句子进行建模(使用上文中的句子模型),从而得到两个相同且固定长度的向量,向量表示句子经过建模后抽象得来的特征信息;然后,将这两个向量作为一个多层感知机(MLP)的输入,最后计算匹配的分数。
这个模型比较简单,但是有一个较大的缺点:两个句子在建模过程中是完全独立的,没有任何交互行为,一直到最后生成抽象的向量表示后才有交互行为(一起作为下一个模型的输入),这样做使得句子在抽象建模的过程中会丧失很多语义细节,同时过早地失去了句子间语义交互计算的机会。因此,推出了第二种模型结构。
2.2 结构II
模型结构如下图:
图中可以看出,这种结构提前了两个句子间的交互行为。
第一层卷积层
第一层中,首先取一个固定的卷积窗口k1k1,然后遍历&SxSx&和&SySy&中所有组合的二维矩阵进行卷积,每一个二维矩阵输出一个值(文中把这个称作为一维卷积,因为实际上是把组合中所有词语的vector排成一行进行的卷积计算),构成Layer-2。下面给出数学形式化表述:
第一层卷积层后的Max-Pooling层
从而得到Layer-2,然后进行2×2的Max-pooling:
后续的卷积层
后续的卷积层均是传统的二维卷积操作,形式化表述如下:
二维卷积结果后的Pooling层
与第一层卷积层后的简单Max-Pooling方式不同,后续的卷积层的Pooling是一种动态Pooling方法,这种方法来源于参考文献[1]。
结构II的性质
保留了词序信息;更具一般性,实际上结构I是结构II的一种特殊情况(取消指定的权值参数);
1. 模型训练及参数
使用基于排序的自定义损失函数(Ranking-based Loss)BP反向传播+随机梯度下降;mini-batch为100-200,并行化;为了防止过拟合,对于中型和大型数据集,会提前停止模型训练;而对于小型数据集,还会使用Dropout策略;Word2Vector:50维;英文语料为Wikipedia(~1B words),中文语料为微博数据(~300M words);使用ReLu函数作为激活函数;卷积窗口为3-word window;使用Fine tuning;
2. 实验结果
一共做了三个实验,分别是(1)句子自动填充任务,(2)推文与评论的匹配,以及(3)同义句识别;结果如下面的图示:
其实结构I和结构II的结果相差不大,结构II稍好一些;而相比于其他的模型而言,结构I和结构II的优势还是较大的。
He’s Paper
第四篇论文即He的文章中所提出的模型,是所有基于NN的模型中,在Paraphrase identification任务标准数据集MSRP上效果最佳的。下面我们来学习一下这个模型。
模型结构与原理
模型主要分为两个部分:
句子的表征模型:得到句子的表征(representation),以供后续的相似度计算;相似度计算模型:使用多种相似度计算方法,针对句子表征后的局部进行相应的计算;
模型不需要借助WordNet, 句法解析树等资源;但是可以选择性地使用词性标注、word embedding等方法来增强模型的性能;与之前的模型区别在于,文中的模型使用了多种类型的卷积、池化方法,以及针对得到的句子表征的局部进行相应的相似度计算。(这样做的优点在于能够更加充分地挖掘出句子中的特征信息,从而提升性能,但同时使得模型变得复杂、耗时)
模型的整体框架如下:
下面具体看看这两个模型是如何实现的。
句子的表征模型
模型是基于CNN的,卷积层有两种卷积方式,池化层则有三种。
假设模型的输入为二维矩阵&SentSent,Sent∈Rlen×DimSent∈Rlen×Dim,其中&lenlen&表示句子切分为Token
List后的长度(Token可以是词/字),DimDim&表示Token的Embedding表示的维度。由此有&SentiSenti&表示矩阵的第&ii&行,即输入中的第&ii&个Token的Embedding表示;Senti:jSenti:j&表示矩阵中的第&ii&到第&jj&行的一个切片,也是一个子矩阵;Sent[k]iSenti[k]&表示矩阵的第&ii&行第&kk&列的值,对应是Embedding的第&kk&个值;而&Sent[k]i:jSenti:j[k]&则是矩阵中第&ii&行到第&jj&行中的第&kk&列的一个切片。
卷积层有两种卷积的方式:(1)粒度为word的卷积;(2)粒度为embedding 维度上的卷积。如下图:
其中,第一种卷积方式与之前的Kim Y提出模型中的相同,相当于是n-gram特征的抽取;而对于第二种卷积方式,论文作者给出的解释是,(1)这种方式有助于充分地提取出输入的特征信息;(2)由于粒度更小,所以在学习过程中的参数调整上,每一个维度能够得到不同程度的参数调整。(第二种卷积方式从直观上没有太多的物理意义,而作者也是直说不能够给出符合人直观想法上的解释)。
模型除了使用传统的max-pooling,还使用了min-pooling和mean-pooling方式。
假设&group(ws,pooling,sent)group(ws,pooling,sent)&表示卷积宽度为&wsws,使用&poolingpooling&池化函数,应用在输入的句子&sentsent&上。我们使用了两种类型的building
block,分别是&blockAblockA&和&blockBblockB上,定义如下
blockA={groupA(wsa,p,sent):p∈max,min,mean}blockA={groupA(wsa,p,sent):p∈max,min,mean}
这里&blockAblockA&有三组卷积层,卷积窗口的宽度一致(都是&wsawsa&),每一组对应一种池化操作。这里池化操作和卷积层是一一对应的,也就是说并不是一个卷积层上实施三种池化操作(虽然也可以这么做,作者没有这么做的原因是由于激活函数的存在,对每个卷积结果都进行max-pooling和min-pooling是没有必要的)。
而&blockBblockB&的定义如下:
blockB={groupB(wsb,p,sent):p∈max,min}blockB={groupB(wsb,p,sent):p∈max,min}
这里&blockBblockB&有两组卷积层,卷积窗口的宽度为&wsbwsb,两组分别对应max-pooling和min-pooling的操作。值得说明的是,groupB(*)groupB(*)&中的卷积层对应有&DimDim&个以embedding
dimension为粒度的卷积窗口,也就是对embedding的每一维度做卷积运算。
这里只所以要组合这些多样的卷积和池化操作,原因是希望能够从多个方面来提取出输入中的特征信息,以供后续的决策任务。
多种窗口尺寸
与传统的n-gram模型相似,这里在building block中使用了多种尺寸的卷积窗口。如下图所示:
其中&wsws&表示卷积时卷积的n-gram长度,而&ws=∞ws=∞&表示卷积窗口为整个word
embedding矩阵。wsws&的值及Feature
Map&的数量都是需要调参的。
相似度计算模型
下面介绍在得到句子的表征向量之后,如何计算它们的相似度。直观的想法是,我们可以使用传统的相似度计算方法如余弦相似度等来计算两个句子向量的相似度。但是,直接应用这种做法在两个句子向量上并不是最优的,原因在于最后生成的句子向量中的每一个部分的意义各不相同,这样简单粗暴的计算势必会影响效果,所以做法是对句子向量中的各个部分进行相应的比较和计算(Structured Comparision)。为了使得句子向量中的局部间的比较和计算更加有效,我们需要考虑如下方面:
(1) 是否来自相同的building block;
(2) 是否来自相同卷积窗口大小下的卷积结果;
(3) 是否来自相同的pooling层;
(4) 是否来自相同的Feature Map;
最终比较句子中的相应部分时,需要至少满足以上两个条件。为了识别句子中的哪些对应部分需要参与到相似度计算,文中提供了两种算法。
2.1.&相似度计算单元(Unit)
两种相似度计算单元如下:
2.2.&基于句子局部的相似度计算
算法1和算法2为句子表征向量的两种计算方法,其中算法1仅用在&blockAblockA&上;而算法2则都用在&blockAblockA&和&blockBblockB&上,两种算法都是针对相同类型(pooling和block类型)的输出做局部比较。
给出如下的符号假设:
算法的伪代码如下:
下面的图示说明了在&blockAblockA&上,两种算法的计算方式的区别,算法一表现了向量在水平方向上的比较;而算法二则是在垂直方向。
需要注意的是,在算法二中相同类型的pooling的输出groups中,向量是两两进行比较的(图中的红色虚线只是为了说明比较的方向,并不是只针对group中相同大小的卷积窗口作比较);而算法一中的每一行都要作比较,不仅仅是第一行。
模型的其他细节
相似度向量输出 + 全连接层
基于句子局部的相似度计算之后,得到相应的相似度向量;然后这组向量之后连接一个全连接层,最后softmax对应输出。如果是计算相似度度量值,可以用softmax输出的类别概率值。
使用tanh函数作为激活函数。
实验数据集
用于评测同义句检测 (Paraphrase Identification) 任务的经典数据集,数据集来源于新闻;包含5801对句子对,其中4076对用于模型训练,而1725对用于测试;每一对句子拥有一个标签,0或者1,0表示两个句子不是互为同义句,而1则表示两个句子互为同义句。因此这是一个二分类的任务。
数据来源于2014年SemEval比赛,数据集有9927对句子对,其中4500对用于模型训练,500对用于模型验证,而剩下的4927对用于模型测试。这些句子都是在图片和视频描述中抽取得到的,每一对句子对有一个相关分数,区间在[1, 5],分数越高表示句子越相关。
数据集来源于2012年的SemEval比赛,包含1500对短文本(用于描述视频信息)。其中一般用于模型训练,一半用于模型测试,每一对句子有一个相关性分数,区间在[0, 5],分数越高表示句子越相关。
针对MSRP和其他两个数据集,分别使用两种损失函数。对于MSRP数据集,损失函数(Hinge Loss)如下:
对于其余两个数据集,损失函数(KL-divergence Loss)如下:
实验参数设置
wsws&的值:ws∈[1,3]ws∈[1,3]和&ws=∞ws=∞.Word Embedding: 300维的GloVe word embedding;对于MSRP数据集,还额外使用了200维的POS
embedding&()和25维的Paragram Vectors(,)。因此对于MSRP任务而言,word
embedding的维数为525维 (200+300+25);而其余两个任务则对应是300维。在MSRP上使用了5-折交叉验证的方式,对模型参数进行tuning.&Tuning好的模型参数将会用在另外两个数据集任务上。只有在MSRP数据集任务上,允许模型参数进行更新。输出的全连接层,MSRP有250个神经元节点,而SICK和MSRVID则是150个。在&blockAblockA&中,Feature
Map&的数量与输入的embedding维数相同,即MSRP是525个,而SICK和MSRVID则是300个。优化算法使用随机梯度下降方法。学习率为0.01,而正则化参数&λ=10-4λ=10-4.
MSRP数据集
可以看出,文中的模型是所有基于NN的方法中在MSRP数据集上性能最好的。
SICK数据集
MSRVID数据集
而模型在SICK和MSRVID数据集上的表现也很好。
模型的敏感度分析
下面的表格说明了在不使用某种技术下,模型性能在实验数据集上的变化情况。
从中可以得出以下结论:
对于MSRP数据集任务而言,增加POS Embedding和Paragram
Vector效果显著;移除相似度计算层的影响显著,说明结构化的句子局部比较方法是有效且必要的;Horizontal和Vertical算法均有一定的提升效果,而Vertical算法的提升程度更高;max-pooling方式确实要比min-pooling和mean-pooling强太多。
文中的模型包含两个部分:卷积-池化模型和相似度计算模型。实验部分已经验证了模型的有效性,在MSRP数据集上模型取得了仅次于state-of-art的结果,并且在基于NN的方法中是最好的。模型中的相似度计算层是有必要的,因为对卷积池化处理后的句子成分进行了针对性的比较,从直观上要比直接扔进全连接层更合理,而实验结果也表明了这一点。
然而,个人觉得,文中的模型结构较为复杂,而且其中有很多trick的地方,比如为什么要对word embedding中的每一维度做卷积,blockBblockB&中的pooling方式为什么只用了max和min,不用mean的方式等问题,而这些方式或许是作者自己做了大量实验后,从果到因而使用的。
Yin’s Paper
Yin的这篇论文提出了一种叫Bi-CNN-MI的架构,其中Bi-CNN表示两个使用Siamese框架的CNN模型;MI表示多粒度的交互特征。Bi-CNN-MI包含三个部分:
句子分析模型 (CNN-SM)
这部分模型主要使用了上述Kal在2014年提出的模型,针对句子本身提取出四种粒度的特征表示:词、短ngram、长ngram和句子粒度。多种粒度的特征表示是非常必要的,一方面提高模型的性能,另一方面增强模型的鲁棒性。
句子交互计算模型 (CNN-IM)
这部分模型主要是基于2011年Socher提出的RAE模型,做了一些简化,即仅对同一种粒度下的提取特征做两两比较。
LR或Softmax网络层以适配任务
论文提出的模型主要是基于Kal的模型及Socher的RAE模型的结合体,如下图:
通过模型图可以看出模型的主要思想:一方面利用Kal的模型进行多种粒度上的特征提取,另一方面采取RAE模型的思想,对提取出来的特征进行两两的相似度计算,计算完成的结果通过dynamic
pooling的方式进一步提取少量特征,然后各个层次的pooling计算结果平摊为一组向量,通过全连接的方式与LR(或者softmax)层连接,从而适配同义句检测任务本身。
这个模型具体的计算细节不再赘述了,感兴趣的读者可以直接去看论文。除了提出这种模型结构之外,论文还有一个亮点在于使用了一种类似于语言模型的CNN-LM来对上述CNN部分的模型进行预训练,从而提前确定模型的参数。CNN-LM的网络结构如下图:
CNN-LM模型的训练预料使用了最终的实验数据集,即MSRP;另外,由于MSRP的数据规模较小,所以作者又增加了100,000个英文句子语料。CNN-LM模型最终能够得到word
embedding, 模型权值等参数。需要注意的是,这些参数并不是固定的,在之后的句子匹配任务中是会不断更新的。从后面的实验结果中可以看出,CNN-LM的作用是显著的。
论文仅使用了一种数据集,即公认的PI (Paraphrase Identification)任务数据集,MSRP。实验结果如下:
可以看出,CNN-LM的预训练效果显著,预训练后的模型性能很强(但是结果上比之前He提出的模型稍差一些)。
本文结束,感谢欣赏。
欢迎转载,请注明本文的链接地址:
[1] R. Socher, E. H. Huang, and A. Y. Ng. Dynamic pooling and unfolding recursive autoencoders for paraphrase detection. In Advances in NIPS, 2011.
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:1002280次
积分:9643
积分:9643
排名:第1272名
原创:28篇
转载:463篇
评论:133条
(1)(18)(13)(3)(2)(8)(21)(1)(2)(10)(4)(2)(11)(15)(4)(4)(15)(1)(12)(14)(1)(1)(1)(14)(22)(23)(19)(15)(23)(9)(46)(1)(2)(18)(35)(6)(10)(4)(8)(4)(12)(19)(19)(11)(3)(6)

我要回帖

更多关于 aes zeropadding 的文章

 

随机推荐