卷积神经网络与常规的神经网络十分相似:
神经网络的输入是一个向量,然后在一系列的隐层中对它做变换。每个隐层都是由若干的神经元组成,每个神经元都与前一层中的所有神经元连接。但是在一个隐层中,神经元相互独立不进行任何连接。最后的全连接层被称为“输出层”,在分类问题中,它输出的值被看做是不同类别的评分值。
但是全连接的方式效率低下,且大量的参数也很快会导致网络过拟合。
与常规神经网络不同,卷积神经网络的各层中的神经元是三维排列的:宽度、高度和深度(其中深度指激活数据体的第三个维度,而不是整个网络的深度,整个网络的深度指网络的层数)。层中的神经元将只与前一层的一小块区域连接,而不是采用全连接方式。在卷积神经网络的最后部分会把全尺寸的图像压缩为包含分类评分的一个向量,向量是在深度方向排列的。
卷积神经网络是由层组成的。每一层都有一个简单的API:用一些含或者不含参数的可导的函数,将输入的3D数据变换为3D的输出数据。
卷积神经网络主要由三种类型的层构成:卷积层,池化(Pooling)层和全连接层。
网络结构例子:一个用于CIFAR-10图像数据分类的卷积神经网络的结构可以是[输入层-卷积层-ReLU层-汇聚层-全连接层]:
卷积神经网络一层一层地将图像从原始像素值变换成最终的分类评分值。其中有的层含有参数,有的没有。
具体说来,卷积层和全连接层(Conv/FC)对输入执行变换操作的时候,不仅会用到激活函数,还会用到很多参数(神经元的突触权值和偏差)。而ReLU层和池化层则是进行一个固定不变的函数操作。卷积层和全连接层中的参数会随着梯度下降被训练,这样卷积神经网络计算出的分类评分就能和训练集中的每个图像的标签吻合了。
概述和直观介绍:卷积层的参数是由一些可学习的滤波器集合构成的。每个滤波器在空间上(宽和高)都比较小,但是深度和输入数据一致。前向传播的时候,让每个滤波器都在输入数据的宽度和高度上滑动(卷积),然后计算整个滤波器和输入数据任一处的内积。当滤波器沿着输入数据的宽度和高度滑过后,会生成一个2维的激活图(activation map),激活图给出了在每个空间位置处滤波器的反应。
在每个卷积层上,我们会有一整个集合的滤波器(比如12个),每个都会生成一个不同的二维激活图。将这些激活映射在深度方向上层叠起来就生成了输出数据。
局部连接:让每个神经元只与输入数据的一个局部区域连接,该连接的空间大小叫做神经元的感受野(receptive field),其尺寸其实就是滤波器的空间尺寸。在深度方向上,这个连接的大小总是和输入量的深度相等。
空间排列:3个超参数控制着输出数据体的尺寸:深度(depth),步长(stride),零填充(zero-padding)。
参数共享:在卷积层中使用参数共享来控制参数的数量。做一个合理的假设:如果某一特征在计算某个空间位置(x,y)时有用,则在计算另一个不同位置的时候也有用。换言之,就是讲深度维度上的一个单独的2维切片看做深度切片(depth slice),每个深度切片上的神经元都是用相同的权重和偏差。在反向传播时,要计算每个神经元对它的权重的梯度,但是需要把同一个深度切片上所有的神经元对权重的梯度累加,这样就得到了对共享权重的梯度。每个切片只更新一个权重集。
注意:
Numpy例子
假设输入数据体是numpy数组$X$,则
卷积层例子:假设输入数据体$X$的尺寸$X.shape:(11,11,4)$,不用零填充($P=0$),滤波器尺寸$F=5$,步长$S=2$。则输出数据体的空间尺寸是$(11-5)/2+1=4$。输出数据体中的激活映射($V$)如下:
在numpy中,*操作是进行数组间的逐元素相乘。在这里假设$W0.shape:(5,5,4)$,因为滤波器尺寸为5,输入数据量的深度是4。要构建输出数据体中的第二张激活图,代码如下:
在上面的例子中,为了简洁略去了卷积层对于输出数组V中其他部分的操作。
Convolutional layer summary
用矩阵乘法实现:卷积运算本质上就是在滤波器和输入数据的局部区域间做点积。将卷积层的前向传播变成一个巨大的矩阵乘法:
反向传播:卷积操作的反向传播还是一个卷积(但是是和空间上翻转的滤波器)
$1\times1$卷积:Network in Network
扩张卷积(Dilated convolutions):Multi-Scale Context Aggregation by Dilated Convolutions.让滤波器中元素之间有间隙也是可以的,这就叫做扩张。在某些设置中,扩张卷积与正常卷积结合起来非常有用,因为在很少的层数内更快地汇集输入图片的大尺度特征。
通常在连续的卷积层之间会周期性插入一个池化层,用来逐渐降低数据体的空间尺寸,从而减少网络中参数的数量并控制过拟合。池化层使用MAX操作,对输入数据体的每一个深度切片独立进行操作,改变它的空间尺寸。最常见的形式是池化层使用尺寸2x2的滤波器,以步长为2来对每个深度切片进行降采样,将其中75%的激活信息都丢掉。每个MAX操作是从4个数字中取最大值(也就是在深度切片中某个2x2的区域)。深度保持不变。池化层的一些公式:
在实践中,最大池化层通常只有两种形式:一种是$F=3,S=2$,也叫重叠池化(overlapping pooling),另一个更常用的是$F=2,S=2$。对更大感受野进行池化需要的池化尺寸也更大,而且往往对网络有破坏性。
普通池化(General Pooling):max pooling, average pooling, L2-norm pooling, etc.
反向传播:max(x,y)函数的反向传播可以简单理解为将梯度只沿最大的数回传。因此,在向前传播经过池化层的时候,通常会把池中最大元素的索引记录下来(有时这个也叫作道岔(switches)),这样在反向传播的时候就很高效。
不用池化层:通过在卷积层中使用更大的步长来降低数据体的尺寸。Striving for Simplicity: The All Convolutional Net
对于不同类型的归一化层,可以参考Alwx的关于cuda-convnet library API的讨论
在全连接层中,神经元对于前一层中的所有激活数据是全部连接的
FC layer和Conv layer:
全连接层转化为卷积层:相较于使用被转化前的原始卷积神经网络对所有36个位置进行迭代计算,使用转化后的卷积神经网络进行一次前向传播计算要高效得多。
Net Surgery:一个使用Caffe演示如何在进行变换的IPython Note教程
卷积神经网络最常见的形式就是将一些卷积层和ReLU层放在一起,其后紧跟汇聚层,然后重复如此直到图像在空间上被缩小到一个足够小的尺寸,在某个地方过渡成成全连接层也较为常见。 最常见的卷积神经网络结构如下:
$$Input\to[[Conv\to ReLU]*N\to Pool?]*M\to [FC\to ReLU]*K\to FC$$其中$*$指的是重复次数,$POOL?$指的是一个可选的汇聚层。其中$N >=0$,通常$N<=3,M>=0,K>=0$,通常$K<3$。
几个小滤波器卷积层的组合比一个大滤波器卷积层好:
输入层:应该能被2整除很多次。
卷积层:应使用小尺寸滤波器($3\times3$或$5\times5$),使用步长$S=1$,对数据进行零填充,从而保持输入数据的空间尺寸不变。一般对于任意$F$,当$P=(F-1)/2$的时候能保持输入尺寸。如果必须使用更大的滤波器尺寸(比如$7\times7$之类),通常只用在第一个面对原始图像的卷积层上。
池化层:负责对输入数据的空间维度进行降采样。
三种内存占用来源:
和实践相关的拓展资源:
CNN Architecture: