二、卷积层、池化层
卷积运算在神经网络中通过卷基层来实现。
对于卷积层的分层有两种观点:
卷积层是由复杂的、三个阶段的子层组成的(如左图所示)。
第一阶段子层:执行卷积运算。
这个阶段是线性变换,其作用是从输入中提取特征。
第二阶段子层:执行非线性的激活函数(如
reLU
单元)。这个阶段是非线性变换,其作用是引入非线性。
实际应用中,这一阶段可以被丢弃,因为第三阶段也可以引入非线性。
第三阶段子层:通过池化函数来调整输出。
这个阶段也是非线性变换,其作用是降低输出的维度,但保留了大部分重要的信息。
卷积层是简单的,仅仅包含卷积运算(如右图所示)。这是目前最流行的观点。
在这个观点中,卷积层、非线性激活层、池化层都是简单的网络层,它们相互配合使用。它们的作用参考前面的三个阶段子层。
2.1 卷积层
- 传统的网络层要求输入的每个样本各维度是固定长度的,卷积层可以处理各维度非固定长度的样本数据,如:输入的图片可以为不同的分辨率。
- 卷积层的卷积运算主要包含了三个重要的思想:稀疏交互
sparse interactions
、参数共享parameter sharing
、等变表示equivariant representation
。
2.1.1 稀疏交互
传统的网络层是全连接的,使用矩阵乘法来建立输入与输出的连接关系。矩阵的每个参数都是独立的,它描述了每个输入单元与输出单元的交互。这意味着每个输出单元与所有的输入单元都产生关联。
卷积层通过使用核矩阵来实现稀疏交互(也称作稀疏连接,或者稀疏权重),每个输出单元仅仅与少量的输入单元产生关联。
这降低了网络的参数和计算量,不仅减少了模型的存储需求,也降低了计算复杂度。
每个输入单元影响的输出单元:
- 对于传统全连接层,每个输入单元影响了所有的输出单元。
- 对于卷积层,每个输入单元只影响了3个输出单元(核尺寸为3时)。
每个输出单元依赖的输入单元:
- 对于传统全连接层,每个输出单元依赖所有的输入单元。
- 对于卷积层,每个输出单元只依赖3个输入单元(核尺寸为3时)。
在卷积神经网络中,虽然卷积层每个输出单元只依赖于少量的直接输入单元,但是它可能间接依赖于大部分的间接输入单元。
处在卷积网络更深层的单元,其接受域(即影响它的神经元)要比处在浅层的单元的接受域更大。
2.1.2 参数共享
参数共享:在模型的多个位置使用相同的参数。
传统的全连接层中,权重矩阵不同位置处的参数相互独立。
卷积层中,同一个核会在输入的不同区域做卷积运算。
- 核函数会在输入的不同区域之间共享,这些区域的大小就是核函数的大小。
- 物理意义:将小的、局部区域上的相同的线性变换(由核函数描述),应用到输入的很多区域上。
卷积运算在存储需求和计算效率方面要大大优于传统网络层的稠密矩阵的乘法运算。
网络参数比较:
- 对于传统全连接层: 的权重 只使用了一次 。
- 对于卷积层: 的权重 被共享到 。
2.1.3 等变表示
如果一个函数满足:输入发生改变,输出也以同样的方式改变,则称它是等变的
equivariant
。如果函数 满足 ,则称 对于变换 具有等变性。
对于卷积层,它具有平移等变的性质:如果 是输入的任何一个平移函数(如:将图片向右移动一个像素),则下面的两个操作的结果是相同的:
- 先对图片进行卷积之后,再对结果应用平移函数
- 先对图片应用平移函数 ,再对图片进行卷积
因为根据定义有:
例如:
- 当处理时间序列时,如果把输入中的一个事件向后延时,则卷积的输出中也发生相应的延时。
- 当处理图像时,如果平移了输入的图片,则卷积的输出结果也平移了相同的量。
卷积对于某些变换并不是等变的:如缩放变换(改变图像的尺寸)、角度变换(旋转)。
这些非等变的变换需要其它机制来处理(而不是卷积)。
2.2 池化层
池化运算也叫亚采样或者下采样。池化运算用一个矩阵区域内部的某个总体统计量来作为神经网络在该矩阵区域的输出,它综合了该矩阵区域的信息。
- 最大池化:定义一个窗口,并从窗口内取出最大值作为总体统计量。
- 均值池化:定义一个窗口,并从窗口内取出平均值作为总体统计量。
- 其他常见的还有: 范数以及基于中心像素距离的加权平均函数作为总体统计量。
池化层就是对输入专门执行池化运算的网络层。
池化层可以减少该层的输出数量。这意味着减少了网络下一层的输入数量,可以减少网络整体参数数量,降低计算量,减少参数存储需求,提高网络计算效率。
池化层输出的数量由池化的宽度 和步幅 决定。设输入单元的数量为 ,设池化的位置为 ,则有:
每个位置对应一个输出单元,因此输出单元的数量为 ,其中 为向下取整数。
如下所示,池化层的输入单元数量为 6 ,池的宽度为3、步幅为 2,池化层的输出单元数量为 2 。
池化层的宽度 可以随着输入图片尺寸的不同而动态调整,这可以解决图像任务中输入图像尺寸不同的问题。
2.2.1 平移近似不变性
当输入做出了少量的平移时,最大池化能够获得输出的近似不变性。即:当输入平移一个微小的量时,经过最大池化的输出近似不变。
下图给出了输入右移了一个单位时,最大池化的输出。可以看到:当输入的每个位置的值都发生改变时,最大池化的输出只有一半的值发生了改变。
最大池化平移近似不变性的原因:最大池化单元只对周围存在的最大值比较敏感,而不关心最大值的精确位置。
如下图所示,平均池化并没有平移近似不变性。事实上,最大池化、平均池化、以及其它池化对于平移变换均具有等变性。
局部平移不变性是个很重要的性质。该性质表明:网络只关心某个特征是否出现,而不关心它出现的具体位置。如:判断是否人脸时,并不关心眼睛的具体位置,只需要知道一只眼睛在脸的左边、一只眼睛在脸的右边。
但是有些领域,特征的具体位置很重要。如:判断两条线段是否相交。
2.2.2 模拟其它不变性
最大池化只能对空间的平移具有不变性,而无法对空间的旋转具有不变性。
可以将空间的旋转角度进行离散化,每个角度对应一个卷积,然后采用最大池化。这种做法也可以实现空间的旋转不变性。
下图中,使用多个滤波器和一个最大池化单元可以学得旋转不变性。
- 当输入旋转某个角度时,对应的滤波器被激活。
- 只要任意一个过滤器被激活,最大池化单元也相应被激活。
最大池化的空间平移不变性是原生的,其他变换的不变性则必须采用这种多通道的方法来实现。
2.3 卷积层、池化层的先验
先验有强弱之分:
- 弱的先验具有较高的熵,即较大的不确定性。如:方差很大的高斯分布(方差无穷大就成了均匀分布)。
- 强的先验具有较低的熵,即很小的不确定性。如:方差很小的高斯分布(方差很小意味着随机变量取值几乎确定)。
一个无限强的先验对于参数在参数空间的某些取值的概率是0。即:永远不支持参数取这些值。
卷积层也可以看做是一个全连接层,但是它的权值有两个无限强的先验:
- 层内的权重都是重复的,同一个权重将复用多次。
- 层输出单元的接受区域内的权重非零,其它权重都是零。
这些先验表明:卷积层学得的函数只包含了局部连接关系,并且具有稀疏性、平移等变性。
最大池化层也是一个无限强的先验:每个最大池化单元都具有对少量平移的不变性。
卷积与池化只有当先验的假设合理,且正确时才有用。
如果任务依赖于保存精确的空间信息,那么使用最大池化将增大训练误差。
如果任务需要对输入中相隔较远的信息进行合并,那么卷积所需要的先验可能就不准确。
因为卷积拥有平移等变性,相隔的远近没有意义。
2.4 计算复杂度
对于卷积层,假设输入的
feature map
为:宽度 、高度 、输入通道数 。假设一共 个卷积核,每个卷积核的宽度为 、高度为 。假设沿着宽度方向卷积的步幅为 ,沿着高度方向卷积的步幅为 。则输出的
feature map
的几个参数为(其中 为向下取整数):宽度:
其推导过程参考池化层的推导。
高度:
输出通道数
卷积过程中的几个指标:
参数数量: ,它也就是核张量的尺寸。
计算量(以一次
乘-加
计算为单位):考虑输出
feature map
中的每一个值,每个值都是通过一次卷积计算得到。每个卷积计算的乘-加
运算量为 。 一共有 这样的值,则最终计算复杂度为上式。
对于池化层,假设输入的
feature map
为:宽度 、高度 、输入通道数 。假设池化窗口的宽度为 、高度为 。假设沿着宽度方向池化的步幅为 ,沿着高度方向池化的步幅为 。则输出
feature map
的几个参数为:- 宽度:
- 高度:
- 输出通道数
池化过程中的几个指标:
参数数量:0 。因为池化过程是无参数的。
计算量(以一次求最大值或者均值的计算为单位):
考虑输出
feature map
中的每一个值,每个值都是通过一次池化计算得到。每个池化计算的运算量为 1 个单位。 一共有 这样的值,则最终计算复杂度为上式,其中 。
事实上,单次求最大值或者均值的计算量要小于单次
乘-加
的计算量,因此池化层的计算量要远远小于卷积层的计算量。对于普通的全连接层,假设输入单元数量为 个,输出单元数量为 个,其中: , 。
则:
参数数量: 。
因此,全连接层的参数数量是卷积层参数数量的 倍。
当输入
feature map
宽高为32x32
,卷积核宽高为2x2
,步长为1时,全连接层的参数数量是卷积层参数数量的 24.6 万倍。计算量:(以一次
乘-加
计算为单位): 。因此,全连接层的计算量是卷积层计算量的 倍。
当输入
feature map
宽高为32x32
,卷积核宽高为2x2
,步长为1时,全连接层的计算量是卷积层计算量的 256 倍。
2.5 全连接层转卷积层
通常情况下,卷积神经网络的最后几层都是全连接层加一个输出层(如:一个
softmax
层)。事实上,全连接层可以和卷积层相互转换。
假设在全连接之前,网络的
feature map
的形状为 ,即:通道数为 、宽度为 、高度为 。假设输出一个长度为 的一维向量。- 如果后接全连接层,则需要将其展平为长度为 的一维向量。权重 ,一共有 个参数。
- 如果后接卷积层,则需要 个卷积核,每个卷积核的尺寸都是 。一共有 个参数。
- 如果将 重新
reshape
成一个尺寸为、输入通道为 的卷积核,则它恰好与后接卷积层的第 个卷积核相同。而且二者都是输入的线性组合,因此二者可以相互转换。
全连接层转卷积层的优点:可以适应尺寸多变的输入图像。
如果是全连接层,则全连接层的输入大小是固定的。
如果网络的输入尺寸发生变化,则该变化会传递到全连接层,而全连接层无法处理可变的输入。
如果是卷积层,则它对输入大小没有限制。
全卷积网络
FCN
就是将CNN
网络后面的几个全连接层替换为卷积层,它可以高效的对测试图像做滑动窗口式的预测。在测试阶段,如果图像尺寸大于网络的输入尺寸,则通常需要对图像进行多次裁剪。通常裁剪左上、左下、右上、右下、中间,以及翻转之后的这5个位置,一共10个位置进行预测。
即:每张大图片需要裁剪10张标准输入大小的图片,然后取这10次预测的综合结果作为该张图片的预测结果。
如果采用全卷积网络,则不需要做任何裁剪就可以直接预测,这大大提高了预测效率。
下图中,绿色表示卷积核,蓝色表示
feature map
。上半图:测试图像的尺寸与网络的输入尺寸相同,输出一个概率。
下半图:测试图像的尺寸较大时,输出一组概率。
它等效于:先将测试图像先执行所有可能的裁剪(这里是
2x2=4
种);然后预测所有裁剪图片的概率;然后将这一组概率取平均,即可得到测试图像的概率。它的计算效率远远高于全连接的原始方法,因为它节省了大量的共享计算。
例:在
VGG-net
中,训练图像尺寸是224x224
的,展平之前的feature map
尺寸为512x7x7
。如果测试图像尺寸是
384x384
的,展平之前的feature map
尺寸为512x12x12
。如果使用全连接层,则无法处理这种尺寸的输入(展平后全连接层的输入尺寸不匹配)。
如果后接卷积层,则卷积核的尺寸为
7x7
、通道数1000
,最终的输出的结果尺寸为1000x6x6
。它表示分别对测试图像的36个位置使用了原始的
CNN
,平均这36个位置的各类别概率,则得到了最终的 1000 个类别的概率 。它比等效的执行36次原始的
CNN
+ 全连接的形式节省了大量的共享计算。