转载自:http://mp.weixin.qq.com/s/PLiwH39jkfpNpjguLG7EZQ 有删减
【嵌牛导读】:卷积神经网络(Convolutional Neural Network)最早是应用在计算机视觉当中,而如今CNN也早已应用于自然语言处理(Natural Language Processing)的各种任务。
【嵌牛鼻子】:卷积神经网络;池化操作;NLP。
【嵌牛提问】:卷积神经网络结构有哪些?什么是池化操作?应用?
【嵌牛正文】:
先介绍卷积神经网络中各个重要的环节。
卷积
所以这里我们首先去理解卷积神经网络中卷积的运算。这里我们以图像作为输入。比较容易理解卷积的方法是把卷积想象成作用于矩阵的一个滑动窗口函数。如下面这张图的表示。
滑动窗口又称作卷积核、滤波器或是特征检测器。图中使用3x3的卷积核,将卷积核与矩阵对应的部分逐元素相乘,然后求和。对于卷积的运算可以看下面这幅图的解释。
在不改变卷积核权重的情况下,就像拿着一只刷子一样对整个图水平垂直滑动进行卷积运算,这样输出就是经过卷积运算后的输出层。
什么是卷积神经网络
卷积神经网络其实就是多层卷积运算,然后对每层的卷积输出用非线性激活函数做转换。卷积过程中每块局部的输入区域与输出的一个神经元相连接。对每一层应用不同的卷积核,每一种卷积核其实可以理解为对图片的一种特征进行提取,然后将多种特征进行汇总,以下面这幅图为例,原始的input为一幅图片,第一层卷积过后输出层变为6@28*28,所以这里的卷积核实际上用了6个,6个卷积核代表了对这一张原始图片的六种不同角度的特征提取(例如提取图片左上方的边缘线条,右下方的边缘线条等等)。feature map实际上的含义就是特征通道(或者理解为一个图片的不同特征),也可以说就是输出层的深度,这里就是6,然后后面每一次做卷积操作是都是要对所有的特征通道进行卷积操作以便提取出更高级的特征。
例如,在上面这幅图中,第一层CNN模型也许学会从原始像素点中检测到一些边缘线条,然后根据边缘线条在第二层检测出一些简单的形状(例如横线条,左弯曲线条,竖线条等),然后基于这些形状检测出更高级的特征,比如一个A字母的上半部分等。最后一层则是利用这些组合的高级特征进行分类。
卷积神经网络中的卷积计算实际上体现了:位置不变性和组合性。位置不变性是因为卷积核是在全图范围内平移,所以并不用关心猫究竟在图片的什么位置。组合性是指每个卷积核对一小块局部区域的低级特征组合形成更高级的特征表示。
卷积是如何应用到自然语言处理中
在图像中卷积核通常是对图像的一小块区域进行计算,而在文本中,一句话所构成的词向量作为输入。每一行代表一个词的词向量,所以在处理文本时,卷积核通常覆盖上下几行的词,所以此时卷积核的宽度与输入的宽度相同,通过这样的方式,我们就能够捕捉到多个连续词之间的特征,并且能够在同一类特征计算时中共享权重。下面这张图很好地诠释了刚才的讲解。
池化层
卷积神经网络的一个重要概念就是池化层,一般是在卷积层之后。池化层对输入做降采样。池化的过程实际上是对卷积层分区域求最大值或者对每个卷积层求最大值。例如,下图就是2x2窗口的最大值池化(在自然语言处理中,我们通常对整个输出做池化,每个卷积层只有一个输出值)。
为什么要进行池化操作?
池化首先是可以输出一个固定大小的矩阵,这对于自然语言处理当中输入句子的长度不一有非常大的作用。例如,如果你用了200个卷积核,并对每个输出使用最大池化,那么无论卷积核的尺寸是多大,也无论输入数据的维度或者单词个数如何变化,你都将得到一个200维的输出。这让你可以应对不同长度的句子和不同大小的卷积核,但总是得到一个相同维度的输出结果,用作最后的分类。
另外池化层在降低数据维度的同时还能够保留显著的特征。每一种卷积核都是用来检测一种特定的特征。在以句子分类中,每一种卷积核可以用来检测某一种含义的词组,如果这种类型的含义的词语出现了,该卷积核的输出值就会非常大,通过池化过程就能够尽可能地将该信息保留下来。
激活函数
有关激活函数很多细节的讲述在最后的总结会提到。
卷积神经网络结构在NLP的应用
首先我们来介绍第一篇论文《Natural Language Processing (almost) from Scratch》,该论文主要是针对原来那种man-made 的输入特征和人工特征,利用神经网络的方法自动抽取出文本句子更高级的特征用来处理自然语言处理里的各项任务,例如本文中输入是一个句子序列,输出是对句子中各个词的词性的预测。该文提出了两种方法,一种是滑动窗口的方法(window approach),另一种就是将整个句子作为输入(sentence approach)的方法,两种方法就分别对应着局部和全局的特征。模型结构如下图所示:
window approach
sentence approach
window approach 是根据某一个单词以及其附近固定长度范围内的单词对应的词向量来为单词预测标签。需要注意的是,当处理到一个句子的开始或者结尾的单词的时候,其前后窗口或许不包含单词,这时候我们需要填充技术,为前面或者后面填充象征开始或者结束的符号。
实际上基于窗口的方法已经可以解决很多常见的任务,但是如果一个单词如果非常依赖上下文的单词,且当时这个单词并不在窗口中,这时就需要sentence approach,这里所使用的卷积操作与卷积神经网络中的卷积操作基本相同。这里需要对句子中的每一个单词进行一次卷积操作,这里池化过程选择最大池化,这里认为句子中大部分的词语对该单词的意义不会有影响。
总结/Q&A
1.卷积层和池化层有什么区别?
首先可以从结构上可以看出,卷积之后输出层的维度减小,深度变深。但池化层深度不变。同时池化可以把很多数据用最大值或者平均值代替。目的是降低数据量。降低训练的参数。对于输入层,当其中像素在邻域发生微小位移时,池化层的输出是不变的,从而能提升鲁棒性。而卷积则是把数据通过一个卷积核变化成特征,便于后面的分离。
2.采用宽卷积的好处有什么?
通过将输入边角的值纳入到滑窗中心进行计算,以便损失更少的信息。
3.卷积输出的深度与哪个部件的个数相同?
输出深度(通道)与卷积核(过滤器)的个数相等。
4.激活函数通常放在卷积神经网络的那个操作之后?
通常放在卷积层之后。
5.为什么激活函数通常都是采用非线性的函数?
如果网络中都采用线性函数的组合,那么线性的组合还是线性,那么使用多次线性组合就等同于使用了一次线性函数。因此采用非线性函数可以来逼近任意函数。
6.非线性激活函数中sigmod函数存在哪些不足?
Sigmod函数存在饱和状态,尤其是值过大时,当进入饱和状态时,进行梯度下降计算时,很容易出现梯度消失的情况,求导的精确值不能保证。
7.ReLU和SoftPlus激活函数有哪些优势?
与sigmod相比,不存在指数计算,求导计算量变小,同时缓解了过拟合的情况,一部分输出为0,减少了参数的相互依存。