首页 模式识别(卷积神经网络)
文章
取消

模式识别(卷积神经网络)

卷积神经网络是一种专门用于处理网格状数据(如图像、视频)的深度学习模型,其核心思想是通过局部感受野、权值共享和层次化特征提取来自动学习数据的空间或时序模式。


1. 基础概念

一个卷积神经网络通常包括若干个卷积层、激活函数、池化层、全连接层。输入信号通常是多通道的二维图像数据,输出是分类或检测结果。

1.1. 输入

卷积神经网络的输入是图片(视频可以看作连续帧图片),图片 的大小为 $W \times H \times C$,其中 $W$ 和 $H$ 为图片的宽和高,$C$ 为图片的通道数。一张 RGB 图片的通道数 $C = 3$,一张灰度图的通道数 $C = 1$。

在计算机中,图片是以二维矩阵形式存储的,矩阵的行数 $H$ 为图片的高,列数 $W$ 为图片的宽。对于三通道彩色图片,需要存储三个二维矩阵,每个矩阵存储一个通道的颜色信息。

RGB图片

可以看出,原图红、绿两种颜色偏多,因此 red 通导大部分像素偏白(表明该通道像素值较大),而 blue 通道画面偏暗。

图片的二维矩阵中的元素为图片的像素值,取值范围为 $[0,255]$,因为一个像素的颜色采用一个字节存储,一个字节占 8 位(bit),能够表示的十进制数为 $2^8=256$ 个。

图片的矩阵存放

1.2. 基本结构

一个卷积神经网络通常包括若干个卷积层、激活函数、池化层、全连接层。输入通常是多通道的二维图像矩阵数据,输出是分类或检测结果

卷积神经网络的基本结构

可以看出,卷积神经网络主要由若干个「卷积层 + 激活函数 + 池化层」模块顺序拼接组成,最后加上若干层全连接层进行输出。

以 VGGNet-16 为例,一个真实的卷积神经网络结构图如下:

VGGNet-16

1.3. 输出

对于使用卷积神经网络的分类器,网络输出是图片的类别,如经典的猫狗分类任务和手写数字识别任务。在分类任务中,常见的做法是将最后的二维特征图展平成为一维向量,然后使用全连接层映射至对应类别个数的输出层,最后使用 softmax 激活函数 与 交叉熵损失函数 进行分类。

2. 卷积层

2.1. 卷积操作

2.1.1. 卷积核

前述介绍的经典神经网络中,神经元之间通过权重进行连接,这种连接方式可处理一维向量。在卷积神经网络中,为了处理具备空间关系的二维矩阵,设计了一个二维小矩阵作为权重,该小矩阵被称为「卷积核」。类似地,卷积核的取值通就是卷积神经网络的待训练参数。

卷积的作用就是提取特征,可获得图像或数据的局部信息。随着网络加深,可以学得图像的边缘、颜色、形状、纹理等众多基本模式,并逐渐被抽象为具有高层语义的“概念”表示,最后对应到具体的样本类别。

如果关注 PyTorch 深度学习框架中关于卷积的实现,可参考 此处

2.1.2. 单通道卷积

一个典型的单通道 $3\times 3$ 卷积操作如下图所示:

二维卷积

对于一个 $K\times K$ 卷积核,输出特征图中第 $(i,j)$ 个像素值 $y$ 对应的卷积计算的数学公式为:

\[y(i,j)=\sum_{u=1}^{K}\sum_{v=1}^{K}x(i+u-1,j+v-1)\cdot w(u,v) + b\]

其中 $w(u,v)$ 就是卷积核上对应位置的权值,也就是卷积神经网络待训练的参数。可以看出,二维卷积操作就是将输入的二维矩阵中对应元素与卷积核中对应元素相乘,然后求和得到卷积结果。自然想到,如果卷积核参数 $w(u,v)$ 不同,卷积计算后的结果就不相同。这意味着卷积核的取值反映了卷积计算提取出的特征偏好。

下面给出三个经典的卷积核,分别为「整体边缘滤波」、「横向边缘滤波」、「纵向边缘滤波」,如图所示:

经典的卷积核

卷积核一般具备如下特性:

  1. 卷积核往往是行数和列数均为奇数的矩阵,这样中心较好定位;

  2. 卷积核元素的总和体现出输出的亮度,若元素总和为1,卷积后的图像与原图像亮度基本一致;若元素总和为0,则卷积后的图像基本上是黑色,其中较亮的部分往往就是提取出图像的某种特征;

  3. 卷积核、滤波器本质上都是一个东西。滤波实际上就是 Same 模式的卷积操作;

  4. 高通滤波器(High Pass Filter, HPF)表示仅允许图像中高频部分(即图片中变化较剧烈的部分)通过,往往用于对图像进行锐化处理、增强图像中物体边缘等。如 Sobel算子、Prewitt算子、锐化滤波器等;

  5. 低通滤波器(Low Pass Filter, LPF)表示仅允许图像中低频部分(即图片中变化较平缓的部分)通过,往往用于对图像进行模糊/平滑处理、消除噪点等。如高斯滤波器、均值滤波器等;

2.1.3. 多通道卷积

多通道的卷积核,可以理解为多个单通道卷积核的组合,即对每个通道都采用相同的卷积核,然后进行相加,即

\[y(i,j)=\sum_{k=1}^{C_{in}}\sum_{u=1}^{K}\sum_{v=1}^{K}x(i+u-1,j+v-1)\cdot w(k,u,v) + b\]

对应的图例为:

多通道卷积核

由于卷积神经网络的输入和特征图一般均为多通道的,所以多通道卷积又被称为 标准卷积

比如,前述 VGGNet-16 中我们可以看到,其输入的是三通道彩色图像,尺寸为 $224\times 224\times 3$。网络前两层卷积层分别使用了 $64$ 个 $3\times 3$ 卷积核,最终得到的是 $224\times 224\times 64$。

2.1.4. 卷积计算量与参数量

对于一个输入 $C_{in}$ 通道的尺寸为 $H_{in}\times W_{in}$ 的图像,采用 $K\times K$ 卷积核,卷积核个数 $C_{out}$,输出尺寸为 $H_{out}\times W_{out}$,输出单像素(一次卷积)需要进行:

  • 卷积乘法运算:$K^2\times C_{in}$ 次;
  • 卷积加法运算:$K^2\times C_{in}-1$ 次;
  • 偏置加法运算:$1$ 次

一共需要进行 $H_{out}\times W_{out}\times C_{out}$ 次卷积操作,不考虑偏置加法运算的卷积计算量(FLOPs)如下:

\[FLOPs = H_{out}\times W_{out}\times C_{out}\times (2\times K^2\times C_{in}-1)\]

考虑偏置加法运算的卷积计算量(FLOPs)如下:

\[FLOPs = H_{out}\times W_{out}\times C_{out}\times 2\times K^2\times C_{in}\]

注:若只考虑乘加次数(MACC)而不分开计算乘法和加法次数,则卷积计算量减半。

易知,标准卷积的参数量为

\[C_{in}\times K^2\times C_{out}\]

2.1.5. 深度可分离卷积

深度可分离卷积(Depthwise separable convolution, DSC)由单通道卷积(深度卷积)和逐点卷积组成。深度卷积用于提取空间特征,逐点卷积用于提取通道特征。深度可分离卷积在特征维度上分组卷积,对每个channel进行独立的逐深度卷积(depthwise convolution),并在输出前使用一个1x1卷积(pointwise convolution)将所有通道进行聚合。

深度卷积(Depthwise convolution,DWConv)就是深度(通道数)维度不变,改变特征图长宽。与标准卷积的区别在于,深度卷积的卷积核为单通道模式,需要对输入的每一个通道进行卷积,这样就会得到和输入特征图通道数一致的输出特征图。

逐点卷积(Pointwise Convolution,PWConv)就是特征图长宽维度不变,改变通道数。实质上是用1x1的卷积核进行升维,特征图深度与卷积核个数相关。

深度可分离卷积

深度可分离卷积的计算量(FLOPs)如下:

  • 深度卷积
    • 卷积计算次数为:$C_{in}\times H_{out}\times W_{out}$
    • 单次卷积计算量为(考虑偏置):$2\times K^2$
    • 总计算量为:$C_{in}\times H_{out}\times W_{out}\times 2\times K^2$
  • 逐点卷积
    • 卷积计算次数为:$C_{out}\times H_{out}\times W_{out}$
    • 单次卷积计算量为(考虑偏置):$C_{in}\times (1+1)$
    • 总计算量为:$C_{out}\times H_{out}\times W_{out}\times C_{in}\times 2$
  • 总计算量:$C_{in}\times H_{out}\times W_{out}\times 2\times (C_{out}+K^2)$

深度可分离卷积计算量相比标准卷积只有

\[\frac{C_{out}+K^2}{C_{out}\times K^2} = \frac{1}{C_{out}} + \frac{1}{K^2}\]

当 $K=3, C_{out}=64$ 时,深度可分离卷积计算量比标准卷积计算量少 $8\sim 9$ 倍。因此,深度可分离卷积显著减少了计算量和参数量,是轻量化网络(如 MobileNet、EfficientNet)的核心组件。

深度可分离卷积的参数量为

\[K^2\times C_{in}+ C_{in}\times C_{out}\]

相比标准卷积,深度可分离卷积的参数量大幅减少。

2.1.6. 权值共享

权值共享(Weight Sharing)是卷积神经网络的核心特性之一,它通过让同一卷积核在输入的不同位置上重复使用,大幅减少模型的参数量,同时提升计算效率和泛化能力。具体而言:

  • 同一个卷积核(滤波器)在输入的所有位置上滑动并计算局部感受野的加权和;
  • 不同位置使用相同的权重,而不是为每个位置学习独立的参数。

在传统全连接网络中,每个输入神经元与每个输出神经元都有一个独立的权重,导致参数量巨大。假设输入是 $1000\times 1000$ 的图像,输出是 $10$ 个神经元(10分类),参数量为 $1000\times 1000\times 10=10^7$ 。如果使用 $10$ 个 $3\times 3$ 卷积核,参数量仅为 $3\times 3\times 10=27$,且与输入尺寸无关。

权值共享可以实现:

  • 提升泛化性:权值共享强制模型在不同位置检测相同的特征(如边缘、纹理),避免过拟合;
  • 保持平移不变性:无论目标出现在图像的哪个位置,相同的卷积核都能检测到它(适合图像分类、目标检测等任务)。

2.2. 特征图

特征图(Feature Map)是卷积神经网络(CNN)中的一个核心概念,它代表了网络中每个卷积层的输出,可以视为多个二维图像的堆叠。在CNN中,原始图像通过卷积层处理后,会生成多个特征图,每个特征图都是对输入图像的一种特征响应。

特征图的数量由卷积核的数量决定,每个卷积核生成一个特征图。

2.2.1. 浅层特征与深层特征

特征图的作用在于捕捉输入图像的局部特征,并随着网络层次的加深,特征图的尺寸会减小,但所包含的特征信息会更加抽象和具有代表性。在深层网络中,特征图能够揭示输入图像的高级语义信息,这对于图像分类、目标检测等任务至关重要。

  • 浅层特征:对于低级细节和局部模式敏感,适用于处理局部信息和初级任务。这些特征在初步处理和初级任务中通常非常有用,如图像的边缘检测、纹理分类等,但对于更高级的语义信息(如物体的整体结构、上下文等)的理解能力较弱;
  • 深层特征:对于图像或数据中的抽象概念和高级语义信息(如物体的类别、位置关系等)具有更好的表示能力。这些特征更具有语义和泛化能力,可以应用于更复杂的任务,如物体识别、语义分割、目标检测等。

卷积网络这种层级的特征表示使得网络能够逐步提取和组合不同层次的特征,从而实现对输入数据更丰富和更准确地理解和表达。

下图给出了 Zeiler 和 Fergus 利用反卷积技术对卷积网络 AlexNet 进行特征可视化的结果。AlexNet 具有 $5$ 层卷积层,第一和第二层是网络的浅层,提取低层次特征(浅层特征),一般是简单的局部特征,例如边缘、纹理等,第三层是网络的中间层,提取的特征比前两层有所抽象,可以提取出轮胎或者鸟头等部件特征,第4和第5层属于网络的深层,可以提取出狗的全局或者人物全局等更加抽象的高层语义特征(深层特征)。

低层级特征

2.2.2. 特征图尺寸计算

特征图的大小与输入图像尺寸、卷积核尺寸、卷积核个数、移动步长均有关。假设输入图像尺寸为 $N\times N$,卷积核大小为 $F\times F$,卷积核个数为 $M$,移动步长(stride)为 $S$,则经过卷积操作后的特征图大小为

\[\lfloor\frac{N-F}{S}+1 \rfloor \times \lfloor\frac{N-F}{S}+1 \rfloor\times M\]

其中 $\lfloor \cdot \rfloor$ 表示向下取整操作。

2.2.3. 填充操作

填充(padding)是卷积神经网络中的一种重要的技术,通过在输入数据的边缘添加额外的像素(通常是0)来控制卷积操作后的输出特征图尺寸,并改善模型的性能。

如果不进行填充操作,每经过一次卷积,图像的尺寸都会缩小。

无填充卷积

这样处理有两个缺点:

  • 卷积后的特征图越变越小(卷积层很多时,最终得到的将是很小的图片),不利于细微特征识别和小目标检测;
  • 特征图边缘像素只被计算过一次,而中间像素被卷积计算多次,意味着丢失图像角落信息。

考虑填充后,特征图尺寸计算公式为

\[\lfloor\frac{N-F+2\times P}{S}+1 \rfloor \times \lfloor\frac{N-F+2\times P}{S}+1 \rfloor\times M\]

为了保证输出尺寸与输入尺寸一致,需要在图像周围填充一定的像素宽度,计算匹配的填充值 $P$。而 $P$ 的取值与卷积核尺寸 $F$、卷积步长 $S$ 有关。如果采用长宽相等的卷积核(隐含卷积核尺寸为奇数),卷积步长 $S=1$,二者之间的关系为

\[P = (F-1) / 2\]

若卷积核尺寸为 $3\times3$,计算后 padding = 1,即图像周围填充 $1$ 像素的宽度,经过卷积后特征图尺寸正好和原始图像尺寸一样。

有填充卷积

如果观察仔细,可以发现 VGGNet-16 中的每一层卷积层都没有改变输入矩阵的尺寸,因为其所有卷积核尺寸为 $3\times3$,且 $S=1, P=1$。

2.3. 感受野

感受野(Receptive Field)是卷积神经网络中的核心概念,指的是神经网络中某一层神经元在「原始输入图像」上的映射区域大小,即该神经元能 “看到” 的输入图像的范围。通俗地说,感受野决定了神经元在提取特征时所依赖的输入图像的空间信息范围。

在视觉识别任务中,关键性的图像特征、边缘、角点等只占据了整张图像的一小部分,图像中相距较远的的两个像素有相互影响的可能性较小。例如在我们的自拍照当中,我们眼睛的某一个像素和眉毛的像素很可能具有着某种空间关系,但其与我们的背景中某个物体可能就没有关系。因此,在卷积层中,每个输出神经元在空间上只需要和邻域的一小部分输入神经元相连,是一种符合人类视觉回路的生物学特性的模型。这种特性被称为「局部感受野」。

随着网络加深,经过多个卷积-池化层后,每个神经元的感受野逐渐增大,对图像特征的提取也从局部到整体。如下图所示:

感受野

神经元感受野的值越大表示其能接触到的原始图像范围就越大,也意味着它可能蕴含更为全局,语义层次更高的特征;相反,值越小则表示其所包含的特征越趋向局部和细节。因此感受野的值可以用来大致判断每一层的抽象层次。一个大的感受野使得神经网络可以看到输入图像上更大的像素范围,从而更好地理解图像的全局信息,从而提取全局特征,如物体的形状和轮廓。而较小的感受野只能捕捉到图像的局部特征,如边缘或纹理。

2.3.1. 理论感受野

假设第 $i$ 层卷积核大小为 $K_i$,步长为 $S_i$,填充为 $P_i$,则理论感受野的递推计算公式为

\[RF_0 = 1,\quad \begin{cases} RF_i = K_i + (RF_{i-1}-1)\times S_i \quad \text{for center pixels}\\ RF_i = K_i + (RF_{i-1}-1)\times S_i - P_i \quad \text{for border pixels} \end{cases}\]

对于中心像素,也可以采用如下显式计算公式计算理论感受野

\[RF_i = \sum_{l=1}^i \left((K_l-1)\prod_{j=1}^{l-1} S_j\right) + 1\]

2.3.2. 有效感受野

理论感受野区域中每个像素的贡献不是相同的,而是符合高斯分布。由于高斯分布从中心高边快速衰减,因此引入有效感受野的概念。

例:假设一个只使用 $3\times 3$ 卷积层的 $15$ 层卷积神经网络,其理论感受野为 $15\times (3-1)+1 = 31$,但通过对最后一层单个像素置 $1$ 后反向传播至输出层,可以可视化其有效感受野如下图所示。其中,若网络初始权重是随机初始化的,则感受野分布不均匀(图左),若将每个权重设为相同的值,则感受野会呈现标准的高斯分布(图右)。

有效感受野

例:以 LeNet-5 训练用于手写字符识别为例,在训练初始时刻,某个卷积核的感受野图像还是包含间隙的高斯分布。随着训练的进行,感受野会随着卷积核参数变化而变化,并最终趋于稳定。如下图所示:

有效感受野的变化

随着训练的进行,不同的卷积核会关注到图片不同的特征。

假设某卷积核关注某特定的平滑曲线特征,这个卷积核就会对这种曲线有很高的输出值,对其他形状(比如三角形)则输出较低。一个简单的示例如下:

卷积特征提取

可以认为:现有的这个卷积核保存着老鼠屁股曲线的特征,匹配识别出来了老鼠的屁股曲线。我们则还需要其他特征的卷积核,来匹配识别出来老鼠的其他部分。卷积层的作用其实就是通过不断的改变卷积核,来确定能表征图片特征的有用的卷积核是哪些,再得到与相应的卷积核相乘后的输出矩阵,最终用于具体下游任务。

对某个卷积神经网络最后一层卷积的特征图进行可视化。该网络的输入数据为 $224\times224$,最后一层特征图的大小为 $7\times7\times512$,其中 “$512$” 对应了最后一层卷积核的个数,即 $512$ 个卷积核对应了 $512$ 个不同的卷积结果(特征图),每个卷积核对应一个通道的特征图。在可视化时,对于 “鸟” 这组图像,分别从 $512$ 张 $7\times7$ 的特征图中选取 $4$ 张(包括第 $108$、$284$、$375$和$468$个卷积核所对应的特征图),并将特征图与对应原图叠加,即可得到热力图的可视化结 果,如下图所示:

深层特征的热力图表示

由于高层特征是十分抽象的,我们只能大致分析得出:第 $108$ 通道的神经元和第 $468$ 通道的神经元共同参与了「鸟的脚部」的语义概念表示,第 $284$ 通道可能刻画了鸟类翅膀与身体连接的「翅根」概念表示。

2.3.3. 不同卷积的感受野对比

下面分析不同卷积核的理论感受野等效性:

  • 对于单层 $5\times 5$ 卷积核,其感受野为 $5$;
  • 对于两层 $3\times 3$ 卷积核,考虑步长为 $1$、无填充的情况,感受野也为 $5$。

下面分析参数量,假设输入输出通道数均为 $C$:

  • 对于单层 $5\times 5$ 卷积核,参数量为 $5\times 5\times C \times C = 25C^2$;
  • 对于两层 $3\times 3$ 卷积核,参数量为 $3\times 3\times C \times C\times 2 = 18C^2$。

参数量减少 $28\%$。

自行尝试计算:三层 $3\times 3$ 卷积层与单层 $7\times 7$ 卷积层的参数量对比。

三层 $3\times 3$ 卷积核参数量为 $27C^2$;

单层 $7\times 7$ 卷积核参数量为 $49C^2$,参数量减少 $45\%$。

2.3.4. 空洞卷积

空洞(扩张)卷积(Dilated/Atrous Convolution)是一种卷积技巧,可以在保持卷积核参数数量不变的情况下,提高卷积核的感受野。

空洞卷积

2.4. 激活函数

卷积层后一般会应用一个激活函数来引入非线性。为了避免梯度消失,一般采用 ReLU 系列激活函数,详见 此处

3. 池化层

如果仅依赖卷积层,可能需要非常深的网络才能使得深层关注到输入图像的全局深层特征,因此需要有一种方式能够快速降低输入的维度,从而提高网络的效率,这就是池化层的由来。

3.1. 池化操作

池化(又被称为下采样)是卷积神经网络中另一个核心操作,负责特征降维,与卷积操作协同工作以构建高效的特征表示。池化操作可以看作卷积操作的一种变体,其滤波器尺寸(池化窗口)等于移动步长大小,且不包含可学习的权重参数。最常用的池化操作包括:

  • 最大池化:选择池化区域内所有神经元的最大值作为这个区域的表示;特点是保留最显著特征,增强平移不变性。
  • 平均池化:计算池化区域内所有神经元的平均值作为这个区域的表示。特点是平滑特征,抑制噪声。

最大池化与平均池化

3.2. 池化尺寸计算

池化操作的输入输出尺寸关系由以下参数决定:

  • 输入尺寸:$W_{in}×H_{in}×C_{in}$;
  • 池化窗口大小:$K\times K$;
  • 步长:$S$(通常等于窗口大小);
  • 填充:$P$(通常为 $0$);

则输出尺寸为

\[\begin{aligned} H_{out} &= \lfloor \frac{H_{in}+2P-K}{S} \rfloor + 1\\ W_{out} &= \lfloor \frac{W_{in}+2P-K}{S} \rfloor + 1 \end{aligned}\]

注意到,由于向下取整的存在,如果无法整除,部分数据会被丢弃。但现代深度学习框架已经能够较好适应这种情况,可避免数据丢弃,如下图所示:

07.ceilmode

4. 批归一化层

根据 前述 讨论我们知道,若参数初始化不合理,会导致梯度消失或梯度爆炸。解决方法可以通过采用更加合理的 参数初始化 方法,也可以采用本节介绍的引入批归一化层的方法。更多时候,引入批归一化层可以减少神经网络对超参数和初始化方式的敏感度,使得训练可以设置更高的学习率、采用更加粗暴的参数初始化方式,同时提升网络的深度。

批归一化(Batch Normalization,BN)层可以用于经典的深度神经网络(多层感知机)和卷积神经网络中,但之所以在卷积神经网络部分介绍,是因为经典神经网络一版不会设置过深的层数,而卷积神经网络相较而言层数深得多,所面临的梯度消失或梯度爆炸问题也严重的多。

4.1. 批归一化计算

对于输入数据 $z$ (可以是全连接层的输入或卷积层的特征图),批归一化的计算过程为:

  • 计算当前批(batch)数据的均值

    \[\mu = \frac{1}{N}\sum_{i=1}^{N}z_i\]
  • 计算当前批数据的方差

    \[\sigma^2 = \frac{1}{N}\sum_{i=1}^{N}(z_i-\mu)^2\]
  • 标准化(分母极小值 $\epsilon$ 防止除零)

    \[\hat{z} = \frac{z-\mu}{\sqrt{\sigma^2+\epsilon}}\]
  • 缩放和平移

    \[y = \gamma \hat{z} + \beta\]

    其中 $\gamma,\beta$ 是科学系的两个参数,用于缩放和平移。

在 DNN 中,BN 通常置于线性变换和激活函数之间:Dense --> BN --> Tanh,对每一维特征(即每一列)独立计算均值和方差;

在 CNN 中,BN 通常置于卷积层和激活函数之间:Conv --> BN --> ReLU,对每个通道(channel)独立计算均值和方差。

4.2. 如何改善梯度

在「前向传播」中,BN 强制每层输入的分布固定(均值为 0,方差为 1),避免激活值过大或过小,这防止了梯度因输入值的极端变化而剧烈波动(如 ReLU 输入过大导致梯度爆炸,或 Sigmoid 输入过小导致梯度消失)。

在「反向传播」中,BN 的标准化操作对梯度的影响体现在

BN如何改善梯度

  • 原始神经元
\[\frac{\partial L}{\partial z} = \delta\]
  • 增加 BN 后
\[\frac{\partial L}{\partial z} = \frac{\partial L}{\partial y}\frac{\partial y}{\partial \hat{z}}\frac{\partial \hat{z}}{\partial z} = \hat{\delta} \cdot \gamma \cdot \frac{1}{\sqrt{\sigma^2+\epsilon}}\]

(1)由于 BN 层输出 $y$ 相比原始线性组合输出 $x$ 的分布更加稳定,因此 $\hat{\delta}$ 相较于原始误差 $\delta$ 更加可靠;

(2)通过分母 $\sqrt{\sigma^2+\epsilon}$ 对梯度进行调控,输入方差大的梯度会被缩小,输入方差小的梯度会被放大;

(3)通过可学习参数 $\gamma$ 跟踪损失函数,自适应调整梯度幅值。

经过上述三步,尽可能让梯度保持在合理范围内。

4.3. 反向传播

\[\begin{aligned} \frac{\partial L}{\partial \gamma} &= \sum_{i=1}^m\frac{\partial L}{\partial y_i}\cdot \hat{z}_i\quad m=\text{mini-batch size}\\ \gamma &\leftarrow \gamma + \alpha\frac{\partial L}{\partial \gamma}\\ \frac{\partial L}{\partial \beta} &= \sum_{i=1}^m\frac{\partial L}{\partial y_i}\\ \beta &\leftarrow \beta + \alpha\frac{\partial L}{\partial \beta} \end{aligned}\]

可学习的参数允许网络自行决定是否保留标准化效果:

  • 如果 $\gamma=1,\beta=0$,则完全使用标准化后的分布;
  • 如果 $\gamma=\sigma,\beta=\mu$,则完全恢复原始分布;
  • 通过训练学习平衡标准化与模型表达能力。

4.4. 训练和测试的区别

训练时,一次输入一批(batch)样本数据:

  • 均值和方差由当前 batch 计算;
  • 同时维护全局的移动平均均值和方差(用于测试时)。

测试时,由于一次只输入一个样本数据:

  • 使用训练时积累的移动平均均值和方差进行归一化;
  • 不依赖 batch,因此与 batch size 无关。

5. 卷积神经网络训练

5.1. 数据集处理

数据在深度学习中占据着非常重要的地位,一个高质量的数据集往往能够提高模型训练的质量和预测的准确率。已有许多开源数据,比如 ImageNet、COCO、CIFAR-10、CIFAR-100、MNIST 等。但是,对于某些特殊应用,如人脸识别、手势识别、物体检测、图像分类等,没有现成的公开数据集,当公开数据不能满足要求时,需要制作面向特殊应用的数据集。

下面以图片分类任务为例介绍几个常用数据集:

  • ImageNet

    • 斯坦福大学教授李飞飞为了解决机器学习中过拟合和泛化的问题而牵头构建的数据集。该数据集从2007年开始手机建立,直到2009年作为论文的形式在CVPR 2009上面发布。直到目前,该数据集仍然是深度学习领域中图像分类、检测、定位的最常用数据集之一。

    • 基于 ImageNet 有一个比赛,从 2010 年开始举行,到 2017 年最后一届结束。该比赛称为 ImageNet Large-Scale Visual Recognition Challenge(ILSVRC)。“ILSVRC” 一词有时候也用来特指该比赛使用的数据集,即ImageNet的一个子集,其中最常用的是 2012 年的数据集,记为 ILSVRC2012。因此有时候提到 ImageNet,很可能是指 ImageNet 中用于 ILSVRC2012 的这个子集。

    • 对于如基于ImageNet的图像识别的结果评估,往往用到两个准确率的指标,一个是 top-1 准确率,一个是 top-5 准确率。Top-1 准确率指的是输出概率中最大的那一个对应的是正确类别的概率;top-5 准确率指的是输出概率中最大的 5 个对应的5个类别中包含了正确类别的概率。

  • CIFAR-10

    • CIFAR-10 是由 Hinton 的学生 Alex Krizhevsky 和 Ilya Sutskever 整理的一个用于识别普适物体的小型数据集。一共包含10 个类别的彩色图片:飞机( airplane )、汽车( automobile )、鸟类( bird )、猫( cat )、鹿( deer )、狗( dog )、蛙类( frog )、马( horse )、船( ship )和卡车( truck )。每个图片的尺寸为 $32\times 32$ ,每个类别有 $6000$ 个图像,数据集中一共有 $50000$ 张训练图片和 $10000$ 张测试图片。
  • MNIST

    • MNIST(modified national institute of standard and technology)数据集是由Yann LeCun及其同事于1994年创建一个大型手写数字数据库(包含0~9十个数字)。MNIST数据集的原始数据来源于美国国家标准和技术研究院(national institute of standard and technology)的两个数据集:special database 1和special database 3。它们分别由NIST的员工和美国高中生手写的0-9的数字组成。原始的这两个数据集由128×128像素的黑白图像组成。LeCun等人将其进行归一化和尺寸调整后得到的是28×28的灰度图像。大小为 $28\times 28$ 像素,共 $10$ 个类别。

5.1.1. 数据清洗

在数据集中去除掉不符合要求或者错误的数据,保留有效的数据,包括去除重复数据、去除缺失数据、去除异常值等。

5.1.2. 数据增强

深度网络参数量大,需要大样本数据库进行训练。当训练样本不足时,可采用随机裁剪、旋转、翻转、缩放、平移、裁剪、颜色变化、噪声等方式进行扩充,扩充后数据量可达原有数据量的几十倍。

卷积神经网络对移位(translation)、视角(viewpoint)、大小(size)、照明(illumination)(或者以上的组合)具有不变性。这个性质是数据增强的基础,意味着我们可以对原始数据进行一些变换,形成更丰富的数据集,从而提高模型的泛化性能。

另一方面,如同其他许多机器学习方法,神经网络会去寻找「最能区分两个类别的、最明显的特征」。如果数据集组织不当,极有可能发生误判。如下图所示例子中,如果对两个品牌汽车如第一排所示组织样本,然后将品牌 A 车的图片送入训练好的网络,那么神经网络很可能认为它是一辆 B 品牌的车!因为 A 品牌与 B 品牌最明显的区别是 A 品牌汽车都是车头朝向左侧,B 品牌汽车则是是朝向右侧。

误分类

因此,如果能对原始样本集进行增强,比如进行水平翻转,就可以减少数据集中与类别不相关的特征,阻止神经网络学习不相关的特征。

  • (1)几何变换类增强
    • 翻转:水平翻转、垂直翻转;
    • 旋转:将图片旋转一定的角度,对于那些对方向不敏感的任务(如图像分类)是很常见的增强操作; 旋转可能导致出现图像边界外的区域,需要按照一些规则进行填充:
      • 常数填充:填充为特定像素;
      • 镜像填充:通过「中心」镜像反射图像边缘的像素来填充边界;
      • 反射填充:通过「边缘」镜像反射获取的像素来填充边界;
      • 对称填充:通过对称复制图像边缘的像素来填充边界
      • 边缘填充:将图片边界外的区域填充为边缘像素值;
      • 包裹填充:以缺失图像边界为轴线,将图像边界外的区域填充为缺失区域镜像的像素值;
    • 缩放:缩放图片大小,保持图片尺寸一致,便于后续处理;
      • 裁剪:将原始较大的图片裁剪小;
      • 拉伸:将原本较小的图片放大,可以进行水平和/或垂直拉伸,注意这会引入失真,因此谨慎采用;
    • 位移:将图片水平和/或垂直平移若干像素,空白处进行填充。这种增强方法非常有用,因为大多数对象几乎可以位于图像的任何位置。这迫使卷积神经网络看到所有角落;
  • (2)像素变换类增强
    • 颜色扰动:改变图片的亮度、对比度、饱和度、色相,从而改变图片颜色;
    • 叠加噪声:随机叠加一些噪声,最常见的做法就是高斯噪声;
    • 随机遮挡:随机选取一块区域并擦除图像信息;
  • (3)多样本增强
    • SMOTE:Synthetic Minority Over-sampling Technique(合成少数过采样技术),通过人工合成新样本来处理样本不平衡问题,从而提升分类器性能。
    • SamplePairing:从训练集中随机抽取两张图片分别经过基础数据增强操作(如随机翻转等)处理后经像素以取平均值的形式叠加合成一个新的样本,标签为原样本标签中的一种。
    • mixup:Facebook 人工智能研究院和 MIT 提出的基于邻域风险最小化原则的数据增强方法,它使用线性插值得到新样本数据。

下图是某些增强操作中,对引入的边界外区域进行不同填充方式的例子。

不同填充方式

5.2. 超参数设置和参数初始化

5.2.1. 超参数设置

  • 学习率:学习率控制着权重更新的速度,过小会导致训练速度慢,过大会导致模型不稳定;

  • 批大小:在深度学习中,批处理是一种训练数据的处理方式,它将一组样本一起输入到神经网络中进行前向传播和反向传播,以进行参数更新;

  • 正则化系数:正则化可以帮助减少过拟合,通常采用L1、L2正则化。正则化系数越大,对权重的惩罚也就越大,从而对网络的权重参数起到约束作用;

  • 迭代次数:在训练神经网络时,通常设置一个迭代次数,当迭代次数达到设定值时,训练就停止。迭代次数过小会导致模型欠拟合,迭代次数过大会导致模型过拟合。

5.2.2. 参数初始化

  • 随机初始化
    • 最常见的参数初始化方法,它将网络参数随机初始化为一组小的随机数。这种方法通常适用于较浅的网络,如只有一层或两层的网络。随机初始化可以打破对称性,使网络参数具有不同的初始值,从而更好地探索参数空间;
    • 对于深层网络,常用的随机正态分布初始化,可能会导致梯度消失(详见 此处 )。
  • Xavier 初始化
    • 是一种针对神经网络权重的初始化方法,由 Xavier Glorot 和 Yoshua Bengio 在 2010 年提出,旨在解决深层神经网络训练中的梯度消失或爆炸问题;
    • 其核心思想是根据输入和输出的维度自适应地调整初始权重的范围,以确保各层激活值的方差保持一致。Xavier 初始化可表示为:
    \[W_{i,j}\sim N\left( 0,\frac{2}{n_{in}+n_{out}} \right)\]
    • 适用于梯度在 $0$ 附近近似线性的激活函数,如 Tanh、Sigmoid;
    • 对于卷积层,$n_{in} = \text{kernel_size}^2\times \text{in_channels}$,$n_{out} = \text{out_channels}$
    • 一些关于 xavier 初始化的额外参考:https://zhuanlan.zhihu.com/p/458373836
  • He 初始化
    • 是何凯明(Kaiming He)等人于 2015 年在论文《Delving Deep into Rectifiers》中提出的一种针对 ReLU 类激活函数的权重初始化方法,是 Xavier 初始化的改进版本,专门解决 ReLU 在训练中可能导致的梯度消失或爆炸问题;
    • ReLU 函数负半轴为零,导致方差减半,因此不可直接套用 Xavier 初始化,而是做如下改进:
    \[W_{i,j}\sim N\left( 0,\frac{2}{n_{in}} \right)\]
    • 在此基础上进一步改进,考虑前向传播(Fan-in)和反向传播(Fan-out) 的不同情况,得到 Kaiming 初始化。
    1
    2
    3
    4
    5
    
    # He 正态初始化(Fan-in 模式)
    nn.init.kaiming_normal_(weight, mode='fan_in', nonlinearity='relu')
    
    # He 均匀初始化(Fan-out 模式)
    nn.init.kaiming_uniform_(weight, mode='fan_out', nonlinearity='leaky_relu', a=0.01)
    

5.3. 网络训练

5.3.1. 优化器

  • 梯度下降:梯度下降法是一种最基本的网络优化算法。它通过计算损失函数对于每个参数的偏导数来调整网络参数,使得损失函数逐渐减小,更新公式如下

    \[W \leftarrow W - \eta \nabla J(W)\]
  • 动量梯度下降:动量梯度下降优化法是一种基于梯度下降法的优化算法,它可以加速网络的训练过程,避免梯度下降过程中出现震荡或陷入局部最优解。具体地,动量优化法在更新网络参数时不仅考虑当前梯度,还考虑之前的梯度方向,从而使得更新更加平滑,其更新公式为:

    \[\begin{aligned} v &\leftarrow \beta v + (1-\beta) \nabla J(W)\\ W &\leftarrow W - \eta v \end{aligned}\]

    其中,$v$ 是动量项(累积梯度),$\beta$ 是动量系数(通常设置为 $0.9$),$\eta$ 是学习率。$

  • Adam 优化:Adam(Adaptive Moment Estimation)是一种自适应学习率的优化算法,其使用梯度的一阶和二阶矩估计来动态调整每个参数的学习率,以便更好地适应不同参数的更新需求。记当前步梯度的一阶矩估计和二阶矩估计为 $m$ 和 $v$,则 Adam 优化方程为:

\[\begin{aligned} m &\leftarrow \beta_1 m + (1 - \beta_1) \nabla J(W) \\ v &\leftarrow \beta_2 v + (1 - \beta_2) \nabla J(W) ^2\\ \hat{m} &= \frac{m}{1 - \beta_1}\\ \hat{v} &= \frac{v}{1 - \beta_2}\\ W &\leftarrow W - \alpha \cdot \frac{\hat{m}}{\sqrt{\hat{v}} + \epsilon} \end{aligned}\]

在现代深度学习框架中,可以通过一行语句实现优化器选择

1
optimizer = optim.Adam(model.parameters(), lr=0.001)

5.3.2. 正则化

正则化是一种常用的减少过拟合的方法,通过在损失函数中加入一些额外的约束,使得网络参数的取值更加平滑或稀疏,从而避免过拟合。常用的正则化方法包括:

  • L1 正则化:L1 正则化通过在损失函数中加入 L1 损失,使得网络参数的绝对值更小,从而减少过拟合。

    \[L = \text{loss} + \beta \Vert W\Vert_{1}\]
  • L2 正则化:L2 正则化通过在损失函数中加入 L2 损失,使得网络参数的平方值更小,从而减少过拟合。

    \[L = \text{loss} + \beta \Vert W\Vert_{2}\]
  • 随机失活(Dropout):一种随机删除神经元的方法。具体地,在每次训练时,随机将一部分神经元的输出值为 $0$。在测试时,不使用 Dropout,而是将每个神经元的输出乘以一个保留概率。Dropout 可以有效地减少过拟合,并且不需要对权重进行额外的约束。

5.4. 从头训练和迁移学习

从头训练指的是使用未经过预训练的模型,从头开始训练模型来解决特定的任务。这种方法需要大量的数据和计算资源,并且需要从零开始训练模型。当数据集与先前的任务不同,或者是需要解决一个新的问题时,通常需要从头训练网络。

迁移学习则是指利用已经训练好的模型(通常是在大规模数据集上训练得到的模型)的部分或全部,对新的任务进行训练。迁移学习通常可以减少训练时间和数据需求,同时还可以提高模型的准确性。这种方法通常可以分为两种类型:基于特征的迁移学习和基于模型的迁移学习。

  • 基于特征的迁移学习是指使用先前训练好的模型来提取数据集中的特征,并将这些特征作为新模型的输入。这种方法通常可以减少训练时间和数据需求,并且可以在小规模数据集上获得较好的性能。

  • 基于模型的迁移学习是指使用先前训练好的模型作为新模型的初始状态,并在新的数据集上进行微调(Fine-tune)。这种方法通常需要更多的数据和计算资源,但通常可以获得更好的性能。

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

模式识别(经典神经网络)

-