使用全连接前馈网络处理图像会存在两个问题:
卷积神经网络(convolutional neural network,CNN)是一种受生物学上感受野机制的启发而提出的具有局部连接、权重共享及汇聚等特性的深度前馈神经网络。
目前的卷积神经网络一般由卷积层、池化层(汇聚层)和全连接层交叉堆叠而成的前馈神经网络。卷积神经网络具有一定程度上的平移、缩放和旋转不变性。
卷积神经网络主要使用在图像和视频分析的各种任务(比如图像分类、人 脸识别、物体识别、图像分割等)上,其准确率一般也远远超出了其他的神经网络模型。近年来也广泛地应用到自然语言处理、推荐系统等领域。
卷积(Convolution)是分析数学中一种重要的运算,在信号处理或图像处理中、经常使用一维卷积或二维卷积。一维卷积相当于信号序列的简单移动平均(Moving Average,MA)。
卷积参数称为滤波器(Filter)或卷积核(convolution kernel)。
在图像处理中,卷积经常作为特征提取的有效方法。一幅图像经过卷积操作后得到的结果称为特征映射(Feature Map)。下图中最上面的滤波器是常用的高斯滤波器, 可以用来对图像进行平滑去噪;中间和最下面的滤波器可以用来提取边缘特征。
给定图像 X ∈ R M × N \boldsymbol{X} \in \mathbb{R}^{M \times N} X∈RM×N和一个滤波器 W ∈ R U × V \boldsymbol{W} \in \mathbb{R}^{U \times V} W∈RU×V,一般 U < < M , V < < N U<
Y = W ∗ X \boldsymbol{Y}=\boldsymbol{W}*\boldsymbol{X} Y=W∗X其中
y i j = ∑ u = 1 U ∑ v = 1 V x u v w i − u + 1 , j − v + 1 y_{i j}=\sum_{u=1}^{U} \sum_{v=1}^{V} x_{u v} w_{i-u+1, j-v+1} yij=u=1∑Uv=1∑Vxuvwi−u+1,j−v+1
为简单起见,这里假设卷积的输出 y i j y_{ij} yij的下标从 ( U , V ) (U,V) (U,V)开始。
卷积具有交换性,可以等价的写作:
y i j = ∑ u = 1 U ∑ v = 1 V w u v x i − u + 1 , j − v + 1 y_{i j}=\sum_{u=1}^{U} \sum_{v=1}^{V} w_{u v} x_{i-u+1, j-v+1} yij=u=1∑Uv=1∑Vwuvxi−u+1,j−v+1
通常下面的公式在机器学习库中实现更为简单,因为 u , v u,v u,v 的有效取值范围相对较小。
卷积运算可交换性的出现是因为我们将卷积核相对于输入进行了翻转(flip),从 u , v u,v u,v 增大的角度看,输入的索引在增大,而卷积核的索引在减小。我们将卷积核翻转的目的就是实现可交换性。
卷积核是否进行翻转和其特征抽取的能力无关。因此,为了实现上的方便起见,我们用互相关(cross-correlation)来代替卷积。从而会减少一些不必要的操作或开销。互相关和卷积的区别仅仅在于卷积核是否进行反转。因此互相关也可以称为不反转卷积。
Y = W ⊗ X = rot 180 ( W ) ∗ X \boldsymbol{Y} =\boldsymbol{W} \otimes \boldsymbol{X} =\operatorname{rot} 180(\boldsymbol{W}) * \boldsymbol{X} Y=W⊗X=rot180(W)∗X
⊗ \otimes ⊗表示互相关运算, rot 180 ( ⋅ ) \operatorname{rot} 180(·) rot180(⋅)表示旋转 180 度。
事实上,很多深度学习工具中实现的是互相关操作但称之为卷积。因此通常情况下我们把这两种运算都叫做卷积。
互相关计算:
如果换成真实点的图:
我们看到得到的结果就像filter,只不过翻转了一下。而卷积相当于将filter翻转了一次再进行互相关运算,那再加上上面的这次翻转就是两次,也就不变了。
但其实卷积核是可学习的参数,卷积和互相关在特征提取的能力上是等价的。
步长(Stride):指卷积核在滑动时的时间间隔。
零填充(Zero Padding):在输入向量两端进行补零。
假设卷积层的输入神经元个数为 ,卷积大小为 ,步长为 ,在输入两端各填补 个 0(zero padding),那么卷积后的输出长度为 ( − + 2)/ + 1。
宽卷积 (Wide Convolution)
给定一个二维图像 X ∈ R M × N \boldsymbol{X} \in \mathbb{R}^{M \times N} X∈RM×N和一个滤波器 W ∈ R U × V \boldsymbol{W} \in \mathbb{R}^{U \times V} W∈RU×V,对图像 X \boldsymbol{X} X进行零填充,两端各补 U − 1 U-1 U−1和 V − 1 V-1 V−1个 0,得到全填充的图像 X ~ ∈ R ( M + 2 U − 2 ) × ( N + 2 V − 2 ) \tilde{\boldsymbol{X}} \in \mathbb{R}^{(M+2 U-2) \times(N+2 V-2)} X~∈R(M+2U−2)×(N+2V−2) 。图像 X \boldsymbol{X} X和卷积核 W \boldsymbol{W} W的宽卷积定义为:
W ⊗ ~ X ≜ W ⊗ X ~ \boldsymbol{W} \tilde{\otimes} \boldsymbol{X} \triangleq \boldsymbol{W} \otimes \tilde{\boldsymbol{X}} W⊗~X≜W⊗X~ 其中 ⊗ ~ \tilde{\otimes} ⊗~表示宽卷积运算。
在全连接前馈神经网络中,权重矩阵的参数非常多,训练的效率很低。如果用卷积代替全连接,第 l l l层的净输入 z ( l ) \boldsymbol{z}^{(l)} z(l)为第 l − 1 l-1 l−1层活性值 a ( l − 1 ) \boldsymbol{a}^{(l-1)} a(l−1)和卷积核 w ( l ) ∈ R K \boldsymbol{w}^{(l)} \in \mathbb{R}^{K} w(l)∈RK的卷积,即:
z ( l ) = w ( l ) ⊗ a ( l − 1 ) + b ( l ) \boldsymbol{z}^{(l)}=\boldsymbol{w}^{(l)} \otimes \boldsymbol{a}^{(l-1)}+b^{(l)} z(l)=w(l)⊗a(l−1)+b(l)
其中卷积核 w ( l ) ∈ R K \boldsymbol{w}^{(l)} \in \mathbb{R}^{K} w(l)∈RK 为可学习的权重向量, b ( l ) ∈ R {b}^{(l)} \in \mathbb{R} b(l)∈R 为可学习的偏置。
卷积层有两个很重要的性质:
局部连接
第 l l l 层的每个神经元只和 l − 1 l-1 l−1 层中 me欧冠局部窗口内的神经元相连,构成一个局部连接网络。由原来的 M l × M l − 1 M_{l} \times M_{l-1} Ml×Ml−1个连接变为 M l × K M_{l} \times K Ml×K 个连接, M l M_{l} Ml为第 l l l层神经元的数量, K K K为卷积核的大小。
权重共享
作为参数的卷积核 w ( l ) \boldsymbol{w}^{(l)} w(l)对于第 l l l层的所有神经元都是相同的。权重共享可以理解为一个卷积核只捕捉输入数据中的一种特定的局部特征。因此,要提取多种特征就需要使用多个不同的卷积核。
两张有助于理解卷积运算的图:
三通道的卷积计算(一张 8 ∗ 8 ∗ 3 8*8*3 8∗8∗3的图像,进行卷积核为 3 ∗ 3 ∗ 3 ∗ 5 3*3*3*5 3∗3∗3∗5的计算):
三通道的卷积计算(一张 7 ∗ 7 ∗ 3 7*7*3 7∗7∗3的图像,进行卷积核为 3 ∗ 3 ∗ 3 ∗ 2 3*3*3*2 3∗3∗3∗2的计算,其中padding=1):
由于卷积网络主要应用在图像处理上,而图像为二维结构,因此为了更充分地利用 图像的局部信息,通常将神经元组织为三维结构的神经层,其大小为高度 × 宽度 × 深度 ,由 个 × 大小的特征映射构成.
特征映射(Feature Map)为一幅图像(或其他特征映射)经过卷积提取到的特征,每个特主要是可以作为一类抽取的图像特征。为了提高卷积网络的表示能力,可以在每一层使用多个不同的特征映射,以更好的表示图像的特征。
在输入层,特征映射就是图像本身,如果是灰度图,就是有一个特征映射,输入层的深度(或通道数,channels) D = 1 D=1 D=1,如果是彩色图像,分别有 RGB 三个颜色通道的特征映射, 输入层的深度 D = 3 D=3 D=3。
不是一般性,假设一个卷积层的结构如下:
为了计算输出特征映射 Y p \boldsymbol{Y}^{p} Yp,用卷积核 W p , 1 , W p , 2 , . . . , W p , D \boldsymbol{W}^{p,1},\boldsymbol{W}^{p,2},...,\boldsymbol{W}^{p,D} Wp,1,Wp,2,...,Wp,D分别对输入特征映射 X 1 , X 2 , . . . , X D \boldsymbol{X}^{1},\boldsymbol{X}^{2},...,\boldsymbol{X}^{D} X1,X2,...,XD进行卷积,然后将卷积结果相加,并加上一个标量偏置 b b b,得到卷积层的净输入 Z p \boldsymbol{Z}^{p} Zp,在经过激活函数 f ( ⋅ ) f(·) f(⋅)后得到输出特征映射 Y p \boldsymbol{Y}^{p} Yp。
Z p = W p ⊗ X + b p = ∑ d = 1 D W p , d ⊗ X d + b p Y p = f ( Z p ) \begin{aligned} \boldsymbol{Z}^{p} &=\boldsymbol{W}^{p} \otimes \boldsymbol{X}+b^{p}=\sum_{d=1}^{D} \boldsymbol{W}^{p, d} \otimes \boldsymbol{X}^{d}+b^{p} \\ \boldsymbol{Y}^{p} &=f\left(\boldsymbol{Z}^{p}\right) \end{aligned} ZpYp=Wp⊗X+bp=d=1∑DWp,d⊗Xd+bp=f(Zp)
其中 W p ∈ R U × V × D \boldsymbol{W}^{p} \in \mathbb{R}^{U \times V \times D} Wp∈RU×V×D为三维卷积核,激活函数一般用 ReLU 函数。
用 P P P组三维卷积核,重复上述计算,可以得到 P P P个输出特征映射 Y 1 , Y 2 , . . . , Y P \boldsymbol{Y}^{1},\boldsymbol{Y}^{2},...,\boldsymbol{Y}^{P} Y1,Y2,...,YP。
在输入为 X ∈ R M × N × D \mathcal{X} \in \mathbb{R}^{M \times N \times D} X∈RM×N×D,输出为 Y ∈ R M ′ × N ′ × P \mathcal{Y} \in \mathbb{R}^{M' \times N' \times P} Y∈RM′×N′×P的卷积层中,每个输出特征映射都需要 D D D个卷积核以及一个偏置。假设每个卷积核的大小为 U × V U \times V U×V那么共需要 P × D × ( U × V ) + P P\times D\times(U \times V) +P P×D×(U×V)+P 个参数。
汇聚层(pooling Layer, 池化层)也叫子采样层(Subsampling Layer),其作用是进行特征选择,降低特征数量,从而减少参数数量。
卷积层虽然可以显著减少网络中的连接数量,但特征映射组中的神经元个数并没有显著减少。如果后面连接一个分类器,分类器的输入维数依然很高,很容易出现过拟合。汇聚层就是为了解决这个问题。
将每个输入特征映射 X d ∈ R M × N \boldsymbol{X}^{d} \in \mathbb{R}^{M \times N} Xd∈RM×N划分为很多区域 R m , n d , 1 ≤ m ≤ M ′ , 1 ≤ n ≤ N ′ R_{m, n}^{d}, 1 \leq m \leq M^{\prime}, 1 \leq n \leq N^{\prime} Rm,nd,1≤m≤M′,1≤n≤N′,这些区域可以重叠,也可以不重叠。汇聚(Pooling)是指对每个区域进行下采样(Down Sampling)得到一个值作为这个区域的概括。
常用的汇聚函数有两种:
最大汇聚(Max Pooling):对于一个区域 R m , n d R_{m, n}^{d} Rm,nd,选择这个区域内所有神经元的最大活性值作为这个区域的表示,即
y m , n d = max i ∈ R m , n d x i y_{m, n}^{d}=\max _{i \in R_{m, n}^{d}} x_{i} ym,nd=i∈Rm,ndmaxxi
其中 x i x_i xi为区域 R m , n d R_{m, n}^{d} Rm,nd内每个神经元的活性值。
平均汇聚(Mean Pooling):取区域内所有神经元活性值的平均值,即
y m , n d = 1 ∣ R m , n d ∣ ∑ i ∈ R m , n d x i y_{m, n}^{d}=\frac{1}{\left|R_{m, n}^{d}\right|} \sum_{i \in R_{m, n}^{d}} x_{i} ym,nd=∣∣Rm,nd∣∣1i∈Rm,nd∑xi
下图为最大汇聚进行降采样操作实例。可以看出汇聚层不但可以有效地减少神经元的数量,还可以使得网络对异性小的局部形态改变保持不变性,并拥有更大的感受野。
目前主流的卷积网络中,汇聚层仅包含下采样操作.但在早期的一些卷积网 络(比如 LeNet-5)中,有时也会在汇聚层使用激活函数。
典型的汇聚层是将每个特征映射划分为 2 × 2 大小的不重叠区域,然后使用 最大汇聚的方式进行下采样。过大的采样区域会急剧减少神经元的数量,也会造成过多的信息损失。
一个典型的卷积网络由卷积层、汇聚层、全连接层交叉堆叠而成。一个卷积块为连续 个卷积层和 个汇聚层( 通常设置为 2 ∼ 5, 为 0 或 1)。一个卷积网络中可以堆叠 个连续的卷积块,然后在后面接着 个全连接层( 的取值区间比较大,比如 1 ∼ 100 或者更 大; 一般为 0 ∼ 2)。
目前,卷积网络的整体结构趋向于使用更小的卷积核(比如 1 × 1 和 3 × 3) 以及更深的结构(比如层数大于 50)。此外,由于卷积的操作性越来越灵活(比如不同的步长),汇聚层的作用也变得越来越小,因此目前比较流行的卷积网络中,汇聚层的比例正在逐渐降低,趋向于全卷积网络。
卷积神经网络中,需要学习的参数为卷积层的卷积核以及偏置,汇聚层没有参数要学习。
卷积网络也通过误差反向传播算法来进行参数学习。
1998 年提出。60k 参数。网络基本架构为:conv1 (6) -> pool1 -> conv2 (16) -> pool2 -> fc3 (120) -> fc4 (84) -> fc5 (10) -> softmax。括号中的数字代表通道数,网络名称中有5表示它有5层conv/fc层。当时,LeNet-5被成功用于ATM以对支票中的手写数字进行识别。
第一个现代深度卷积网络模型。60M 参数,ILSVRC 2012 ImageNet 图像分类的冠军网络。AlexNet 的关键点是:
1.使用 ReLU 激活函数,使其有更好的梯度特性,训练更快。
2.使用了随机失活(dropout)。
3.大量使用数据扩充技术。
此外 AlexNet 利用 GPU 加速卷积神经网络训练。
138M参数。ILSVRC 2014的亚军网络。VGG 网络的关键点是:
1.结构简单,只有 3x3 卷积和 2x2 汇合两种配置,并重复堆叠相同的模块。
2.参数量大,且大部分参数集中在全连接层中。
3.合适的网络初始化和使用批量归一(batch normalization)对训练深层网络很重要。
由于 vgg-16 网络结构十分简单,且很适合迁移学习,因此至今仍在广泛使用。
GoogLeNet
5M 参数。ILSVRC 2014的冠军网络。GoogLeNet试图回答在设计网络时究竟应该选多大尺寸的卷积、或者应该选汇合层。其提出了Inception模块,同时用1×1、3×3、5×5卷积和3×3汇合,并保留所有结果。GooLeNet 的关键点:
1.多分支分别处理,并级联结构。
2.为降低计算量,用 1x1 卷积降维。用全局平均汇合代替全连接,使网络参数大幅减小。
)
Inception v3/v4
在 GoogLeNet 的基础上进一步降低参数。Inception v4在Inception模块基础上结合了residual模块。
ResNet
ILSVRC 2015的冠军网络。esNet旨在解决网络加深后训练难度增大的现象。其提出了residual模块,包含两个 3x3 卷积和一个短路连接(左图)。短路连接是深度学习的又一重要思想,可以有效缓解反向传播时由于深度过深导致的梯度消失现象。此外短路连接的 ResNet 可以看作是不同深度而共享参数的网络的集成,网络数目随层数指数增加。resnet 的关键点:
1.使用短路连接,使训练深层网络更容易,并重复堆叠相同的模块组合。
2.大量使用了批量归一层。
3.对于很深的网络(超过 50 层),使用了更高效的瓶颈(bottleneck,1*1的卷积神经网络)结构(右图)。
)
preResNet
ResNet 的改进,将 ReLU 和 BN 都提前,更加直接的传递信息。
ResNeXt
ResNeXt发现,增加分支数是比加深或加宽更有效地提升网络性能的方式。
随机深度
ResNet的改进。旨在缓解梯度消失和加速训练。类似于随机失活(dropout),其以一定概率随机将residual模块失活。失活的模块直接由短路分支输出,而不经过有参数的分支。在测试时,前馈经过全部模块。随机深度说明residual模块是有信息冗余的。
DenseNet
其目的也是避免梯度消失。和residual模块不同,dense模块中任意两层之间均有短路连接。也就是说,每一层的输入通过级联(concatenation)包含了之前所有层的结果,即包含由低到高所有层次的特征。和之前方法不同的是,DenseNet中卷积层的滤波器数很少。DenseNet只用ResNet一半的参数即可达到ResNet的性能。实现方面,作者在大会报告指出,直接将输出级联会占用很大GPU存储。后来,通过共享存储,可以在相同的GPU存储资源下训练更深的DenseNet。但由于有些中间结果需要重复计算,该实现会增加训练时间。