关于花书中卷积网络的笔记记录于https://www.jianshu.com/p/5a3c90ea0807。
卷积神经网络(Convolutional Neural Network,CNN或ConvNet)是一种具有局部连接、权重共享等特性的深层前馈神经网络。卷积神经网络是受生物学上感受野的机制而提出。感受野(Receptive Field)主要是指听觉、视觉等神经系统中一些神经元的特性,即神经元只接受其所支配的刺激区域内的信号。
卷积神经网络最早是主要用来处理图像信息。如果用全连接前馈网络来处理图像时,会存在以下两个问题:
参数太多:如果输入图像大小为(即图像高度为100,宽度为100,3个颜色通道:RGB)。在全连接前馈网络中,第一个隐藏层的每个神经元到输入层都有个相互独立的连接,每个连接都对应一个权重参数。随着隐藏层神经元数量的增多,参数的规模也会急剧增加。这会导致整个神经网络的训练效率会非常低,也很容易出现过拟合。
局部不变性特征:自然图像中的物体都具有局部不变性特征,比如尺度缩放、平移、旋转等操作不影响其语义信息。而全连接前馈网络很难提取这些局部不变特征,一般需要进行数据增强来提高性能。
目前的卷积神经网络一般是由卷积层、汇聚层和全连接层交叉堆叠而成的前馈神经网络,使用反向传播算法进行训练。卷积神经网络有三个结构上的特性:局部连接,权重共享以及汇聚。这些特性使卷积神经网络具有一定程度上的平移、缩放和旋转不变性。
1、卷积
卷积(Convolution)是分析数学中一种重要的运算。在信号处理或图像处理中,经常使用一维或二维卷积。
一维卷积经常用在信号处理中,用于计算信号的延迟累积。假设一个信号发生器每个时刻t 产生一个信号,其信息的衰减率为,即在个时间步长后,信息为原来的倍。假设,那么在时刻t收到的信号为当前时刻产生的信息和以前时刻延迟信息的叠加:
我们把称为滤波器(Filter)或卷积核(Convolution Kernel)。假设滤波器长度为,它和一个信号序列的卷积为:
信号序列和滤波器的卷积定义为:
一般情况下滤波器的长度远小于信号序列长度,下图给出一个一维卷积示例,滤波器为:
二维卷积经常用在图像处理中。因为图像为一个两维结构,所以需要将一维卷积进行扩展。给定一个图像和滤波器,其卷积为:
下图给出一个二维卷积示例:
注意这里的卷积运算并不是在图像中框定卷积核大小的方框并将各像素值与卷积核各个元素相乘并加和,而是先把卷积核旋转180度,再做上述运算。
在图像处理中,卷积经常作为特征提取的有效方法。一幅图像在经过卷积操作后得到结果称为特征映射(Feature Map)。
最上面的滤波器是常用的高斯滤波器,可以用来对图像进行平滑去噪;中间和最下面的过滤器可以用来提取边缘特征。
1.1、互相关
在机器学习和图像处理领域,卷积的主要功能是在一个图像(或某种特征)上滑动一个卷积核(即滤波器),通过卷积操作得到一组新的特征。在计算卷积的过程中,需要进行卷积核翻转(即上文提到的旋转180度)。在具体实现上,一般会以互相关操作来代替卷积,从而会减少一些不必要的操作或开销。
互相关(Cross-Correlation)是一个衡量两个序列相关性的函数,通常是用滑动窗口的点积计算来实现。给定一个图像和卷积核,它们的互相关为:
互相关和卷积的区别仅在于卷积核是否进行翻转。因此互相关也可以称为不翻转卷积。当卷积核是可学习的参数时,卷积和互相关是等价的。因此,为了实现上(或描述上)的方便起见,我们用互相关来代替卷积。事实上,很多深度学习工具中卷积操作其实都是互相关操作。
1.2、卷积的变种
在卷积的标准定义基础上,还可以引入滤波器的滑动步长和零填充来增加卷积多样性,更灵活地进行特征抽取。
滤波器的步长(Stride)是指滤波器在滑动时的时间间隔。
零填充(Zero Padding)是在输入向量两端进行补零。
假设卷积层的输入神经元个数为,卷积大小为,步长为,神经元两端各填补个零,那么该卷积层的神经元数量为。
一般常用的卷积有以下三类:
- 窄卷积:步长,两端不补零,卷积后输出长度为。
- 宽卷积:步长,两端补零,卷积后输出长度。
- 等宽卷积:步长,两端补零,卷积后输出长度。上图(b)就是等宽卷积的一个例子。
1.3、卷积的数学性质
因为卷积网络的训练也是基于反向传播算法,因此我们重点关注卷积的导数性质:
假设。
,,。函数为一个标量函数。
则由有:
可以看出,关于的偏导数为和的卷积:
同理得到:
当或时,,即相当于对进行的零填充。从而关于的偏导数为和的宽卷积。
用互相关的“卷积”表示,即为(注意宽卷积运算具有交换性性质):
2、卷积神经网络
2.1、用卷积来代替全连接
在全连接前馈神经网络中,如果第层有个神经元,第层有个神经元,连接边有个,也就是权重矩阵有个参数。当和都很大时,权重矩阵的参数非常多,训练的效率会非常低。
如果采用卷积来代替全连接,第层的净输入为第层活性值和滤波器的卷积,即:
根据卷积的定义,卷积层有两个很重要的性质:
局部连接:在卷积层(假设是第层)中的每个神经元都只和下一层(第层)中某个局部窗口内的神经元相连,构成一个局部连接网络。卷积层和下一层之间的连接数大大减少,由原来的个连接变为个连接,为滤波器大小。
权重共享:作为参数的滤波器对于第层的所有的神经元都是相同的。例如上图(b)中所有的同颜色连接上的权重是相同的。
由于局部连接和权重共享,卷积层的参数只有一个m维的权重和1维的偏置,共个参数。参数个数和神经元的数量无关。此外,第层的神经元个数不是任意选择的,而是满足。
2.2、卷积层
卷积层的作用是提取一个局部区域的特征,不同的卷积核相当于不同的特征提取器。
特征映射(Feature Map)为一幅图像(或其它特征映射)在经过卷积提取到的特征,每个特征映射可以作为一类抽取的图像特征。为了提高卷积网络的表示能力,可以在每一层使用多个不同的特征映射,以更好地表示图像的特征。
在输入层,特征映射就是图像本身。如果是灰度图像,就是有一个特征映射,深度;如果是彩色图像,分别有RGB三个颜色通道的特征映射,深度。
不失一般性,假设一个卷积层的结构如下:
输入特征映射组:为三维张量(tensor),其中每个切片(slice)矩阵为一个输入特征映射,。
输出特征映射组:为三维张量(tensor),其中每个切片(slice)矩阵为一个输出特征映射,。
卷积核:为四维张量,其中每个切片矩阵为一个两维卷积核,。
为了计算输出特征映射,用卷积核分别对输入特征映射进行卷积,然后将卷积结果相加,并加上一个标量偏置得到卷积层的净输入再经过非线性激活函数后得到输出特征映射。
在输入为,输出为的卷积层中,每个输出特征映射都需要个滤波器以及一个偏置。假设每个滤波器的大小为,那么共需要个参数。
2.3、汇聚层
汇聚层(Pooling Layer)也叫子采样层(Subsampling Layer),其作用是进行特征选择,降低特征数量,并从而减少参数数量。
常用的汇聚函数有两种:
- 最大汇聚(Maximum Pooling):一般是取一个区域内所有神经元的最大值。
其中为区域内每个神经元的激活值。
- 平均汇聚(Mean Pooling):一般是取区域内所有神经元的平均值。
可以看出,汇聚层不但可以有效地减少神经元的数量,还可以使得网络对一些小的局部形态改变保持不变性,并拥有更大的感受野。
典型的汇聚层是将每个特征映射划分为大小的不重叠区域,然后使用最大汇聚的方式进行下采样。汇聚层也可以看做是一个特殊的卷积层,卷积核大小为,步长为,卷积核为函数或函数。过大的采样区域会急剧减少神经元的数量,会造成过多的信息损失。
2.4、典型卷积网络结构
一个典型的卷积网络是由卷积层、汇聚层、全连接层交叉堆叠而成。
目前常用卷积网络结构如图所示,一个卷积块为连续个卷积层和个汇聚层(通常设置为,为或)。一个卷积网络中可以堆叠个连续的卷积块,然后在后面接着个全连接层(的取值区间比较大,比如或者更大;一般为)。
目前,整个网络结构趋向于使用更小的卷积核(比如和)以及更深的结构(比如层数大于50)。此外,由于卷积的操作性越来越灵活(比如不同的步长),汇聚层的作用变得也越来越小,因此目前比较流行的卷积网络中,汇聚层的比例也逐渐降低,趋向于全卷积网络。
3、参数学习
在全连接前馈神经网络中,梯度主要通过每一层的误差项进行反向传播,并进一步计算每层参数的梯度。在卷积神经网络中,主要有两种不同功能的神经层:卷积层和汇聚层。而参数为卷积核以及偏置,因此只需要计算卷积层中参数的梯度。
不失一般性,第层为卷积层,第层的输入特征映射为,通过卷积计算得到第层的特征映射净输入,第层的第个特征映射净输入
由得:
同理可得,损失函数关于第层的第个偏置的偏导数为:
在卷积网络中,每层参数的梯度依赖其所在层的误差项。
3.1、误差项计算
卷积层和汇聚层中,误差项的计算有所不同,因此我们分别计算其误差项。
3.1.1、汇聚层的误差项
第层的第个特征映射的误差项的具体推导过程如下:
其中为第层使用的激活函数导数,为上采样函数(upsampling),与汇聚层中使用的下采样操作刚好相反。如果下采样是最大汇聚(max pooling),误差项中每个值会直接传递到上一层对应区域中的最大值所对应的神经元,该区域中其它神经元的误差项的都设为0。如果下采样是平均汇聚(meanpooling),误差项中每个值会被平均分配到上一层对应区域中的所有神经元上。
3.1.2、卷积层的误差项
第层的第个特征映射的误差项的具体推导过程如下:
其中为宽卷积。
4、几种典型的卷积神经网络
4.1、LeNet-5
LeNet-5虽然提出的时间比较早,但是是一个非常成功的神经网络模型。基于LeNet-5 的手写数字识别系统在90年代被美国很多银行使用,用来识别支票上面的手写数字。LeNet-5 的网络结构如图:
不计输入层,LeNet-5共有7层,每一层的结构为:
输入层:输入图像大小为32 × 32 = 1024。
C1层是卷积层,使用6个5×5的滤波器,得到6组大小为28×28=784的特征映射。因此,C1层的神经元数量为6×784=4704,可训练参数数量为6×25+6=156,连接数为156×784=122304(包括偏置在内,下同)。
S2层为汇聚层,采样窗口为2×2,使用平均汇聚,加一个非线性函数。神经元个数为6×14×14=1176,可训练参数数量为6×(1+1)=12,连接数为6×196×(4+1)=5880。
C3层为卷积层。LeNet-5中用一个连接表来定义输入和输出特征映射之间的依赖关系,如下图所示。共使用60个5×5的滤波器,得到16组大小为10×10的特征映射(如果不使用连接表,则需要96个5×5的滤波器)。神经元数量为16×100=1600,可训练参数数量为(60×25)+16 =1516,连接数为100×1516=151600。
S4层是一个汇聚层,采样窗口为2×2,得到16个5×5大小的特征映射,可训练参数数量为16×2=32,连接数为16×25×(4+1)=2000。
C5层是一个卷积层,使用120×16=1920个5×5的滤波器,得到120组大小为1×1的特征映射。C5层的神经元数量为120,可训练参数数量为1920×25+120=48120,连接数为120×(16×25+1)=48120。
F6层是一个全连接层,有84个神经元,可训练参数数量为84×(120+1)=10164。连接数和可训练参数个数相同,为10164。
输出层:输出层由10个欧氏径向基函数(Radial Basis Function,RBF)函数组成。这里不再详述。
4.2、AlexNet
AlexNet是第一个现代深度卷积网络模型,其首次使用了很多现代深度卷积网络的一些技术方法,比如采用了ReLU作为非线性激活函数,使用Dropout防止过拟合,使用数据增强来提高模型准确率等。AlexNet 赢得了2012 年ImageNet 图像分类竞赛的冠军。
AlexNet的结构如图,包括5个卷积层、3个全连接层和1个softmax层。因为网络规模超出了当时的单个GPU的内存限制,AlexNet 将网络拆为两半,分别放在两个GPU上,GPU间只在某些层(比如第3层)进行通讯。
AlexNet的具体结构如下:
输入层,大小为224×224×3的图像。
第一个卷积层,使用两个大小为11×11×3×48的卷积核,步长s=4,零填充p=3,得到两个大小为55×55×48的特征映射组。
第一个汇聚层,使用大小为3×3的最大汇聚操作,步长s=2,得到两个27×27×48的特征映射组。
第二个卷积层,使用两个大小为5×5×48×128的卷积核,步长s=1,零填充p=2,得到两个大小为27×27×128的特征映射组。
第二个汇聚层,使用大小为3×3的最大汇聚操作,步长s=2,得到两个13×13×128的特征映射组。
第三个卷积层为两个路径的融合,使用一个大小为3×3×256×384的卷积核,步长s=1,零填充p=1,得到两个大小为13×13×192的特征映射组。
第四个卷积层,使用两个大小为3×3×192×192的卷积核,步长s=1,零填充p=1,得到两个大小为13×13×192的特征映射组。
第五个卷积层,使用两个大小为3×3×192×128的卷积核,步长s=1,零填充p=1,得到两个大小为13×13×128的特征映射组。
汇聚层,使用大小为3×3的最大汇聚操作,步长s=2,得到两个大小为6×6×128的特征映射组。
三个全连接层,神经元数量分别为4096,4096 和1000。
4.3、Inception网络
在卷积网络中,如何设置卷积层的卷积核大小是一个十分关键的问题。在Inception网络中,一个卷积层包含多个不同大小的卷积操作,称为Inception模块。Inception网络是由有多个inception模块和少量的汇聚层堆叠而成。
v1版本的Inception模块,采用了4组平行的特征抽取方式,分别为1×1、3× 3、5×5的卷积和3×3的最大汇聚。同时,为了提高计算效率,减少参数数量,Inception模块在进行3×3、5×5的卷积之前、3×3的最大汇聚之后,进行一次1×1的卷积来减少特征映射的深度。如果输入特征映射之间存在冗余信息,1×1的卷积相当于先进行一次特征抽取。
Inception网络最早的v1版本就是非常著名的GoogLeNet,并赢得了2014年ImageNet图像分类竞赛的冠军。
4.4、残差网络
残差网络(Residual Network,ResNet)是通过给非线性的卷积层增加直连边的方式来提高信息的传播效率。
假设在一个深度网络中,我们期望一个非线性单元可以去逼近一个目标函数。如果将目标函数拆分成两部分:恒等函数和残差函数:
根据通用近似定理,一个由神经网络构成的非线性单元有足够的能力来近似逼近原始目标函数或残差函数,但实际中后者更容易学习。
下图给出了一个典型的残差单元示例。残差单元由多个级联的(等长)卷积层和一个跨层的直连边组成,再经过ReLU激活后得到输出。残差网络就是将很多个残差单元串联起来构成的一个非常深的网络。