一切都应该尽可能地简单,但不能过于简单
------艾伯特·爱因斯坦
卷积神经网络(CNN或ConvNet)是一种具有局部连接、权重共享等特性的深层前馈神经网络
卷积神经网络最早主要是用来处理图像信息。在用全连接前馈网络来处理图像时,会存在以下两个问题: 参数太多,不能提取局部不变性特征
卷积神经网络是受生物学上感受野机制的启发而提出的.感受野(Receptive Field)机制主要是指神经元只接受其所支配的刺激区域内的信号.
目前的卷积神经网络一般是由卷积层、汇聚层和全连接层交叉堆叠而成的前馈神经网络.全连接层一般在卷积网络的最顶层。
卷积神经网络有三个结构上的特性:局部连接、权重共享以及汇聚.
这些特性使得卷积神经网络具有一定程度上的平移、缩放和旋转不变性.和前馈神经网络相比,卷积神经网络的参数更少.
卷积神经网络主要使用在图像和视频分析的各种任务(比如图像分类、人脸识别、物体识别、图像分割等)上,其准确率一般也远远超出了其他的神经网络模型.近年来卷积神经网络也广泛地应用到自然语言处理、推荐系统等领域
卷积(Convolution),也叫褶积,是分析数学中一种重要的运算.在信号处理或图像处理中,经常使用一维或二维卷积
一维卷积:
一维卷积经常用在信号处理中,用于计算信号的延迟累积信号为,其信息的衰减率为 ,即在 − 1 个时间步长后,信息为原来的 倍。
我们把1, 2, ⋯称为滤波器(Filter)或卷积核(Convolution Kernel)。假设滤波器长度为,它和一个信号序列1, 2, ⋯的卷积如下。假设输入信息为N个,则输出y的长度为N-K+1个,7-3+1=5
信号序列和滤波器的卷积定义如下,其中∗表示卷积运算
我们可以设计不同的滤波器来提取信号序列的不同特征
这里的高频和低频指信号变化的强烈程度
步长(Stride)是指卷积核在滑动时的时间间隔
零填充(Zero Padding)是在输入向量两端进行补零
假设卷积层的输入神经元个数为,卷积大小为,步长为,在输入两端各填补 个0(zero padding),那么该卷积层的神经元数量为( − + 2)/ + 1
一般常用的卷积有以下三类:
窄卷积:步长 = 1,两端不补零 = 0,卷积后输出长度为 − + 1
宽卷积:步长 = 1,两端补零 = − 1,卷积后输出长度 + − 1
等宽卷积:步长 = 1,两端补零 =( − 1)/2,卷积后输出长度
二维卷积:
卷积也经常用在图像处理中.因为图像为一个二维结构,所以需要将一维卷积进行扩展.给定一个图像 ∈ ℝ× 和一个滤波器 ∈ ℝ×,一般 << , << ,其卷积如下,卷积的输出 的下标(, )从(, )开始
在图像处理中常用的均值滤波(Mean Filter)就是一种二维卷积,将当前位置的像素值设为滤波器窗口中所有像素的平均值,即 = 1/V
在图像处理中,卷积经常作为特征提取的有效方法.一幅图像在经过卷积操作后得到结果称为特征映射(Feature Map).图中最上面的滤波器是常用的高斯滤波器,可以用来对图像进行平滑去噪;中间和最下面的滤波器可以用来提取边缘特征.
在计算卷积的过程中,需要进行卷积核翻转.在具体实现上,一般会以互相关操作来代替卷积,从而会减少一些不必要的操作或开销.
互相关(Cross-Correlation)是一个衡量两个序列相关性的函数,通常是用滑动窗口的点积计算来实现,互相关公式如下,互相关和卷积的区别仅仅在于卷积核是否进行翻转.因 此互相关也可以称为不翻转卷积。
其中⊗表示互相关运算,rot180(⋅)表示旋转180度
在神经网络中使用卷积是为了进行特征抽取,卷积核是否进行翻转和其特征抽取的能力无关.特别是当卷积核是可学习的参数时,卷积和互相关在能力上是等价的.因此,为了实现上(或描述上)的方便起见,我们用互相关来代替卷积.事实上,很多深度学习工具中卷积操作其实都是互相关操作。
卷积的数学性质:
交换性,如果不限制两个卷积信号的长度,真正的翻转卷积是具有交换性的,即 ∗ = ∗ .对于互相关的“卷积”,也同样具有一定的“交换性”。
当输入信息和卷积核有固定长度时,它们的宽卷积依然具有交换性
导数
假设 = ⊗ ,其中 ∈ ℝ×, ∈ ℝ×, ∈ ℝ(−+1)×(−+1),函数( ) ∈ ℝ为一个标量函数
卷积神经网络一般由卷积层、汇聚层和全连接层构成
在全连接前馈神经网络中,如果第 层有 个神经元,第 − 1层有(−1) 个神经元,连接边有 × (−1)个,也就是权重矩阵有 × (−1) 个参数。当 和 (−1) 都很大时,权重矩阵的参数非常多,训练的效率会非常低。可以采用卷积来代替全连接
卷积层有两个很重要的性质:
局部连接:
在卷积层(假设是第 层)中的每一个神经元都只和前一层(第 − 1层)中某个局部窗口内的神经元相连,构成一个局部连接网络。
卷积层和前一层之间的连接数大大减少,由原来的 × −1 个连接变为 × 个连接, 为卷积核大小
权重共享:
作为参数的卷积核() 对于第 层的所有的神经元都是相同的,可以理解为一个卷积核只捕捉输入数据中的一种特定的局部特征.
因此,如果要提取多种特征就需要使用多个不同的卷积核.
由于局部连接和权重共享,卷积层的参数只有一个 维的权重 () 和 1 维的偏置(),共 + 1个参数.参数个数和神经元的数量无关.
此外,第 层的神经元个数不是任意选择的,而是满足 = −1 − + 1
卷积层的作用是提取一个局部区域的特征,不同的卷积核相当于不同的特征提取器。由于卷积网络主要应用在图像处理上,而图像为二维结构。
因此为了更充分地利用图像的局部信息,通常将神经元组织为三维结构的神经层,其大小为高度×宽度×深度,由 个 × 大小的特征映射构成。
特征映射(Feature Map)为一幅图像(或其他特征映射)在经过卷积提取到的特征,每个特征映射可以作为一类抽取的图像特征.
为了提高卷积网络的表示能力,可以在每一层使用多个不同的特征映射,以更好地表示图像的特征.
在输入层,特征映射就是图像本身.如果是灰度图像,就是有一个特征映射,输入层的深度 = 1;如果是彩色图像,分别有 RGB 三个颜色通道的特征映射,输入层的深度 = 3
为了计算输出特征映射 ,用卷积核 1,2, ⋯ , 分别对输入特征映射 1, 2, ⋯ , 进行卷积,然后将卷积结果相加,并加上一个标量偏置 ,得到卷积层的净输入, 再经过非线性激活函数后得到输出特征映射.
在输入为 ∈ ℝ××,输出为 ∈ ℝ′×′× 的卷积层中,每一个输出特征映射都需要 个卷积核以及一个偏置.假设每个卷积核的大小为 × ,那么共需要 × × ( × ) + 个参数
汇聚层(Pooling Layer)也叫子采样层(Subsampling Layer),其作用是进行特征选择,降低特征数量,从而减少参数数量。减少特征维数也可以通过增加卷积步长来实现
假设汇聚层的输入特征映射组为 ∈ ℝ××,对于其中每一个特征映射 ∈ ℝ× , 1 ≤ ≤ ,将其划分为很多区域 :,, 1 ≤ ≤ ′, 1 ≤ ≤ ′,这些区域可以重叠,也可以不重叠.
汇聚(Pooling)是指对每个区域进行下采样(Down Sampling)得到一个值,作为这个区域的概括
常用的汇聚函数有两种
最大汇聚(Maximum Pooling或Max Pooling):
对于一个区域,选择这个区域内所有神经元的最大活性值作为这个区域的表示
平均汇聚(Mean Pooling):
一般是取区域内所有神经元活性值的平均值
汇聚层不但可以有效地减少神经元的数量,还可以使得网络对一些小的局部形态改变保持不变性,并拥有更大的感受野
典型的汇聚层是将每个特征映射划分为2 × 2大小的不重叠区域,然后使用最大汇聚的方式进行下采样.
汇聚层也可以看作一个特殊的卷积层,卷积核大小为 × ,步长为 × ,卷积核为max函数或 mean函数.过大的采样区域会急剧减少神经元的数量,也会造成过多的信息损失
一个典型的卷积网络是由卷积层、汇聚层、全连接层交叉堆叠而成.
一个卷积块为连续 个卷积层和 个汇聚层( 通常设置为2 ∼ 5,为0或1).
一个卷积网络中可以堆叠 个连续的卷积块,然后在后面接着 个全连接层( 的取值区间比较大,比如 1 ∼ 100 或者更大; 一般为0 ∼ 2).
目前常用的卷积网络整体结构如下所示
目前,卷积网络的整体结构趋向于使用更小的卷积核(比如 1 × 1 和 3 × 3)以及更深的结构(比如层数大于 50).
此外,由于卷积的操作性越来越灵活(比如不同的步长),汇聚层的作用也变得越来越小,因此目前比较流行的卷积网络中,汇聚层的比例正在逐渐降低,趋向于全卷积网络。
在卷积网络中,参数为卷积核中权重以及偏置。和全连接前馈网络类似,卷积网络也可以通过误差反向传播算法来进行参数学习。
在全连接前馈神经网络中,梯度主要通过每一层的误差项 进行反向传播,并进一步计算每层参数的梯度。
在卷积神经网络中,主要有两种不同功能的神经层:卷积层和汇聚层.而参数为卷积核以及偏置,因此只需要计算卷积层中参数的梯度。
为损失函数关于第 层的第 个特征映射净输入 (,) 的偏导数
卷积层和汇聚层中误差项的计算有所不同,因此我们分别计算其误差项
当第 + 1层为汇聚层时,因为汇聚层是下采样操作, + 1层的每个神经元的误差项对应于第层的相应特征映射的一个区域。
层的第个特征映射中的每个神经元都有一条边和 + 1 层的第 个特征映射中的一个神经元相连。
根据链式法则,第 层的一个特征映射的误差项(,),只需要将 + 1层对应特征映射的误差项(+1,) 进行上采样操作(和第 层的大小一样),再和 层特征映射的激活值偏导数逐元素相乘,就得到了
(,).
其中′(⋅)为第 层使用的激活函数导数,up为上采样函数(up sampling),与汇聚层中使用的下采样操作刚好相反.
如果下采样是最大汇聚,误差项 (+1,) 中每个值会直接传递到前一层对应区域中的最大值所对应的神经元,该区域中其他神经元的误差项都设为0.
如果下采样是平均汇聚,误差项(+1,) 中每个值会被平均分配到前一层对应区域中的所有神经元上
卷积层 当 + 1 层为卷积层时,假设特征映射净输入 (+1) ∈ ℝ′×′×。 第(1 ≤ ≤ )个特征映射净输入
LeNet-5虽然提出的时间比较早,但它是一个非常成功的神经网络模型.基于LeNet-5的手写数字识别系统在 20世纪90 年代被美国很多银行使用,用来识别支票上面的手写数字.
卷积层的每一个输出特征映射都依赖于所有输入特征映射,相当于卷积层的输入和输出特征映射之间是全连接的关系.实际上,这种全连接关系不是必须的.我们可以让每一个输出特征映射都依赖于少数几个输入特征映射.定义一个连接表(Link Table) 来描述输入和输出特征映射之间的连接关系.
其中 为 × 大小的连接表.假设连接表 的非零个数为 ,每个卷积核的大小为 × ,那么共需要 × × + 参数
AlexNet是第一个现代深度卷积网络模型,其首次使用了很多现代深度卷积网络的技术方法,比如使用 GPU 进行并行训练,采用了 ReLU 作为非线性激活函数,使用 Dropout 防止过拟合,使用数据增强来提高模型准确率等.
AlexNet的结构如图所示,包括5个卷积层、3个汇聚层和3个全连接层(其中最后一层是使用 Softmax 函数的输出层).
因为网络规模超出了当时的单个GPU的内存限制,AlexNet将网络拆为两半,分别放在两个GPU上,GPU间只在某些层(比如第3层)进行通信
在卷积网络中,如何设置卷积层的卷积核大小是一个十分关键的问题.在Inception 网络中,一个卷积层包含多个不同大小的卷积操作,称为Inception 模 块.
Inception网络是由有多个Inception模块和少量的汇聚层堆叠而成
Inception模块同时使用1 × 1、3 × 3、5 × 5等不同大小的卷积核,并将得到的特征映射在深度上拼接(堆叠)起来作为输出特征映射
图给出了v1版本的Inception模块结构, Inception 模块中的卷积和最大汇聚都是等宽的.
采用了4组平行的特征抽取方式,分别为1 × 1、3 × 3、5 × 5的卷积和3 × 3的最大汇聚.同时,为了提高计算效率,减少参数数量
Inception模块在进行3 × 3、5 × 5的卷积之前、3 × 3的最大汇聚之后,进行一次1 × 1的卷积来减少特征映射的深度.如果输入特征映射之间存在冗余信息,1 × 1的卷积相当于先进行一次特征抽取
Inception v3 网络用多层的小卷积核来替换大的卷积核,以减少计算量和参数量,并保持感受野不变.具体包括:
1)使用两层3 × 3的卷积来替换v1中的5 × 5的卷积;
2)使用连续的 × 1和1 × 来替换 × 的卷积.
此外,Inception v3网络同时也引入了标签平滑以及批量归一化等优化方法进行训练
残差网络通过给非线性的卷积层增加直连边(也称为残差连接)的方式来
提高信息的传播效率.
假设在一个深度网络中,我们期望一个非线性单元(可以为一层或多层的卷积层)(; )去逼近一个目标函数为ℎ().如果将目标函数拆分成两部分:恒等函数和残差函数ℎ() − x
根据通用近似定理,一个由神经网络构成的非线性单元有足够的能力来近似逼近原始目标函数或残差函数,但实际中后者更容易学习。
因此,原来的优化问题可以转换为:让非线性单元(; )去近似残差函数ℎ() − ,并 用(; ) + 去逼近ℎ().
残差单元由多个级联的(等宽)卷积层和一个跨层的直连边组成,再经过ReLU激活后得到输出
残差网络就是将很多个残差单元串联起来构成的一个非常深的网络
我们一般可以通过卷积操作来实现高维特征到低维特征的转换.比如在一维卷积中,一个5维的输入特征,经过一个大小为3的卷积核,其输出为3维特征.
如果设置步长大于1,可以进一步降低输出特征的维数.
但在一些任务中,我们需要将低维特征映射到高维特征,并且依然希望通过卷积操作来实现
假设一个 5 维向量 ,经过大小为 3的卷积核 = [1, 2, 3]T 进行卷积,得到3维向量.
卷积操作可以写为
如果要实现3维向量到5维向量的映射,可以通过仿射矩阵的转置来实现,即
我们将低维特征映射到高维特征的卷积操作称为转置卷积,也称为反卷积
在卷积网络中,卷积层的前向计算和反向传播也是一种转置关系
对一个 维的向量,和大小为 的卷积核,如果希望通过卷积操作来映射到更高维的向量,只需要对向量进行两端补零 = − 1,然后进行卷积,可以得到 + − 1维的向量,即宽卷积.
微步卷积
我们可以通过增加卷积操作的步长 > 1 来实现对输入特征的下采样操作,大幅降低特征维数.
同样,我们也可以通过减少转置卷积的步长 < 1来实现上采样操作,大幅提高特征维数.
步长 < 1 的转置卷积也称为微步卷积
为了实现微步卷积,我们可以在输入特征之间插入0来间接地使得步长变小
如果卷积操作的步长为 > 1,希望其对应的转置卷积的步长为 1/,需要在输入特征之间插入 − 1个0来使得其移动的速度变慢
以一维转置卷积为例,对一个 维的向量 ,和大小为 的卷积核,通过对向量进行两端补零 = − 1,并且在每两个向量元素之间插入 个0,然后进行步长为1的卷积,可以得到( + 1) × ( − 1) + 维的向量
对于一个卷积层,如果希望增加输出单元的感受野,一般可以通过三种方式实现:
1)增加卷积核的大小;
2)增加层数,比如两层 3 × 3 的卷积可以近似一层5 × 5卷积的效果;
3)在卷积之前进行汇聚操作.
前两种方式会增加参数数量,而第三种方式会丢失一些信息
空洞卷积是一种不增加参数数量, 同时增加输出单元感受野的一种方法,也称为膨胀卷积
空洞卷积通过给卷积核插入“空洞”来变相地增加其大小.如果在卷积核的每两个元素之间插入 − 1个空洞,卷积核的有效大小如下,其中 称为膨胀率(Dilation Rate).当 = 1时卷积核为普通的卷积核。