文章

卷积神经网络

卷积神经网络

1.卷积神经网络发展

卷积神经网络(Convolutional Neural Networks, CNN)是一类包含卷积计算且具有深度结构的前馈神经网络(Feedforward Neural Networks),是深度学习的代表算法之一 。卷积神经网络具有表征学习(representation learning)能力,能够按其阶层结构对输入信息进行平移不变分类(shift-invariant classification),因此也被称为“平移不变人工神经网络(Shift-Invariant Artificial Neural Networks, SIANN)” 。

1.1 传统的图像处理方法

在卷积神经网络诞生之前,图像处理方法的研究重点都集中在特征提取和特征分类,由此研究人员提出了多种形式的特征分类器,代表性的特征有SIFT(scale-invariant feature transform)、Haar、HOG(histogram of oriented gradient)、Strip;代表性的分类器有AdaBoost、SVM(support vector machine)、DPM(deformable parts model)、RF(random forest)等,

由于传统方法使用手动设计的特征,即使运用最好的非线性分类器进行特征分类,准确度也达不到实际需求。设计的特征存在如下三个缺点:

  • 设计的特征为低层特征,对目标的表达能力不足;
  • 设计的特征可分性较差,导致分类的错误率较高;
  • 设计的特征具有针对性,很难选择单一特征应用于其它场景。

1.2 深度学习的图像处理方法

为了提取更好的特征,Hinton 在 2006 年提出了深度学习,利用深度神经网络从大量的数据中自动地学习高层特征。相比于设计的特征,学习的特征更加丰富、表达能力更强。随着深度学习的不断发展,研究者发现利用卷积神经网络进行图像处理,准确度可以获得较大的提升。不仅因为卷积神经网络提取了高层特征,提高了特征的表达能力,还因为卷积神经网络将特征提取、特征选择和特征分类融合在同一模型中,通过端到端的训练,从整体上进行功能优化,增强了特征的可分性。所以,基于卷积神经网络的图像处理得到了广泛的关注,成为当前计算机视觉领域的研究热点之一。

2. 卷积神经网络的基本结构

卷积神经网络是一个层次模型,主要包括输入层卷积层池化层激活层全连接层以及输出层。卷积神经网络专门针对图像而设计,主要特点在于卷积层的特征是由前一层的局部特征通过卷积共享的权重得到。在卷积神经网络中,输入图像通过多个卷积层和池化层进行特征提取,逐步由低层特征变为高层特征; 高层特征再经过全连接层和输出层进行特征分类,产生一维向量,表示当前输入图像的类别。因此,根据每层的功能,卷积神经网络可以划分为两个部分: 由输入层、卷积层、激活层和池化层构成特征提取器,以及由全连接层和输出层构成分类器

fdd7969cd2a9f8a719e1ef1b6160932d

2.1 输入层

输入层(Input Layer)通常是输入卷积神经网络的原始数据或经过预处理的数据,可以是图像识别领域中原始三维的多彩图像,也可以是音频识别领域中经过傅利叶变换的二维波形数据,甚至是自然语言处理中一维表示的句子向量。以图像分类任务为例,输入层输入的图像一般包含 $RGB$ 三个通道,是一个由长宽分别为 $H$ 和 $W$ 组成的3维像素值矩阵 $H × W × 3$,卷积网络会将输入层的数据传递到一系列卷积、池化等操作进行特征提取和转化,最终由全连接层对特征进行汇总和结果输出。根据计算能力、存储大小和模型结构的不同,卷积神经网络每次可以批量处理的图像个数不尽相同,若指定输入层接收到的图像个数为 $N$ ,则输入层的输出数据为 $N × H × W × 3$。

2.2 卷积层

卷积层(Convolution Layer)通常用作对输入层输入数据进行特征提取,卷积层越多,特征的表达能力越强。卷积操作原理上其实是对两张像素矩阵进行点乘求和的数学操作,其中一个矩阵为输入的数据矩阵,另一个矩阵则为卷积核(滤波器或特征矩阵),求得的结果表示为原始图像中提取的特定局部特征。

f7b1af6afd71b6820400cbd4ffa83b1f

2.3 激活层

激活层(Activation Layer)负责对卷积层抽取的特征进行激活,由于卷积操作是由输入矩阵与卷积核矩阵进行相差的线性变化关系,需要激活层对其进行非线性的映射。激活层主要由激活函数组成,即在卷积层输出结果的基础上嵌套一个非线性函数,让输出的特征图具有非线性关系。

2.4 池化层

池化层又称为降采样层(Downsampling Layer),作用是对感受域内的特征进行筛选,提取区域内最具代表性的特征,能够有效地降低输出特征尺度,进而减少模型所需要的参数量。按操作类型通常分为最大池化(Max Pooling)、平均池化(Average Pooling)和求和池化(Sum Pooling),它们分别提取感受域内最大、平均与总和的特征值作为输出,最常用的是最大池化。

4c02768e1635a345fb7b9b74f16c503f

2.5 全连接层

全连接层(Full Connected Layer)位于特征提取之后,将前一层的所有神经元与当前层的每个神经元相连接。全连接层会根据输出层的具体任务,有针对性地对高层特征进行映射,全连接层负责对卷积神经网络学习提取到的特征进行汇总,将多维的特征输入映射为二维的特征输出,高维表示样本批次,低维常常对应任务目标。

a19eb87869131961387ff9f16b50139d

2.6 输出层

卷积神经网络中输出层的上游通常是全连接层,因此其结构和工作原理与传统前馈神经网络中的输出层相同。输出层的形式面向具体任务。对于图像分类问题,输出层使用逻辑函数或归一化指数函数(softmax function)输出分类标签 。在物体识别(object detection)问题中,输出层可设计为输出物体的中心坐标、大小和分类 。在图像语义分割中,输出层直接输出每个像素的分类结果。

3. 不同层次的卷积提取到的特征有什么不同?

在卷积神经网络中,不同层次的卷积操作提取到的特征类型是不相同的,一般来说不同深度卷积提取到的特征如下表所示

卷积层次特征类型特征
浅层卷积边缘特征颜色、纹理、边缘、棱角信息
中层卷积局部特征形状
深层卷积全局特征某个物体

c79b7e0bee5f1a5d2060ab1b66ea4011

fe050521eee1e3439e791abc7fc401d3

图像与不同卷积核的卷积可以用来执行边缘检测、锐化和模糊等操作。下表就显示了应用不同类型的卷积核(滤波器)后的各种卷积图像。

作用卷积核卷积后图像
原图\(\begin{bmatrix} 0&0&0\ 0&1&0\ 0&0&0\ \end{bmatrix}\) 
边缘检测(突出边缘差异)\(\begin{bmatrix} 1&0&-1\ 0&0&0\ -1&0&1\ \end{bmatrix}\) 
边缘检测(突出中间值)\(\begin{bmatrix} -1&-1&-1\ -1&8&-1\ -1&-1&-1\ \end{bmatrix}\) 
高斯模糊\(\begin{bmatrix} 1&2&1\ 2&4&2\ 1&2&1\ \end{bmatrix} * 1/16\) 
方框滤波\(\begin{bmatrix} 1&1&1\ 1&1&1\ 1&1&1\ \end{bmatrix} * 1/9\) 

原图

\[\begin{bmatrix} 0&0&0\\ 0&1&0\\ 0&0&0\\ \end{bmatrix}\]

4d695ae2a63305cff65bd24a1d433b63

边缘检测(突出边缘差异)

\[\begin{bmatrix} 1&0&-1\\ 0&0&0\\ -1&0&1\\ \end{bmatrix}\]

ec3a54c1f6806752d454b520d10c0751

边缘检测(突出中间值)

\[\begin{bmatrix} -1&-1&-1\\ -1&8&-1\\ -1&-1&-1\\ \end{bmatrix}\]

59bb4aefe9574a5442afc84d30dc7f42

高斯模糊

\[\begin{bmatrix} 1&2&1\\ 2&4&2\\ 1&2&1\\ \end{bmatrix} * 1/16\]

31f359279eec6c95f23e593ef1e297aa

方框滤波

\[\begin{bmatrix} 1&1&1\\ 1&1&1\\ 1&1&1\\ \end{bmatrix} * 1/9\]

ad1a23a69cce3f0cccaae3c226f35600

4. 卷积层的基本参数

参数名作用常见设置
卷积核大小 (Kernel Size)卷积核的大小定义了卷积的感受野从底层优化的角度来讲,$3×3$是最优的,但近些年也有一些超大卷积核($31×31$)的相关研究
步长 (Stride)定义了卷积核在卷积过程中的步长常见设置为1,表示滑窗距离为1,可以覆盖所有相邻位置特征的组合;当设置为更大值时相当于对特征组合降采样;
填充 (Padding)在卷积核尺寸不能完美匹配输入的图像矩阵时需要进行一定的填充策略Tensorflow或Keras设置为’SAME’表示对不足卷积核大小的边界位置进行某种填充(通常零填充)以保证卷积输出维度与与输入维度一致;当设置为’VALID’时则对不足卷积尺寸的部分进行舍弃,输出维度就无法保证与输入维度一致
输入通道数 (In Channels)指定卷积操作时卷积核的深度默认与输入的特征矩阵通道数(深度)一致;在某些压缩模型中会采用通道分离的卷积方式
输出通道数 (Out Channels)指定卷积核的个数若设置为与输入通道数一样的大小,可以保持输入输出维度的一致性;若采用比输入通道数更小的值,则可以减少整体网络的参数量

5. 卷积层的输出尺寸

假设一个卷积层的输入特征图的尺寸为 $l_w^{(i)}×l_h^{i}$,卷积核大小为 $k_w×k_h$ ,步长为 ,则 $s_w × s_h$ 输出特征图的尺寸 $l_w^{(o)}×l_h^{(o)}$ 如何计算?如果输入特征图的通道数为 $c^{(i)}$ ,输出特征图的通道数为 $c^{(o)}$,在不考虑偏置的情况下,卷积层的参数量和计算量如何计算?

假设卷积核的滑动过程中,我们对输入特征图的左右两侧分别进行了$p_w$ 填充,上下两列分别进行了 $p_h$ 填充,填充后的特征图尺寸为

\[\left(l_{w}^{(i)}+2 p_{w}\right) \times \left(l_{h}^{(i)}+2 p_{h}\right)\]

,则输出特征图的尺寸为

\[l_{e}^{(o)}=\frac{l_{e}^{(i)}+2 p_{e}-k_{e}}{s_{e}}+1, \quad e \in\{w, h\}\]

上述公式在步长 $S_e>1$ 时,可能会出现非整数的情况,此时,很多深度学习框架会采取向下取整的方式,放弃输入特征图的一部分边界数据,使得最终的输出特征图尺寸为

\[l_{e}^{(o)}=\left\lfloor\frac{l_{e}^{(i)}+2 p_{e}-k_{e}}{s_{e}}\right\rfloor+1, \quad e \in\{w, h\}\]

例如Caffe和Pytorch会放弃输入特征图的左侧和上侧的一部分数据,使得卷积核滑动窗恰好能到达最右下角的点。

有些深度学习框架(如TensorFlow、Keras)在做卷积运算时无法显示指定输入特征图的边界填充尺寸(当然可以在做卷积之前手动填充),只能选择以下几种预先定义好的填充模式。

  • 若选择padding=same,则会在输入特征图的左右两侧一共填充 $p_w^+k_w-1$ 列,上下两侧一共填充 $p_h^+k_h-1$ 行,最终的输出特征图尺寸为 \(l_{e}^{(o)}=\left\lfloor\frac{l_{e}^{(i)}-1}{s_{e}}\right\rfloor+1, \quad e \in\{w, h\}\) 例如在TensorFlow中,如果 $p_e^+$ 为偶数,则在输入特征图的左右两侧或上下两侧填充相等数目的列/行;如果为奇数,会让右侧/下侧比左侧/上侧多填充一列/行。
  • 若选择padding=valid,则不会对输入特征图进行边界填充,而是直接放弃右侧和下侧卷积核无法滑动到的区域,此时输出特征图尺寸为
\[l_{e}^{(o)}=\left\lfloor\frac{l_{e}^{(i)}-k_{e}}{s_{e}}\right\rfloor+1, \quad e \in\{w, h\}\]

6. 卷积层的参数量

卷积层的参数量主要取决于每个卷积核的参数量以及卷积核的个数。在这里,每个卷积核含有 $c^{(i)}k{w} k{h}$ 个参数,而卷积核的个数即输出特征图的通道数 $c^{(o)}$ ,因此参数总量为

\[c^{(i)} c^{(o)} k_{w}k_{h}\]

7. 卷积层的计算量

卷积层的计算量,由卷积核在每个滑动窗口内的计算量以及整体的滑动次数决定。在每个滑动窗内,卷积操作的计算量大约为 $c^{(i)}k{w} k{h}$,而卷积核的滑动次数即输出特征图的数据个数,也就是$\mathcal{c}^{(o)} l{w}^{(o)} l{h}^{(o)}$,因此整体的计算量为

\[c^{(i)} c^{(o)} l_{w}^{(o)} l_{h}^{(o)} k_{w} k_{h}\]

一般情况下,有$k{e} \ll l{e}^{(i)}, p{e} \ll l{e}^{(i)}, e \in{w, h}$,因此可上式可简写为

\[c^{(i)} c^{(o)} l_{w}^{(i)} l_{h}^{(i)} k_{w} k_{h} /\left(s_{w} s_{h}\right)\]

8. 卷积的变种

8.1 分组卷积

971c7f33e4a009b1a12ed1064350bffe

分组卷积就是将输入通道和输出通道都划分为同样的组数,然后仅让处于相同组号的输入通道和输出通道相互进行“全连接”,如下图所示,如记 $g$ 为输入/输出通道所分的组数,则分组卷积能够将卷积操作的参数量和计算量都降低为普通卷积的 $1/g$,分组卷积最初是在AlexNet网络中引入的。当时是为了解决单个GPU无法处理含有较大计算量和存储需求的卷积层问题。目前随着硬件设备的不断升级,分组卷积多被用于移动设备的小型网络模型。

8.2 转置卷积

286ac2cfb69abf4d8aa06b8eeb39ced3

转置卷积也被称为反卷积(deconvolution),它可以看作是普通卷积的一个“对称”操作,这种“对称性体现在以下两个方面”:

  • 转置卷积能将普通卷积中输入到输出的尺寸变换逆反过来,这里需要注意的是,输入特称图经过普通卷积操作后再经过转置卷积,只是恢复了形状,并不能复原具体的取值。
  • 转置卷积的信息正向传播于普通卷积的误差反向传播所用的矩阵相同,反之亦然。

普通卷积和转置卷积所处理的基本任务是不同的。前者主要用来做特征提取,倾向于压缩特征图尺寸;后者主要用于对特征图进行扩张或上采样,代表性的场景如下:

  • 语义分割/实例分割
  • 一些物体检测、关键点检测
  • 图像的自编码器、变分自编码器、生成对抗网络等

8.3 空洞卷积

4959201e816888c6648f2e78cccfd253

空洞卷积是针对图像语义分割问题中下采样会降低图像分辨率、丢失信息而提出的一种卷积思路。利用添加空洞扩大感受野,让原本 3x3 的卷积核,在相同参数量和计算量下拥有5x5(dilated rate =2)或者更大的感受野,从而无需下采样。

扩张卷积(dilated convolutions)又名空洞卷积(atrous convolutions),向卷积层引入了一个称为 “扩张率(dilation rate)”的新参数,该参数定义了卷积核处理数据时各值的间距。换句话说,相比原来的标准卷积,扩张卷积(dilated convolution) 多了一个hyper-parameter(超参数)称之为dilation rate(扩张率),指的是kernel各点之前的间隔数量,正常的convolution 的 dilatation rate为 1。

空洞卷积优点

在不做pooling损失信息和相同的计算条件下的情况下,加大了感受野,让每个卷积输出都包含较大范围的信息。空洞卷积经常用在实时图像分割中。当网络层需要较大的感受野,但计算资源有限而无法提高卷积核数量或大小时,可以考虑空洞卷积。
空洞卷积缺点

Dilated Convolution的kernel并不连续,也就是并不是所有的像素都用来计算了,因此这里将信息看作checker-board的方式将会损失信息的连续性。(即栅格效应,膨胀卷积不能覆盖所有的图像特征,如下图所示)

b66c4bc70921d6e2592dc6752d6c1f8d

8.4 深度可分离卷积

Separable Convolution 在 Google的 Xception以及MobileNet论文中均有描述。它的核心思想是将一个完整的卷积运算分解为两步进行,分别为Depthwise Convolution与Pointwise Convolution。

同样是上述例子,一个大小为 64×64 像素、三通道彩色图片首先经过第一次卷积运算,不同之处在于此次的卷积完全是在二维平面内进行,且Filter的数量与上一层的Depth相同。所以一个三通道的图像经过运算后生成了3个Feature map,如下图所示。

Depthwise Convolution

Depthwise Convolution完成后的Feature map数量与输入层的depth相同,但是这种运算对输入层的每个channel独立进行卷积运算后就结束了,没有有效的利用不同map在相同空间位置上的信息。因此需要增加另外一步操作来将这些map进行组合生成新的Feature map,即接下来的Pointwise Convolution。

e97b1b775ce72fa2b773333b2c9f8fdd

Pointwise Convolution

Pointwise Convolution的运算与常规卷积运算非常相似,不同之处在于卷积核的尺寸为 1×1×M ,M 为上一层的 depth。所以这里的卷积运算会将上一步的map在深度方向上进行加权组合,生成新的Feature map。有几个Filter就有几个Feature map。如下图所示。

3c16d0f9e5a91d95135eee94b2f1f71b

8.5 Ghost卷积

17f5e0cc237b0e7ed423fe8b05ad3aaf

来自华为诺亚方舟实验室,发表于2020年的CVPR上。提供了一个全新的Ghost模块,旨在通过廉价操作生成更多的特征图。其原理如上图所示。

9. 有哪些池化方法?

池化操作通常也叫做子采样(Subsampling)或降采样(Downsampling),在构建卷积神经网络时,往往会用在卷积层之后,对感受野内的特征进行选择,提取区域内最具代表性的特征,能够有效地减少输出特征数 量,进而减少模型参数量。按操作类型通常分为最大值池化(Max Pooling)、平均池化(Average Pooling)和求和池化(Sum Pooling),它们分别提取感受野内最大值、平均与总和的特征值作为输出,最常用的是最大值池化和平均池化 。

池化层大大降低了网络模型参数和计算成本,也在一定程度上降低了网络过拟合的风险。概括来说,池化层主要有以下四点作用:

  • 增大网络感受野;
  • 抑制噪声,降低信息冗余;
  • 降低模型计算量,降低网络优化难度,防止网络过拟合;
  • 使模型对输入图像中的特征位置变化更加鲁棒。

9.1 Max Pooling(最大值池化)

acc5f3a55fac008f405b90e9f9f1378b

对于最大池化操作,只选择每个矩形区域中的最大值进入下一层,而其他元素将不会进入下一层。所以最大池化提取特征图中响应最强烈的部分进入下一层,这种方式摒弃了网络中大量的冗余信息,使得网络更容易被优化。同时这种操作方式也常常丢失了一些特征图中的细节信息,所以最大池化更多保留些图像的纹理信息。

9.2 Average Pooling(平均值池化)

b80dcaa27bf9ffdb13637519bff86693

平均池化取每个矩形区域中的平均值,可以提取特征图中所有特征的信息进入下一层,而不像最大池化只保留值最大的特征,所以平均池化可以更多保留些图像的背景信息。

9.3 Global Average Pooling(全局平均池化)

af01033f85e22fafa5382abc36fbab82

作为全连接层的替代操作,GAP对整个网络在结构上做正则化防止过拟合,直接剔除了全连接层中黑箱的特征,直接赋予了每个channel实际的类别意义。除此之外,使用GAP代替全连接层,可以实现任意图像大小的输入,而GAP对整个特征图求平均值,也可以用来提取全局上下文信息,全局信息作为指导进一步增强网络性能。

9.4 Mix Pooling(混合池化)

论文地址

为了提高训练较大CNN模型的正则化性能,受Dropout(将一半激活函数随机设置为0)的启发,Dingjun Yu等人提出了一种随机池化 Mix Pooling 的方法,随机池化用随机过程代替了常规的确定性池化操作,在模型训练期间随机采用了最大池化和平均池化方法,并在一定程度上有助于防止网络过拟合现象。其定义如下:

\[y_{k i j}=\lambda \cdot \max _{(p, q) \in \mathcal{R}_{i j}} x_{k p q}+(1-\lambda) \cdot \frac{1}{\left|\mathcal{R}_{i j}\right|} \sum_{(p, q) \in \mathcal{R}_{i j}} x_{k p q}\]

其中,$\lambda$ 是 0 或 1 的随机值,表示选择使用最大池化或平均池化,换句话说,混合池化以随机方式改变了池调节的规则,这将在一定程度上解决最大池和平均池所遇到的问题。

混合池化优于传统的最大池化和平均池化方法,并可以解决过拟合问题来提高分类精度。此外该方法所需要的计算开销可忽略不计,而无需任何超参数进行调整,可被广泛运用于CNN。

9.5 Stochastic Pooling(随机池化)

论文地址

随机池化Stochastic Pooling是Zeiler等人于ICLR2013提出的一种池化操作。随机池化的计算过程如下:

  • 先将方格中的元素同时除以它们的和sum,得到概率矩阵。
  • 按照概率随机选中方格。
  • pooling得到的值就是方格位置的值。

8d4da8c42c51e3516902ca6b96d86b4c

随机池化只需对特征图中的元素按照其概率值大小随机选择,即元素值大的被选中的概率也大,而不像max-pooling那样,永远只取那个最大值元素,这使得随机池化具有更强的泛化能力。

9.6 Power Average Pooling(幂平均池化)

论文地址

幂平均池化Power Average Pooling基于平均池化和最大池化的结合,它利用一个学习参数 $p$ 来确定这两种方法的相对重要性;当 $p = 1$ 时,使用局部求和,当 $p→∞$ 时,使用最大池化,其定义如下:

\[\tilde{\mathbf{a}}=\sqrt[p]{\sum_{i \in \mathbf{R}} \mathbf{a}_{i}^{p}}\]

其中 R 表示待池化区域中的像素值集。

9.7 Detail-Preserving Pooling(DPP池化)

论文地址

为了降低隐藏层的规模或数量,大多数CNN都会采用池化方式来减少参数数量,来改善某些失真的不变性并增加感受野的大小。由于池化本质上是一个有损的过程,所以每个这样的层都必须保留对网络可判别性最重要的部分进行激活。但普通的池化操作只是在特征图区域内进行简单的平均或最大池化来进行下采样过程,这对网络的精度有比较大的影响。基于以上几点,Faraz Saeedan等人提出一种自适应的池化方法-DPP池化Detail-Preserving Pooling,该池化可以放大空间变化并保留重要的图像结构细节,且其内部的参数可通过反向传播加以学习。DPP池化主要受Detail-Preserving Image Downscaling的启发。

9.8 Local Importance Pooling(局部重要性池化)

论文地址

CNN通常使用空间下采样层来缩小特征图,以实现更大的接受场和更少的内存消耗,但对于某些任务而言,这些层可能由于不合适的池化策略而丢失一些重要细节,最终损失模型精度。为此,作者从局部重要性的角度提出了局部重要性池化Local Importance Pooling,通过基于输入学习自适应重要性权重,LIP可以在下采样过程中自动增加特征判别功能。

9.9 Soft Pooling(软池化)

论文地址

现有的一些池化方法大都基于最大池化和平均池化的不同组合,而软池化Soft Pooling[9]是基于softmax加权的方法来保留输入的基本属性,同时放大更大强度的特征激活。与maxpooling不同,softpool是可微的,所以网络在反向传播过程中为每个输入获得一个梯度,这有利于提高训练效果。

10. 1×1卷积作用?

1 × 1 卷积的作用主要为以下两点:

  • 实现信息的跨通道交互和整合。
  • 对卷积核通道数进行降维和升维,减小参数量。
  • 1 × 1 卷积 + 激活函数可以增加⾮线性,提升网络表达能⼒。

11. 卷积层和池化层有什么区别?

卷积层和池化层在结构上具有一定的相似性,都是对感受野内的特征进行提取,并且根据步长设置获取到不同维度的输出,但是其内在操作是有本质区别的。

 卷积层池化层
结构零填充时输出维度不变,而通道数改变通常特征维度会降低,通道数不变
稳定性输入特征发生细微改变时,输出结果会改变感受域内的细微变化不影响输出结果
作用感受域内提取局部关联特征感受域内提取泛化特征,降低维度
参数量与卷积核尺寸、卷积核个数相关不引入额外参数

12. 卷积核是否一定越大越好?

在早期的卷积神经网络中(如LeNet-5、AlexNet),用到了一些较大的卷积核( 11 × 11 和 5 × 5 ),受限于当时的计算能力和模型结构的设计,无法将网络叠加得很深,因此卷积网络中的卷积层需要设置较大的卷积核以获取更大的感受域。但是这种大卷积核反而会导致计算量大幅增加,不利于训练更深层的模型,相应的计算性能也会降低。后来的卷积神经网络(VGG、GoogLeNet等),发现通过堆叠2个 3 × 3 卷积核可以获得与 5 × 5 卷积核相同的感受视野,同时参数量会更少( $3 × 3 × 2 + 1 < 5 × 5 × 1 + 1$ ), 3 × 3 卷积核被广泛应用在许多卷积神经网络中。因此可以认为,在大多数情况下通过堆叠较小的卷积核比直接采用单个更大的卷积核会更加有效。

但是,这并不是表示更大的卷积核就没有作用,在某些领域应用卷积神经网络时仍然可以采用较大的卷积核。譬如在自然语言处理领域,由于文本内容不像图像数据可以对特征进行很深层的抽象,往往在该领域的特征提取只需要较浅层的神经网络即可。在将卷积神经网络应用在自然语言处理领域时,通常都是较为浅层的卷积层组成,但是文本特征有时又需要有较广的感受域让模型能够组合更多的特征(如词组和字符),此时直接采用较大的卷积核将是更好的选择。

综上所述,卷积核的大小并没有绝对的优劣,需要视具体的应用场景而定,但是极大和极小的卷积核都是不合适的,单独的 1 × 1 极小卷积核只能用作分离卷积而不能对输入的原始特征进行有效的组合,极大的卷积核通常会组合过多的无意义特征从而浪费了大量的计算资源。

13. 每层卷积是否只能用一种尺寸的卷积核?

经典的神经网络一般都属于层叠式网络,每层仅用一个尺寸的卷积核,如VGG结构中使用了大量的 3×3 卷积层。事实上,同一层特征图可以分别使用多个不同尺寸的卷积核,以获得不同尺度的特征,再把这些特征结合起来,得到的特征往往比使用单一卷积核的要好,如GoogLeNet、Inception系列的网络,均是每层使用了多个卷积核结构。如下图所示,输入的特征在同一层分别经过 $1×1$、$3×3$ 和 $5×5$ 三种不同尺寸的卷积核,再将分别得到的特征进行整合,得到的新特征可以看作不同感受域提取的特征组合,相比于单一卷积核会有更强的表达能力。

117ed61bd7b2af76d1711d71b894c2a0

14. 怎样才能减少卷积层参数量?

减少卷积层参数量的方法可以简要地归为以下几点:

  • 使用堆叠小卷积核代替大卷积核:VGG网络中2个 $3 × 3$ 的卷积核可以代替1个 $5 × 5$ 的卷积核
  • 使用分离卷积操作:将原本 $K × K × C$ 的卷积操作分离为 $K × K × 1$ 和 $1 × 1 × C$ 的两部分操作
  • 添加 1 × 1 的卷积操作:与分离卷积类似,但是通道数可变,在 $K × K × C_1$ 卷积前添加 $1 × 1 × C_2$ 的卷积核(满足 $C_2 <C_1$ )
  • 在卷积层前使用池化操作:池化可以降低卷积层的输入特征维度
  • 使用瓶颈结构

15. 瓶颈结构和沙漏结构

15.1 瓶颈结构

瓶颈结构是在GoogLeNet中提出的,而后的ResNet、MobileNet等很多网络也采用并发展了这个结构,瓶颈结构的初衷是为了降低大卷积层的计算量,即在计算比较大的卷积层之前,先用一个$1×1$卷积来压缩大卷积层输入特征图的通道数目,以减少计算量;在大卷积层完成计算之后,根据实际需要,有时候会再次使用一个$1×1$卷进来将大卷积层输出特征图的通道数目复原,由此,瓶颈结构一般是一个小通道数的$1×1$卷积层,接一个较大卷积层,后面可能会再跟一个大通道数的$1×1$卷积层。

b54c7e4865a9cb62f200b6b6317b9453

瓶颈结构是卷积神经网络中比较基础的模块,它可以用更小的计算代价达到与之前相似甚至更好的效果,因为瓶颈结构会增加网络层数,所以特征提取能力可能也会有相应提升,瓶颈结构基本上可以用于所有的卷积神经网络中场景,包括物体检测和分割、生成对抗网络等大方向。

15.2 沙漏结构

沙漏结构也是卷积神经网络中比较基础的模块,他类似于瓶颈结构,但尺度要更大,涉及的层也更多,沙漏结构一般包括以下两个分支。

  • 自底向上(bottom-up)分支,利用卷积池化等操作,将特征图的尺寸逐层压缩(通道受可能增加),类似于自编码器中的编码器(encoder)。
  • 自顶向下(top-down)分支,利用反卷积或插值等上采样操作,将特征图的尺寸逐渐扩大(通道数可能降低),类似于自编码其中的解码器(decoder)。

16. 采用宽卷积的好处有什么?

宽卷积对应的是窄卷积,实际上并不是卷积操作的类型,指的是卷积过程中的填充方法,对应的是’SAME’填充和’VALID’填充。

'SAME’填充通常采用零填充的方式对卷积核不满足整除条件的输入特征进行补全,以使卷积层的输出维度保持与输入特征维度一致;

'VALID’填充的方式则相反,实际并不进行任何填充,在输入特征边缘位置若不足以进行卷积操作,则对边缘信息进行舍弃,因此在步长为1的情况下该填充方式的卷积层输出特征维度可能会略小于输入特征的维度。

此外,由于前一种方式通过补零来进行完整的卷积操作,可以有效地保留原始的输入特征信息。

比如下图左部分为窄卷积。注意到越在边缘的位置被卷积的次数越少。宽卷积可以看作在卷积之前在边缘用0补充,常见有两种情况,一个是全补充,如下图右部分,这样输出大于输入的维度。另一种常用的方法是补充一一部分0值,使得输出和输入的维度一致。

6622ebd6906ad3ee509301f9b448b529

17. 卷积神经网络的参数设置

卷积神经网络中常见的参数在其他类型的神经网络中也是类似的,但是参数的设置还得结合具体的任务才能设置在合理的范围

参数名常见设置参数说明
学习率(Learning Rate)$0-1$反向传播网络中更新权值矩阵的步长,在一些常见的网络中会在固定迭代次数或模型不再收敛后对学习率进行指数下降(如 $lr=lr\times 0.1$)。当学习率越大计算误差对权值矩阵的影响越大,容易在某个局部最优解附近震荡;越小的学习率对网络权值的更新越精细,但是需要花费更多的时间去迭代
批次大小(Batch Size)$2^N$批次大小指定一次性流入模型的数据样本个数,根据任务和计算性能限制判断实际取值,在一些图像任务中往往由于计算性能和存储容量限制只能选取较小的值。在相同迭代次数的前提下,数值越大模型越稳定,泛化能力越强,损失值曲线越平滑,模型也更快地收敛,但是每次迭代需要花费更多的时间
数据轮次(Epoch)$1-N$数据轮次指定所有训练数据在模型中训练的次数,根据数据集规模和分布情况会设置为不同的值。当模型较为简单或训练数据规模较小时,通常轮次不宜过高,否则模型容易过拟合;模型较为复杂或训练数据规模足够大时,可适当提高数据的训练轮次。
权重衰减系数(Weight Decay)$0-0.001$模型训练过程中反向传播权值更新的权重衰减值

18. 如何提高泛化能力

卷积神经网络与其他类型的神经网络类似,在采用反向传播进行训练的过程中比较依赖输入的数据分布,当数据分布较为极端的情况下容易导致模型欠拟合或过拟合,以下由几种提高卷积网络泛化能力的方法。

  • 使用更多数据。在有条件的前提下,尽可能多地获取训练数据是最理想的方法,更多的数据可以让模型得到充分的学习,也更容易提高泛化能力。
  • 使用更大批次。在相同迭代次数和学习率的条件下,每批次采用更多的数据将有助于模型更好的学习到正确的模式,模型输出结果也会更加稳定。
  • 调整数据分布。大多数场景下的数据分布是不均匀的,模型过多地学习某类数据容易导致其输出结果偏向于该类型的数据,此时通过调整输入的数据分布可以一定程度提高泛化能力。
  • 调整目标函数。在某些情况下,目标函数的选择会影响模型的泛化能力,如目标函数 $f(y,y’)=y-y’$ 在某类样本已经识别较为准确而其他样本误差较大的侵害概况下,不同类别在计算损失结果的时候距离权重是相同的,若将目标函数改成 $f(y,y’)=(y-y’)^2$ 则可以使误差小的样本计算损失的梯度比误差大的样本更小,进而有效地平衡样本作用,提高模型泛化能力。
  • 调整网络结构。在浅层卷积神经网络中,参数量较少往往使模型的泛化能力不足而导致欠拟合,此时通过叠加卷积层可以有效地增加网络参数,提高模型表达能力;在深层卷积网络中,若没有充足的训练数据则容易导致模型过拟合,此时通过简化网络结构减少卷积层数可以起到提高模型泛化能力的作用。
  • 数据增强。数据增强又叫数据增广,在有限数据的前提下通过平移、旋转、加噪声等一些列变换来增加训练数据,同类数据的表现形式也变得更多样,有助于模型提高泛化能力,需要注意的是数据变化应尽可能不破坏元数数据的主体特征(如在图像分类任务中对图像进行裁剪时不能将分类主体目标裁出边界)。
  • 权值正则化。权值正则化就是通常意义上的正则化,一般是在损失函数中添加一项权重矩阵的正则项作为惩罚项,用来惩罚损失值较小时网络权重过大的情况,此时往往是网络权值过拟合了数据样本(如 $Loss=f(WX+b,y’)+\frac{\lambda}{\eta}\sum{W}$
  • 屏蔽网络节点。该方法可以认为是网络结构上的正则化,通过随机性地屏蔽某些神经元的输出让剩余激活的神经元作用,可以使模型的容错性更强。

19. 卷积神经网络特性

19.1 局部连接

我们首先了解一个概念,感受野,即卷积神经网络每一层输出的特征图(feature map)上的像素点在输入图片上映射的区域大小。
在图像卷积操作中,神经元在空间维度上是局部连接,但在深度上是全连接。局部连接的思想,是受启发于生物学里的视觉系统结构,视觉皮层的神经元就是仅用局部接受信息。对于二维图像,局部像素关联性较强。这种局部连接保证了训练后的滤波器能够对局部特征有最强的响应,使神经网络可以提取数据的局部特征; 下图是一个很经典的图示,左边是全连接,右边是局部连接。

5d4b6346b00f1f56ec8867b4be83abfe

对于一个 $1000 × 1000$ 的输入图像而言,如果下一个隐藏层的神经元数目为 $10^6$ 个,采用全连接则有 $1000 × 1000 × 10^6 = 10^{12}$ 个权值参数,如此巨大的参数量几乎难以训练;而采用局部连接,隐藏层的每个神经元仅与图像中 $10 × 10$ 的局部图像相连接,那么此时的权值参数数量为 $10 × 10 × 10^6 = 10^8$,将直接减少 4 个数量级。

19.2 权值共享

权值共享,即计算同一深度的神经元时采用的卷积核参数是共享的。权值共享在一定程度上讲是有意义的,是由于在神经网络中,提取的底层边缘特征与其在图中的位置无关。但是在另一些场景中是无意的,如在人脸识别任务,我们期望在不同的位置学到不同的特征。

需要注意的是,权重只是对于同一深度切片的神经元是共享的。在卷积层中,通常采用多组卷积核提取不同的特征,即对应的是不同深度切片的特征,而不同深度切片的神经元权重是不共享。相反,偏置这一权值对于同一深度切片的所有神经元都是共享的。

权值共享带来的好处是大大降低了网络的训练难度。如下图,假设在局部连接中隐藏层的每一个神经元连接的是一个 $10 \times 10$ 的局部图像,因此有$10 \times 10$个权值参数,将这 $10 \times 10$ 个权值参数共享给剩下的神经元,也就是说隐藏层中 $10^6$ 个神经元的权值参数相同,那么此时不管隐藏层神经元的数目是多少,需要训练的参数就是这 $10 \times 10$ 个权值参数(也就是卷积核的大小)。

12e9eb4b9e0add25a4d41b3174556c10

这里就体现了卷积神经网络的奇妙之处,使用少量的参数,却依然能有非常出色的性能。上述仅仅是提取图像一种特征的过程。如果要多提取出一些特征,可以增加多个卷积核,不同的卷积核能够得到图像不同尺度下的特征,称之为特征图(feature map)。

20. 全连接、局部连接、全卷积与局部卷积

大多数神经网络中高层网络通常会采用全连接层(Global Connected Layer),通过多对多的连接方式对特征进行全局汇总,可以有效地提取全局信息。但是全连接的方式需要大量的参数,是神经网络中最占资源的部分之一,因此就需要由局部连接(Local Connected Layer),仅在局部区域范围内产生神经元连接,能够有效地减少参数量。根据卷积操作的作用范围可以分为全卷积(Global Convolution)和局部卷积(Local Convolution)。实际上这里所说的全卷积就是标准卷积,即在整个输入特征维度范围内采用相同的卷积核参数进行运算,全局共享参数的连接方式可以使神经元之间的连接参数大大减少;局部卷积又叫平铺卷积(Tiled Convolution)或非共享卷积(Unshared Convolution),是局部连接与全卷积的折衷。四者的比较如下所示。

  • 全连接。层间神经元完全连接,每个输出神经元可以获取到所有输入神经元的信息,有利于信息汇总,常置于网络末层;连接与连接之间独立参数,大量的连接大大增加模型的参数规模。
  • 局部连接。层间神经元只有局部范围内的连接,在这个范围内采用全连接的方式,超过这个范围的神经元则没有连接;连接与连接之间独立参数,相比于全连接减少了感受域外的连接,有效减少参数规模。
  • 全卷积。层间神经元只有局部范围内的连接,在这个范围内采用全连接的方式,连接所采用的参数在不同感受域之间共享,有利于提取特定模式的特征;相比于局部连接,共用感受域之间的参数可以进一步减少参数量。
  • 局部卷积。层间神经元只有局部范围内的连接,感受域内采用全连接的方式,而感受域之间间隔采用局部连接与全卷积的连接方式;相比与全卷积成倍引入额外参数,但有更强的灵活性和表达能力;相比于局部连接,可以有效控制参数量。

21. 局部卷积的应用

并不是所有的卷积都会进行权重共享,在某些特定任务中,会使用不权重共享的卷积。下面通过人脸这一任务来进行讲解。在读人脸方向的一些paper时,会发现很多都会在最后加入一个Local Connected Conv,也就是不进行权重共享的卷积层。总的来说,这一步的作用就是使用3D模型来将人脸对齐,从而使CNN发挥最大的效果。

4d1703bd55fe8d3988779f968aa4bafb

使用参数不共享的卷积核有如下原因:

  • 对齐的人脸图片中,不同的区域会有不同的统计特征,因此并不存在特征的局部稳定性,所以使用相同的卷积核会导致信息的丢失。
  • 不共享的卷积核并不增加inference时特征的计算量,仅会增加训练时的计算量。

参考文献

[1] 周志华. 《机器学习》

[2] 李航.《统计学习方法(第2版)》

[3] 诸葛越 、葫芦娃.《百面机器学习》

[4] 弗朗索瓦·肖莱.《Python深度学习》

[5] 伊恩·古德费洛.《深度学习》

[6] 谈继勇.《深度学习》

[7] KnowingAI知智.[KnowingAI知智的个人空间_哔哩哔哩_bilibili]

本文由作者按照 CC BY 4.0 进行授权