卷积神经网络学习笔记

本文是对近期学习的卷积神经网络相关知识的简单记录和梳理。

卷积神经网络简介

卷积神经网络(Convolution Neural Network,CNN或ConvNet)是一种前馈神经网络。卷积神经网络是受生物学上感受野(Receptive Field)的机制提出来的。一个神经元的感受野是指特定区域,只有这个区域内的刺激才能够激活该神经元。

感受野,主要是指听觉、视觉等神经系统中一些神经元的特性,即神经元只接受其所支配的刺激区域内的信号。在视觉神经系统中,视觉皮层中的神经细胞的输出依赖于视网膜上的光感受器。视网膜上的光感受器受刺激兴奋时,将神经冲动信号传到视觉皮层,但不是所有的视觉皮层中的神经元都会接受这些信号。一个神经元的感受野指视网膜上的特定区域,只有这个区域内的刺激才能够激活该神经元。

卷积神经网络最早是主要处理图像信息。如果用全连接前馈神经网络来处理图像时,会存在以下两个问题:

  • 参数太多:如果图像的输入大小为100x100x3,在使用全连接前馈神经网络中,第一个隐藏层的每个神经元到输入层都有100x100x3=30,000个相互独立的连接,每个连接都对应一个权重参数。随着隐藏层神经元数量增多,参数的规模也会增加。这会导致整个神经网络的训练效率会非常低下,也会很容易出现过拟合。
  • 局部不变性特征: 自然图像中的物体都具有局部特征不变性,比如在尺度缩放、平移、旋转等操作不影响其语义信息。而全连接前馈神经网络很难提取这些局部不变性,一般需要进行数据增强来提高性能。

目前的卷积神经网络一般是由卷积层、汇聚层和全连接层交叉堆叠而成的前馈神经网络,使用反向传播算法进行训练。卷积神经网络有三个结构上的特性:局部连接、权重共享以及子采样。这些特性使得卷积神经网络具有一定程度上的平移、缩放和旋转不变性。和前馈神经网络相比,卷积神经网络的参数更少。

卷积运算

卷积介绍

卷积(convolution),是数学分析中一种重要的运算。在信号处理或图像中,经常使用一维卷积或二维卷积。
一维卷积,一维卷积常用在信号处理中,用于计算信号的延迟累积。假设一个信号发生器每个时刻t产生一个信号$x_t$,其信息的衰减率为$f_k$,即在k-1个时间步长后,信息变为原来的$f_k$倍。假设$f_1=1,f_2=1/2,f_3=1/4$,那么在时刻t收到的信号为$y_t$为当前时刻产生的信息和以前时刻延迟信息的叠加,$$
y_t = 1\times x_t + 1/2 \times x_{t-1} + 1/4 \times x_{t-2} \\\\
=f_1 \times x_t + f_2 \times x_{t-1} + f_3 \times x_{t-2}
$$
我们把$f_1,f_2…$称为滤波器(filter)或卷积核(convolution kernel)。假设滤波器的长度为m,它和一个信号序列$x_1,x_2…$的卷积为:$$
y_t = \sum_{k-1}^m f_k \cdot x_{t-k+1}
$$
信号序列x和滤波器w的卷积定义为:$$
y = w \bigotimes x
$$
一般情况下,滤波器的长度m远小于信号序列的长度n。当$f_k=1/m$时,卷积相当于移动平均。下图是一个一维卷积的例子:


mark

二维卷积,卷积也经常用于图像处理中。因为图像是一个二维结构,需要将一维卷积进行扩展。给定一个图像$X \in R^{M \times N}$和滤波器$W \in R^{M \times N }$,一般m<<M,n<<N,其卷积为:$$
y_{ij} = \sum_{u=1}^m \sum_{v=1}^n w_{uv}\cdot x_{i-u+1,j-v+1} (公式1)
$$

卷积的类型

根据在输入信号两端的补0的情况可以将卷积分为:窄卷积、宽卷积和等长卷积

一维卷积

  • 窄卷积,在信号两端不补0,输出信号长度为n-m+1;
  • 宽卷积,信号两端各补m-1个0,输出信号长度为n+m-1;
  • 等长卷积,信号两端各补(m-1)/2个0, 输出信号长度为n;

二维卷积

  • 窄卷积,信号四周不补0,输出信号长度为M-m+1*N-n+1;
  • 宽卷积,信号四周补0,输出长度为M+m-1*N+n-1;
  • 等长卷积,信号四周补0,输出长度为M*N;

卷积神经网络中的卷积

在机器学和图像处理领域,卷积主要的功能是在一个图像上滑动一个卷积核,通过卷积核操作得到一组新的特征。在计算卷积的过程中,需要进行卷积的翻转。在具体的实现上,一般会以互相关操作来代替卷积,从而会减少一些不必要的操作或开销。互相关(cross-correlation)是一个衡量两个序列相关性的函数,通常是用滑动窗口的点积计算来实现。给定一个图像$x\in R^{M \times N}$和卷积核$W\in R^{m\times n}$,它们的互相关为:$$
y_{ij}=\sum_{u=1}^m \sum_{v=1}^n w_{uv} \cdot x_{i+u-1,j+v-1}
$$
和公式1相比,互相关和卷积的主要区别在于卷积核仅仅是否进行翻转。因此,互相关也可以称为不翻转卷积。

翻转,就是从两个维度(从上到下、从左到右)颠倒次序,即旋转180度。

在神经网络中使用卷积是为了进行特征抽取,卷积核是否进行翻转和其特征的抽取的能力无关。特别是当卷积核是可学习的参数时,卷积核互相关是等价的。因此,为了实现上的方便,卷积神经网络中的卷积实际上用互相关操作来代替卷积,可以将互相关表示为$$
Y=W \bigotimes X
$$
其中,$Y\in R^{M-m+1,N-n+1}$为输出矩阵。

互相关运算,即常用的卷积神经网络中的卷积操作示例如下图所示:


mark

卷积运算的性质

卷积具有很多很好的性质,下面就介绍一下二维卷积的数学性质,同样适用于一维卷积。

交换性

如果不限制两个卷积信号的长度,卷积是具有交换性的,即$x \bigotimes y=y\bigotimes x$。

当输入信息和卷积核有固定长度时,它们的宽卷积依然具有交换性。

对于两维的图像$x\in R^{M \times N}$和卷积核$W\in R^{m\times n}$,对图像X的两个维度进行零填充,两端各补m-1和n-1个零,得到全填充的图像$\hat{X} \in R^{(M+2m-2) \times (N+2n-2)}$

图像X和卷积核W的宽卷积定义为:$$
\hat{Y}=W\hat{\bigotimes}X
$$
其中,$\hat{\bigotimes}$ 为宽卷积操作。
宽卷积具有交换性,即:$$
W\hat{\bigotimes}X=X\hat{\bigotimes}W
$$

导数

假设$Y=W\bigotimes X$,其中$x\in R^{M \times N}$,$W\in R^{m\times n}$,函数$f(Y)\in R$为一个标量函数,则:$$
\frac {\partial f(Y)}{\partial w_{uv}}=\sum_{i=1}^{M-m+1}\sum_{j=1}^{N-n+1}\frac{\partial y_{ij}}{\partial w_{uv}}\frac {\partial f(Y)}{\partial y_{ij}}\\\\
=\sum_{i=1}^{M-m+1}\sum_{j=1}^{N-n+1}x_{i+u-1,j+v-1}\frac {\partial f(Y)}{\partial y_{ij}}\\\\=\sum_{i=1}^{M-m+1}\sum_{j=1}^{N-n+1}\frac {\partial f(Y)}{\partial y_{ij}}x_{u+i-1,v+j-1}
$$
可以看到,f(Y)关于W的偏导数为X和$\frac {\partial f(Y)}{\partial Y}$的卷积$$
\frac {\partial f(Y)}{\partial (W)} = \frac {\partial f(Y)}{\partial Y} \bigotimes X (公式2)
$$
同理可以得到:$$
\frac {\partial f(Y)}{\partial x_{st}} = \sum_{i=1}^{M-m+1}\sum_{j=1}^{N-n+1} \frac {\partial y_{ij}}{\partial x_{st}} \frac {\partial f(Y)}{\partial {y_{ij}}}\\\ = \sum_{i=1}^{M-m+1}\sum_{j=1}^{N-n+1} w_{s-i+1,t-j+1}\frac {\partial f(Y)}{\partial y_{ij}} (公式3)
$$
其中,当(s-i+1)<1时,或(s-i+1)>m,或(t-j+1)<1,或(t-j+1)>n时,$w_{s-i+1,t-j+1}$,相当于对W进行了p=(M-m,N-n)的零填充。

可以看到,f(Y)关于X的偏导数为W和$\frac {\partial f(Y)}{\partial Y}$的宽卷积。公式3中的卷积是真正的卷积,而不是互相关,为了一致性,我们用互相关的“卷积”,即:$$
\frac {\partial f(Y)}{\partial X} = rot180(\frac {\partial f(Y)}{\partial Y}) \hat {\bigotimes}W \\\\=rot180(W) \hat {\bigotimes} \frac {\partial f(Y)}{\partial Y}
$$

卷积神经网络结构

首先,看一下典型的卷积神经网络的结构:


如上图所示,一个卷积神经网络由若干卷积层、Pooling层、全连接层组成。通过设置不同的卷积层、Pooling层以及全连接层,可以构建不同的卷积神经网络结构,它常用的架构模式为:
1
Input -> [[卷积层]*N->Pooling ?] * M -> [全连接层]*K


也就是N个卷积层叠加,然后(可选)叠加一个Pooling层,重复这个结构M次,最后叠加K个全连接层。下面介绍每个层的作用。

卷积层

全连接前馈神经网络中,第l-1层的$n^{(l-1)}$个神经元和第l层的$n^{(l)}$个神经元的连接采用的是全连接的方式,则权重矩阵有$n^{(l)}\times n^{(l-1)}$个参数,当l-1层和l层的神经元过多时,权重矩阵的参数非常多,训练的效率会非常低。

如果采用卷积来代替全连接,第l层的净输入$z^{(l)}$为第l-1层激活值$a^{(l-1)}$和滤波器$w^{(l)}$的卷积,即:$$
z^{(l)} = w^{(l)} \bigotimes a^{(l-1)} + b^{(l)} (公式4)
$$
其中,滤波器$w^{(l)}$为权重向量,$b^{(l)}\in R^{(n^{l-1})}$为偏置。

根据卷积的定义,卷积层具有如下两个性质:

  • 局部连接 在卷积层中的每一个神经元都和下一层某个局部窗口内的神经元相连,构成一个局部连接网络。如下图所示,卷积层和下一层之间的连接数大大减少,由原来的$n^{(l)}\times n^{(l-1)}$个连接变为$n^{(l)} \times m$个连接,m为滤波器的大小。


    mark
  • 权重共享 从公式4可以看出,作为参数的滤波器$w^{(l)}$对于第l层的所有的神经元都是相同的。从上图也可以看出,所有同颜色连接上的权重是相同的。

卷积层的主要作用是提取一个局部区域的特征,不同的卷积核相当于不同的特征提取器。上面介绍的卷积层的神经元和全连接都是一维结构。对于常见的图像为二维结构,因此为了更充分的利用图像的局部信息,通常将神经元组织为三维结构,其大小为$宽度M \times 高度N \times 深度D$,有D个$M\times N$的特征映射构成。

特征映射(Feature Map) 为了增强卷积层的表示能力,我们可以使用K个不同的滤波器来得到K组不同的输出。每组输出都共享一个滤波器。如果我们把滤波器看成是一个特征提取器,每一组输出都可以看成是输入图像经过一个特征抽取后得到的特征。因此,在卷积神经网络中每一组输出也叫作一组特征映射


mark

图片引自: https://nndl.github.io/ 卷积神经网络

在输入层,特征映射就是图像本身,如果图像是灰度图像,就是一个特征映射,深度为D=1;如果是彩色图像,分别有RGB三个颜色通道的特征映射,输入深度D=3。

假设一个卷积层的结构如下:

  • 输入特征映射组:$X \in R^{M \times N \times D}$为三维张量(tensor),每个切片为矩阵$X^d \in R^{M \times N}$为一个输入特征映射,1<=d<=D;
  • 输出特征映射组:$Y \in R^{M^{\prime}\times N^{\prime} \times P^{\prime}}$为三维张量,其中每个切片矩阵$Y^p \in R^{M^{\prime}\times N^{\prime}},$1<=p<=P;
  • 卷积核:$W \in R^{m\times n \times D \times P}$为四维张量,其中每个切片矩阵$W^{p,d}\in R^{m \times n}$为一个两维卷积核,1<=d<=D,1<=p<=P;

为了计算输出特征映射$Y^p$,用卷积核$W^{p,1},W^{p,2},…,W^{p,D}$分别对输入特征$X^1,X^2,…,X^D$进行卷积,然后将卷积结果相加,并加上一个标量偏置b得到卷积层的净输入$Z^P$,再经过非线性激活函数得到最终的输出特征映射$Y^p$。$$
Z^p = W^p \bigotimes X + b^p = \sum_{d=i}^D W^{p,d} \bigotimes X^d + b^p\\\\
Y^p = f(Z^p)
$$

其中,$W^p \in R^{m \times n \times D}$为三维卷积核,f(.)为非线性激活函数,一般用ReLU函数。整个计算的过程如下图所示。如果希望卷积层输出P个特征映射,可以将上述计算过程重复P次,得到P个输出特征映射,$Y^1,Y^2,…,Y^P$。


mark

图片引自: https://nndl.github.io/ 卷积神经网络

在输入为$X \in R^{M \times N \times D}$,输出为$Y \in R^{M^{\prime}\times N^{\prime} \times P^{\prime}}$的卷积层中,每一个输入特征映射都需要D个滤波器以及一个偏置。假设每个滤波器的大小为$m \times n$,那么共需要$P \times D \times (m \times n)+P$个参数。

Pooling层

汇聚层(Pooling Layer),也叫子采样层(subsampling layer),作用就是进行特征选择,降低特征数量,从而减少参数的数量。卷积层虽然可以减少网络中连接的数量,但特征映射组中的神经元个数没有显著减少。如果后面接一个分类器,分类器的输入维数依然很高,很容易出现过拟合。为了解决这个问题,可以在卷积层之后加一个汇聚层,从而降低特征的维数,避免过拟合。

对于卷积层得到的一个特征映射$X^{(l)}$,我们可以将$X^{(l)}$划分为很多区域$R_K,k=1,2…,K$。区域$R_k$可以重叠,也可以不重叠,则采样层的输出有:$$
X^{(l+1)} = f(W^{(l+1)}\cdot down(R_k)+b^{(l+1)})
$$
其中,$w^{(l+1)}$和$b^{(l+1)}$分别是可训练的权重和偏置参数。于是,可以简化成如下公式:$$
X^{(l+1)} = f(W^{(l+1)}\cdot down(X^{(l)})+b^{(l+1)})
$$
其中,$down(X^{(l)})$是指子采样后的特征映射。

常见的采样方式如下:

  • 最大值采样(Maximum Pooling)

    $pool_{max}(R_k) = max_{i\in R_k}a_i$

  • 最小值采样(Minimum Pooling)
    $pool_{min}(R_k) = min_{i\in R_k}a_i$

  • 平均值采样(Average pooling)
    $pool_{ave}(R_k) = \frac {1}{|R_k|}\sum_{i\in R_k}^{|R_k|} a_i$

  • TopK采样

    $pool_k(R_k) = topk_{i \in R_k}a_i$

下图为最大值采样的一个示例:


mark


典型的汇聚层是将每个特征映射划分为2X2的大小的不重叠的区域,然后使用最大汇聚的方式进行下采样。汇聚层也可以看做是一个特殊的卷积层,卷积核的大小为$m\times m$,步长为$s \times s$,卷积核为max函数或者mean函数。过大的采样区域会急剧减少神经元的数量,造成过多的信息损失。

卷积神经网络参数学习

在卷积神经网络中,参数为卷积核中的权重以及偏置。和前馈神经网络类似,卷积神经网络也可以通过误差反向传播算法来进行参数学习。

在全连接前馈神经网络中,梯度主要通过每一层的误差项$\delta$进行反向传播,并进一步计算每层参数的梯度。在卷积神经网络中,主要有两种不同功能的神经层:卷积层和汇聚层

对第l层为卷积层,第l-1层的输入特征为$X^{(l-1)} \in R^{M \times N \times D}$,通过卷积计算得到第l层的特征净输入为$Z^{(l)}\in R^{M^{\prime} \times N^{\prime} \times P}$,第l层的第p个特征净输入为:$$
Z^{(l,p)} = \sum_i^D W^{(l,p,d)} \bigotimes X^{(l-1,d)} + b^{(l,p)}
$$
其中,$W^{(l,p,d)}$和$b^{(l,p)}$为卷积核及偏置。第l层中共有$P \times D$个卷积核和P个偏置,可以分别使用链式法则来计算器梯度。$$
\frac {\partial L(Y,\hat{Y})}{\partial W^{(l,p,d)}} = \frac {\partial L(Y,\hat{Y})}{\partial Z^{(l,p)}} \bigotimes X^{(l-1, d)}\\\\=\delta^{l,p} \bigotimes X^{(l-1,d)}
$$
其中,$\delta^{(l,p)}$为损失函数关于第l层的第p个特征映射净输入$Z^{(p,l)}$的偏导数。

同理可以得到,损失函数关于第l层第p个偏置$b^{(l,p)}$的梯度为:
$$
\frac {\partial L(Y,\hat {Y})}{\partial b^{(l,p)}} = \sum_{i,j}[\delta^{(l,p)}]_{i,j}.
$$
因此,卷积网络的每层参数的梯度也依赖于其所在层的误差项$\delta^{(l,p)}$。卷积层和汇聚层中,误差项的计算有所不同,因此,需要分别计算误差项。

汇聚层

当第l+1层为汇聚层时,因为汇聚层是下采样操作,l+1层的每个神经元的误差项$\delta$对应于第l层的相应特征的一个区域。l层的第p个特征映射中的每个神经元都有一条边和l+1层的第p个特征映射中的一个神经元相连。根据链式法则,第l层的一个特征映射的误差项$\delta^{(l,p)}$,只需要将l+1层对应的特征映射误差项$\delta^{(l+1, p)}$进行上采样,再和l层的特征映射的激活值偏导数逐元素相乘就得到了$\delta^{(l,p)}$。

第l层的第p个特征映射的误差项$\delta^{(l,p)}$的具体推导如下:$$
\delta^{(l,p)} = \frac {\partial L(Y,\hat{Y})}{\partial Z^{(l,p)}}\\\\
=\frac {\partial X^{(l,p)}}{\partial Z^{(l,p)}} \cdot \frac {\partial Z^{(l+1,p)}}{\partial X^{(l,p)}} \cdot frac {\partial L(Y,\hat {Y})}{\partial Z^{(l+1, p)}}\\\\=f_l^\prime(Z^{(l,p)}) \bigodot up(\delta^{(l+1, k)})
$$
其中,$f_l^\prime(Z^{(l,p)})$为第l层使用的激活函数导数,up为上采样函数,与汇聚层中使用的下采样操作刚好相反。如果下采样是最大汇聚,误差项$\delta^{(l+1, k)}$中的每个值将会直接传递到上一层对应区域中最大值所对应的神经元,该区域中其他神经元的误差项都设为0,。如果采用平均采样,误差项$\delta^{(l+1, k)}$中的每个值都会被平均分配到上一层对应的区域中的所有神经元上。

卷积层

当第l+1层为卷积层时,假设特征映射净输入为$Z^{(l+1)} \in R^{M^\prime \times N^\prime \times K}$,其中第k个特征映射的净输入为:$$
Z^{(l+1,k)} = \sum_{p=1}^P W^{(l+1,k,p)} \bigotimes X^{(l,p)} + b^{(l+1, k)}
$$

其中,$W^{(l+1,k,p)}$和$b^{(l+1, k)}$为第l+1层的卷积核及偏置。第l+1层中共有$K\times P$个卷积核和K个偏置。第l层的第p个特征映射为误差项$\delta^{(l,p)}$的具体推导如下:
$$
\delta^{(l,p)} = \frac {\partial L(Y,\hat{Y})}{\partial Z^{(l,p)}}
\\\\
=\frac {\partial X^{(l,p)}}{\partial Z^{l,p}}\cdot \frac {\partial L(Y,\hat{Y})}{\partial X^{(l,p)}}\\\\=f_l^\prime(Z^{(l)}) \bigodot \sum_{k=1}^K (rot180(W^{(l+1,k,p)}) \hat{\bigotimes} \frac {\partial L(Y,\hat{Y})}{\partial Z^{(l+1, k)}})\\\\=f_l^\prime(Z^{(l)}) \bigodot \sum_{k=1}^K(rot180(W^{(l+1,k,p)}) \hat{\bigotimes} \delta^{(l=1,k)})
$$

其中,$\hat{\bigotimes}$为宽卷积。

Reference

坚持原创技术分享,您的支持将鼓励我继续创作!