卷积神经网络(CNN)

卷积神经网络(CNN)

期末复习资料整理

之前说过卷积神经网络和全连接前馈神经网络都是由基于MLP的前馈神经网络发展而来


卷积神经网络的起源(复习思维导图未要求)

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

目前的卷积神经网络一般是由卷积层、汇聚层和全连接层交叉堆叠而成的前馈神经网络


卷积神经网络的特点

全连接前馈神经网络的问题

  1. 参数太多

    如果拿来图像数据来进行学习,就会需要非常多的参数,导致训练效率非常低,也很容易过拟合

  2. 局部不变性特征

    自然图像都具有布局不变性特征,比如尺度缩放、平移、旋转等操作不影响其语义信息,但全连接前馈神经网络很难提取到这些特征,一般需要语义增强来提高性能.

卷积神经网络的特性

卷积神经网络有三个结构上的特性:局部连接、权重共享和汇聚。这些特性让卷积神经网络具备一定程度上的平移、缩放和旋转不变性,而且使用的参数更少

局部连接

在卷积层中,每个神经元只与输入数据的一个局部区域连接,而不是像传统的神经网络那样与所有输入数据全连接。这个局部区域被称为感受野。这种方式减少了模型的参数数量,降低了计算复杂度,并使网络能够捕捉到局部特征(如边缘、纹理等)。

权重共享

在卷积层中,同一个卷积核(过滤器)的权重在整个输入图像上是共享的。权重共享进一步减少了模型的参数数量,增强了模型的泛化能力,并使得网络对于输入图像的位置变化具有一定的不变性。

汇聚

汇聚通过池化层实现(汇聚层和池化层是一个概念),池化层通常跟在卷积层后面,用于降低数据的空间维度(宽度和高度),减少计算量,同时保持重要信息。可以减少计算复杂度、控制过拟合、增强稳定性


步长和填充

步长和填充是针对于卷积核来说的,更改步长和填充可以增加卷积的多样性,可以更灵活的进行特征提取

步长

是指卷积核在滑动时的时间间隔

填充

是在输入向量两端进行补值。

(此内容PPT和思维导图均未涉及)为什么要进行填充?CNN进行填充的目的是为了控制特征图的空间尺寸,进行填充扩充特征图,防止特征图快速缩小,这样就能设计出更深层次的CNN。CNN一般面对的是图像数据,图像数据的边缘像素的使用较少,可能会在卷积的过程中丢失掉。此外,在一些特定的网络结构,如残差网络需要输入和输出具有相同的尺寸以便进行跳跃连接。填充在这里发挥着关键作用。

(此内容PPT和思维导图均未涉及)填充内容可以有很多,诸如零填充、镜像填充(用输入数据的镜像副本进行填充,用于需要自然连续的对象)、复制填充(使用边缘像素的值来填充,可以更好保留边缘信息)、常数填充

(此内容详见下方卷积类型)填充的模式(依据主要是自己想要得到什么样的输出):完全模式(p=m1p=m-1):假如卷积核是3×3,那么padding=2padding=2。但此模式的输出规模大于输入,在信号处理好用,在机器学习就没什么用了;相同模式:希望得到的输出的规模和自己的输入的规模相同;有效模式:就是无填充(p=0p=0

image-20231227142859021

卷积类型

卷积的类型是按照卷积的输出的规模进行分类的

计算输出规模

卷积的输出规模由沿着输入向量移动过滤器ww的总次数来确定的,假设输入向量规模为nn,过滤器规模为mm,在填充为pp且步幅为ss的条件下依据y=xwy=x*w计算,且是向下取整

o=n+2pms+1o=\lfloor \frac{n+2p-m}{s}+1 \rfloor

窄卷积

步长𝑇=1𝑇 = 1,两端不补零𝑃=0𝑃 = 0,卷积后输出长度为𝑀𝐾+1𝑀 − 𝐾 + 1,也就是上面提到的有效模式,因为卷积过程中特征图要变小,所以很容易丢失信息

宽卷积

步长𝑇=1𝑇 = 1,两端补零𝑃=𝐾1𝑃 = 𝐾 − 1,卷积后输出长度𝑀+𝐾1𝑀 + 𝐾 − 1也就是上面提到的完全模式

等宽卷积

步长𝑇=1𝑇 = 1,两端补零𝑃=(𝐾1)/2𝑃 =(𝐾 − 1)/2,卷积后输出长度MM,也就是上面提到的相同模式,最常用的模式


一维卷积和二维卷积

卷积

卷积(Convolution),也叫褶积,是分析数学中一种重要的运算.在信号处理或图像处理中,经常使用一维或二维卷积.

一维卷积

一维卷积经常用在信号处理中,用于计算信号的延迟累积.假设一个信号发生器每个时刻 𝑡 产生一个信号 𝑥𝑡,其信息的衰减率为 𝑤𝑘,即在 𝑘 − 1 个时间步长后,信息为原来的𝑤𝑘 倍.假设𝑤1 = 1, 𝑤2 = 1/2, 𝑤3 = 1/4,那么在时刻𝑡 收到的信号𝑦𝑡 为当前时刻产生的信息和以前时刻延迟信息的叠加,

yt=1×xt+1/2×xt1+1/4×xt2y_t=1\times x_t + 1/2\times x_{t-1} + 1/4\times x_{t-2}

=w1×xt+w2×xt1+w3×xt2=w_1\times x_t+w_2\times x_{t-1}+w_3\times x_{t-2}

k=13wkxtk+1\sum_{k=1}^{3}w_kx_{t-k+1}

这里面的wkw_k就是滤波器,也被称为卷积核,假设滤波器长度为KK,它和一个信号序列x1,x2,...x_1,x_2,...的卷积为

yt=k=1Kwkxtk+1y_t=\sum_{k=1}^{K}w_kx_{t-k+1}

假设卷积核输出yty_t的t,从K开始。那么,信号序列和卷积核的定义可以变成,其中*是卷积运算

y=wxy=w*x

一般情况下滤波器的长度𝐾 远小于信号序列𝒙的长度

一维卷积滤波器
  1. 当滤波器𝒘=[1/𝐾,,1/𝐾]𝒘 = [1/𝐾, ⋯ , 1/𝐾],卷积相当于信号序列的简单移动平均(窗口大小为 𝐾)移动平均(Moving Average,MA)是在分析时间序列数据时的一种简单平滑技术,能有效地消除数据中的随机波动.

  2. 当滤波器𝒘=[1,2,1]𝒘 = [1, −2, 1]时,可以近似实现对信号序列的二阶微分

    xn(t)=x(t+1)+x(t1)2x(t)x^n(t)=x(t+1)+x(t-1)-2x(t)

    一阶微分是函数的斜率,二阶微分是斜率的变化率,比如运动的距离时间曲线,一阶微分是速度,二阶微分是加速度,至于这个是怎么推导出来的,就暂不深究。

  3. 基于滤波器是对于连续区域进行差分,它比较的是这个区域的差异,设置适当的滤波器就能提取想要的信号特征。比如当滤波器𝒘=[1/𝐾,,1/𝐾]𝒘 = [1/𝐾, ⋯ , 1/𝐾]时,可以提取信号的低频信息,当滤波器𝒘=[1,2,1]𝒘 = [1, −2, 1]可以提取信号的高频信息,而且不仅适用于一维卷积,还适用于二维卷积,不过需要二维的滤波器。这里的高低频指的是信号变化的速率。

上课老师给的一维卷积实例

image-20231226232948098

二维卷积

一维卷积主要应用在信号序列当中,如果要在图像数据(二维数据)进行CNN,就需要二维卷积了

所以要先扩展一维卷积。假设输入图像XRM×NX\in R^{M \times N}和滤波器WRU×VW \in R^{U\times V},并且U<<M,V<<NU<<M,V<<N,其二维卷积的定义为

yij=u=1Uv=1Vwuvxiu+1,ju+1y_{ij}=\sum_{u=1}^{U}\sum_{v=1}^{V}w_{uv}x_{i-u+1,j-u+1}

同样为了简单起见,i,ji,jU,VU,V开始,*是卷积运算

Y=WXY=W*X

image-20231227150447051

(输出这里的正负号是翻转造成的,但翻转不是必要的,更多翻转相关请看下方互相关操作)

二维卷积进行填充的方式

image-20231227151407548

二维卷积滤波器

一副图像在经过卷积操作之后得到的结果被称为特征映射

image-20231227151218697

(思维导图未要求)用卷积来代替全连接

结合卷积神经网络的特性食用

在全连接前馈神经网络中,如果第𝑙 层有𝑀𝑙𝑀_𝑙个神经元,第𝑙 − 1层有𝑀𝑙1𝑀_{𝑙−1}个 神经元,连接边有𝑀𝑙×𝑀𝑙1𝑀_𝑙 × 𝑀_{𝑙−1}个,也就是权重矩阵有𝑀𝑙×𝑀𝑙1𝑀_𝑙 × 𝑀_{𝑙−1}个参数.当𝑀𝑙𝑀_𝑙𝑀𝑙1𝑀_{𝑙−1}都很大时,权重矩阵的参数非常多,训练的效率会非常低

如果采用卷积来代替全连接,第𝑙 层的净输入𝒛(𝑙)𝒛^{(𝑙)}为第𝑙 − 1 层活性值𝒂(𝑙1)𝒂^{(𝑙−1)}和卷积核𝒘(l)R𝐾𝒘^{(l)}\inℝ^𝐾的卷积,即

z(l)=w(l)a(l1)+b(l)z^{(l)}=w^{(l)}\bigotimes a^{(l-1)}+b^{(l)}

𝒘(l)R𝐾𝒘^{(l)}\inℝ^𝐾为可学习的权重向量,b(l)b^{(l)}为可学习的偏置

这样卷积层和下一层之间的连接数大大减少,由原来的𝑀𝑙×𝑀𝑙1𝑀_𝑙 × 𝑀_{𝑙−1}个连接变为𝑀𝑙×K𝑀_𝑙 \times K个连接,𝐾 为卷积核大小.而且所有的同颜色的连接上的权重是相同的,权重共享可以理解为一个卷积核只捕捉输入数据中的一种特定的局部特征.因此,如果要提取多种特征就需要使用多个不同的卷积核

image-20231227154718757

卷积层的参数只有一个 𝐾 维的权重𝒘(l)𝒘^{(l)}和 1 维的偏置𝑏(𝑙)𝑏^{(𝑙)},共𝐾 + 1个参数.参数个数和神经元的数量无关.这是因为卷积核在整个输入数据上滑动并重复使用,所以无论神经元数量多少,每个卷积核的权重数量保持不变。

此外,第𝑙 层的神经元个数不是任意选择的,而是满足𝑀𝑙=𝑀𝑙1𝐾+1𝑀_𝑙 = 𝑀_{𝑙−1} − 𝐾 + 1. 第𝑙𝑙层的神经元数量(即特征图的尺寸𝑀𝑙𝑀_{𝑙})由前一层的尺寸𝑀𝑙1𝑀_{𝑙−1}和卷积核的大小KK决定。

互相关操作

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

互相关是一个衡量两个序列相关性的函数,通常是用滑动窗口的点积计算来实现

卷积是在一个图像(或某种特征)上滑动一个卷积核(即滤波器),通过卷积操作得到一组新的特征在计算卷积的过程中,需要进行卷积核翻转。

互相关和卷积的区别仅仅在于卷积核是否进行翻转.因此互相关也可以称为不翻转卷积.

有关翻转不必要的解释

在神经网络中使用卷积是为了进行特征抽取,卷积核是否进行翻转和其特征抽取的能力无关.特别是当卷积核是可学习的参数时,卷积和互相关在能力上是等价的.因此,为了实现上(或描述上)的方便起见,我们用互相关来代替卷积.事实上,很多深度学习工具中卷积操作其实都是互相关操作。

多卷积核

在二维卷积的滤波器处提到过:一副图像在经过卷积操作之后得到的结果被称为特征映射
而为了更好的表示这副图像,我们可以在每一层使用多个不同的特征映射,也就是多卷积核

(思维导图未要求)特征映射

特征映射的过程也就是卷积层从输入到输出的过程

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

假设一个卷积层的结构如下:
输入特征映射组:𝒳R𝑀×𝑁×𝐷𝒳\inℝ^{𝑀×𝑁×𝐷}为三维张量(Tensor),其中每个切 片(Slice)矩阵𝑿𝑑R𝑀×𝑁𝑿^𝑑\inℝ^{𝑀×𝑁}为一个输入特征映射,1 ≤ 𝑑 ≤ 𝐷;
输出特征映射组:𝒴R𝑀×𝑁×𝑃𝒴\inℝ^{𝑀^′×𝑁^′×𝑃}为三维张量,其中每个切片矩阵𝒀𝑝R𝑀×𝑁𝒀^𝑝 ∈ ℝ^{𝑀^′×𝑁^′}为一个输出特征映射,1 ≤ 𝑝 ≤ 𝑃;
卷积核:𝒲R𝑈×𝑉×𝑃×𝐷𝒲\inℝ^{𝑈×𝑉×𝑃×𝐷}为四维张量,其中每个切片矩阵𝑾𝑝,𝑑R𝑈×𝑉𝑾^{𝑝,𝑑} \in ℝ^{𝑈×𝑉}为一个二维卷积核,1 ≤ 𝑝 ≤ 𝑃, 1 ≤ 𝑑 ≤ 𝐷.

image-20231227163913425

然后使用卷积核Wp,1,Wp,2,...,Wp,DW^{p,1},W^{p,2},...,W^{p,D}分别对特征映射x1,x2,...,xDx^1,x^2,...,x^D进行卷积,将结果相加,在加上一个一维张量bb(偏置)得到激活函数的输入ZpZ^p,经过激活函数之后就可以得到YpY^p。激活函数一般是ReLU

Zp=WpX+bp=d=1DXd+bpZ^p=W^p\bigotimes X+b^p=\sum_{d=1}^{D}\bigotimes X^d+b^p

Yp=f(Zp)Y^p=f(Z^p)

image-20231227170525565

卷积神经网络的参数计算

在上面这个示例中,每一个输出特征映射都需要𝐷个卷积核以及一个偏置.假设每个卷积核的大小为𝑈 × 𝑉,那么共需要𝑃 × 𝐷 × (𝑈 × 𝑉 ) + 𝑃 个参数.


汇聚层

汇聚层简介

卷积层虽然可以显著减少连接的个数,但是每一个特征映射的神经元个数并没有显著减少。如果后面接一个分类器,分类器的输入维数依然很高,很容易出现过拟合.为了解决这个问题,可以在卷积层之后加上一个汇聚层,从而降低特征维数,避免过拟合

汇聚层(Pooling Layer)也叫子采样层(Subsampling Layer),其作用是进行特征选择,降低特征数量,从而减少参数数量

假设汇聚层的输入特征映射组为𝒳R𝑀×𝑁×𝐷𝒳\inℝ^{𝑀×𝑁×𝐷},对于其中每一个特征映射𝑿𝑑R𝑀×𝑁,1𝑑𝐷𝑿^𝑑 ∈ ℝ^{𝑀×𝑁} , 1 ≤ 𝑑 ≤ 𝐷,将其划分为很多区域𝑅𝑚,𝑛𝑑,1𝑚𝑀,1𝑛𝑁𝑅^𝑑_{𝑚,𝑛}, 1 ≤ 𝑚 ≤ 𝑀^′ , 1 ≤ 𝑛 ≤ 𝑁^′, 这些区域可以重叠,也可以不重叠.

汇聚指的就是对每个区域进行下采样,得到一个值,作为这个区域的概括。常用的概括函数有两种:最大汇聚和平均汇聚

最大汇聚层

对于一个区域𝑅𝑚,𝑛𝑑𝑅^𝑑_{𝑚,𝑛}, 选择这个区域内所有神经元的最大活性值作为这个区域的表示,即

ym,nd=maxxi,iRm,ndy^d_{m,n}=max\quad x_i,i\in R^d_{m,n}

其中𝑥𝑖𝑥_𝑖为区域𝑅𝑘𝑑𝑅^𝑑_𝑘内每个神经元的活性值.

image-20231227173341045

平均汇聚层

一般是取区域内所有神经元活性值的平均值,即

ym,nd=1Rm,ndiRm,ndxiy^d_{m,n}=\frac{1}{|R^d_{m,n}|}\sum_{i\in R^d_{m,n}}x_i

注意

最大汇聚层强调区域内的最显著特征,更适合于捕捉纹理和形状信息

平均汇聚层提供更平均、更平滑的特征映射,有时可能导致特征的重要部分丢失

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


卷积网格结构

一个典型的卷积网络是由卷积层、汇聚层、全连接层交叉堆叠而成

image-20231227173451444

一个卷积块为连续 𝑀 个卷积层和 𝑏 个汇聚层(𝑀 通常设置为2 ∼ 5,𝑏为0或1).一个卷积网络中可以堆叠𝑁 个连续的卷积块,然后在后面接着 𝐾 个全连接层(𝑁 的取值区间比较大,比如 1 ∼ 100 或者更大;𝐾 一般为0 ∼ 2)

卷积网络的整体结构趋向于使用更小的卷积核(比如 1 × 1 和 3 × 3) 以及更深的结构(比如层数大于 50).此外,由于卷积的操作性越来越灵活(比如不同的步长),汇聚层的作用也变得越来越小,因此目前比较流行的卷积网络中,汇聚层的比例正在逐渐降低,趋向于全卷积网络


转置卷积和微步卷积

转置卷积

我们一般可以通过卷积操作来实现高维特征到低维特征的转换.比如在一维卷积中,一个5维的输入特征,经过一个大小为3的卷积核,其输出为3维特征.如果设置步长大于1,可以进一步降低输出特征的维数.但在一些任务中,我们需要将低维特征映射到高维特征,这就是转置卷积的作用,所以转置卷积也叫上采样,其主要应用于生成图片,比如图片风格修改等等

卷积运算可以仿写为仿射变换的形式,比如在普通卷积中

z=wxz= w \bigotimes x

=[w1w2w3000w1w2w3000w1w2w3]x=\begin{bmatrix} w_1 & w_2 & w_3 & 0 & 0 \\ 0 & w_1 & w_2 & w_3 & 0 \\ 0 & 0 & w_1 & w_2 & w_3 \\ \end{bmatrix}x

=Cx=Cx

其中𝑪 是一个稀疏矩阵,其非零元素来自于卷积核𝒘中的元素。如果要实现3维向量𝒛到5维向量𝒙的映射,可以通过仿射矩阵的转置来实现,即

x=CTz=[w100w2w10w3w2w10w3w200w3]zx=C^Tz\\ =\begin{bmatrix} w_1 & 0 & 0 \\ w_2 & w_1 & 0 \\ w_3 & w_2 & w_1 \\ 0 & w_3 & w_2 \\ 0 & 0 & w_3 \\ \end{bmatrix}z

从这里可以发现,转置也是形式上转置关系,并不是卷积的逆运算。同样在全连接网络中,前向计算和反向传播也是转置关系

回到转置卷积,如果对一个𝑀 维的向量𝒛,和大小为𝐾 的卷积核,如果希望通过卷积操作来映射到更高维的向量,只需要对向量𝒛进行两端补零𝑃 = 𝐾 − 1,然后进行卷积,可以得到𝑀 + 𝐾 − 1维的向量.

image-20231227181200989

微步卷积

通过修改步长也可以实现上采样和下采样,当S>1S>1时来实现特征的下采样,当S<1S<1时来实现上采样。当通过设置S<1S<1来加强上采样的转置卷积就被叫做微步卷积。为了实现微步卷积,我们可以在输入特征之间插入0来间接地使得步长变小

image-20231227200953795

如果卷积操作的步长为 𝑆 > 1,希望其对应的转置卷积的步长为 1 𝑆 ,需要在输入特征之间插入𝑆 − 1个0来使得其移动的速度变慢

下面是一个二维微步卷积的例子

输入矩阵

I=[1234]I= \begin{bmatrix} 1 & 2\\ 3 & 4 \end{bmatrix}

卷积核K

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

假设步长为2

首先对矩阵进行插值,扩大尺寸

I=[1020000030400000]I^′ = \begin{bmatrix} 1 & 0 & 2 & 0\\ 0 & 0 & 0 & 0\\ 3 & 0 & 4 & 0\\ 0 & 0 & 0 & 0\\ \end{bmatrix}

接着重复卷积,得到结果

O=[1234]O= \begin{bmatrix} 1 & 2\\ 3 & 4 \end{bmatrix}


空洞卷积

对于一个卷积层,如果希望增加输出单元的感受野,一般可以通过三种方式实现:1)增加卷积核的大小;2)增加层数,比如两层 3 × 3 的卷积可以近似一层5 × 5卷积的效果;3)在卷积之前进行汇聚操作.前两种方式会增加参数数量,而第三种方式会丢失一些信息

空洞卷积是一种不增加参数数量,同时增加输出单元感受野的办法,也叫膨胀卷积

如果在卷积核的每两个元素之间插入𝐷 − 1个空洞,卷积核的有效大小为𝐾=𝐾+(𝐾1)×(𝐷1),𝐾^′ = 𝐾 + (𝐾 − 1) × (𝐷 − 1),

空洞卷积

其中D被称为膨胀率,当D=1时是普通卷积核


残差网络

老师讲解的残差网络

残差网络(Residual Network,ResNet)是通过给非线性的卷积层增加直连边的方式来提高信息的传播效率。

假设在一个深度网络中,我们期望一个非线性单元(可以为一层或多层的卷积层)f(x,θ)f(x,\theta)去逼近一个目标函数为h(x)h(x)。也就是把目标函数拆成两部分:恒等函数和残差函数

h(x)=x+(h(x)x)h(x)=x+(h(x)-x)

而学习残差函数会比学习目标函数会更加容易,再加上连接跳跃传递恒等函数,就可以环节梯度消失或者爆炸的现象

接下来并非老师要求的残差网络内容,但我想理解,故写

为什么需要残差网络

残差网络是为了解决在深度模型中,会出现的梯度爆炸和梯度消失的问题,也就是模型退化问题。比如56层的网络性能和20层相当,这是不合理的。

如何理解残差网络

残差网络最关键的在于对于传统神经网络函数设计的修改,增加了残差块的内容。根据万能近似定理,该定理认为,具有足够数量神经元的单隐层前馈神经网络可以以任意精度近似任何连续函数。也就是意味着神经网络每一层都是试图学习一个从输入到输出的函数。但在实践中,神经网络随着网络的加深,就会出现梯度消失或者爆炸,就意味着,当训练到极限时,再继续训练,训练效果并不能保持,反而下降。而我们希望的是网络有能力根据需要学习恒等映射或更复杂的映射。跳跃连接允许网络在必要时绕过某些层,这在理论上使得即使是非常深的网络也能有效地训练,因为它们可以简单地学习近似恒等的映射,而不是被迫学习更复杂的变换。残差网络的就能通过恒等映射解决深层网络中梯度消失/爆炸问题,提高训练的稳定性和效率。

传统神经网络是希望直接学习输入到输出的映射

Output=H(x)Output=H(x)

残差网络是希望学习输入和输出之间的残差

Output=F(x)+x=H(x)x+x=H(x)Output=F(x)+x=H(x)-x+x=H(x)

这个和老师讲的恒等函数和残差函数就对应上了,而跳跃连接传递的就是恒等函数,网络学习的是残差函数。当网络通过反向传播和梯度下降,如果发现跳跃连接会减少误差,就会调小直接学习的权重,使得实现跳跃连接


结束