数字图像处理(4版)——第 12 章——图像模式分类(下)(Rafael C.Gonzalez&Richard E. Woods)

目录

12.6  深度卷积神经网络(Deep Convolutional Neural Networks)

12.6.1  一个基本的CNN架构(A Basic CNN Architecture)

12.6.1.1  CNN的基础工作原理(Basics of How a CNN Operates)

12.6.1.2  CNN 中的神经计算(Neural Computations in a CNN)

12.6.1.3  多输入图像(Multiple Input Images)

12.6.2  CNN前向传播公式(The Equations of a Forward Pass Through a CNN)

12.6.3  训练 CNN 的反向传播公式(The Equations of Backpropagation Used to Train CNNs)

12.7  其它一些实现细节(Some Additional Details of Implementation)


12.6  深度卷积神经网络(Deep Convolutional Neural Networks)

    迄今为止,我们一直将模式特征组织为向量形式。通常,这种做法预设了这些特征的形式已明确指定(即由人类设计者进行“特征工程”),并在输入神经网络之前已从图像中提取完毕(例 12.13 便展示了这一方法)。然而,神经网络的一大优势在于,它们能够直接从训练数据中学习模式特征。我们所期望的理想做法是:将一组训练图像直接输入神经网络,并让网络自主地学习所需的特征。实现这一目标的一种途径是:依据线性索引对像素进行排列(参见图 12.1),从而将图像直接转换为向量;随后,将该线性索引中的每一个元素(即像素)作为向量的一个分量。然而,这种方法未能充分利用图像中像素之间可能存在的任何空间关系——例如像素构成的角点结构、边缘片段的存在,以及其他有助于区分不同图像的特征。在本节中,我们将介绍一类被称为“深度卷积神经网络”(简称 CNN ConvNet)的神经网络;这类网络能够直接接收图像作为输入,且特别适用于自动特征学习与图像分类任务。为了区分 CNN 与我们在第 12.5 节中所探讨的神经网络,我们将后者统称为“全连接”神经网络。

12.6.1  一个基本的CNN架构(A Basic CNN Architecture)

    在接下来的讨论中,我们将利用 LeNet 架构(参见本章末尾的参考文献)来介绍卷积网络。我们之所以这样做,主要基于两个原因:首先,LeNet 架构通俗易懂,这使其成为引入 CNN 基本概念的理想载体;其次,我们真正的重点在于推导卷积网络的反向传播公式,而 LeNet 架构的直观性恰好简化了这一推导过程。

    图 12.40 所示的 CNN 包含了 LeNet 架构的所有基本要素,在此我们将其作为通用示例进行探讨。该架构与我们在上一节中研究的神经网络架构之间的一个关键区别在于:CNN 的输入是二维数组(即图像),而全连接神经网络的输入则是向量。然而,正如你稍后即将看到的,这两种网络所执行的计算过程却非常相似:(1) 计算乘积之和;(2) 加上一个偏置值;(3) 将结果输入激活函数进行处理;(4) 最终得到的激活值作为下一层的单个输入。

--------------------图 12.40:这是一个包含了 LeNet 架构所有基本元素的卷积神经网络(CNN)。点 A 和点 B 代表了将在本节稍后部分探讨的具体数值。经过池化(pooling)处理的最后一层特征图展平为向量,并作为全连接神经网络的输入。输入图像所属的类别,由输出层中数值最高的神经元所决定。------------------------------------------------

    尽管卷积神经网络(CNN)与全连接神经网络所执行的计算在本质上是相似的,但这二者之间仍存在一些基本差异——且这些差异不仅仅局限于其输入格式分别是二维数组还是向量这一点。一个重要的区别在于,正如前文所述,CNN 能够直接从原始图像数据中学习二维特征。鉴于目前尚不存在能够系统化地为复杂图像识别任务构建全面特征集的工具,因此,拥有一套能够直接从原始图像数据中自主学习图像特征的系统,便构成了 CNN 的一项关键优势。另一个主要差异体现在网络层之间的连接方式上。在全连接神经网络中,我们将某一层的每一个神经元的输出,直接输入到下一层的每一个神经元中。相比之下,CNN 中,输入到某一层的每一个输入节点的值,均由前一层输出结果中某一空间邻域范围内的卷积运算(这也是“卷积神经网络”这一名称的由来)所决定。因此,从上一节所定义的意义上讲,CNN 并非属于“全连接”的网络。此外还有一个差异在于,从前一层向后一层传递的二维数组会经过下采样处理,旨在降低网络对输入图像中平移变化(即位置偏移)的敏感度。在接下来的讨论中,随着我们逐步探究各种不同的 CNN 架构配置,上述这些差异及其背后的深层含义将会变得愈发清晰明了。

12.6.1.1  CNN的基础工作原理(Basics of How a CNN Operates)

如上所述,CNN 中所采用的邻域处理类型即为空间卷积。我们在图 3.29 中阐释了空间卷积的运作机制,并利用公式 (3-35) 对其进行了数学表达。正如该公式所示,卷积运算本质上计算的是像素值与一组卷积核权重之间的乘积之和。这一运算过程会在输入图像的每一个空间位置上逐一执行。输入图像中每一个位置 ( x, y ) 处所产生的运算结果均为一个标量值。我们可以将这一数值视为全连接神经网络某一层中某个神经元的输出。若在此基础上加上一个偏置项,并将结果输入至激活函数进行处理(见图 12.29),我们便能建立起 CNN 所执行的基本运算与上一节所探讨的神经网络运算之间的一一对应关系。

上述论述已归纳于图 12.40 中,该图的最左侧部分展示了输入图像中某一位置处的一个局部区域(即“邻域”)。用 CNN 的术语来讲,这些邻域称为“感受野”(receptive fields)。感受野的唯一作用,即是从输入图像中选取一块像素区域。如图所示,CNN 执行的首项操作是“卷积”;其输出数值的生成过程是:将感受野在图像上进行滑动,并在每一个位置处,计算一组权重与该感受野所覆盖的像素值之间的乘积之和。这组权重按照感受野的形状排列,即构成了所谓的“核”(kernel)——正如我们在第 3 章中所介绍的那样。感受野在空间上移动的步长(increments)(即移动的增量大小),称为“步幅”(stride)。我们在前几章中所进行的那些空间卷积运算,其步幅均为 1;但这并非卷积公式本身所强加的硬性要求。在 CNN 中,采用大于 1 的步幅,其背后的一项重要动因是为了实现“数据降维”(data reduction)。举例而言,若将步幅从 1 调整为 2,则图像在每一个空间维度上的分辨率都会降低一半,从而使得每幅图像所需的数据量减少四分之三。采用较大步幅的另一项重要动因,则是将其作为“下采样”(subsampling)操作的一种替代手段;正如我们下文即将探讨的那样,下采样的主要作用在于降低系统对空间平移变化的敏感度。

对于每一个卷积值(即乘积之和),我们为其加上一个偏置项,随后将所得结果输入激活函数,从而生成一个单一数值。接着,该数值会被送入下一层输入的对应 ( x , y ) 位置处。当对输入图像中的所有位置重复上述过程后,便会产生一组二维数值;我们将这组数值作为二维数组存储在下一层中,并将其称为“特征图”(feature map)。之所以采用这一术语,是因为卷积所扮演的角色正是从输入数据中提取诸如边缘、点和斑块等特征(请回想一下,卷积是空间滤波的基础,我们在第3章中曾利用空间滤波来执行图像平滑、锐化以及边缘检测等任务)。在生成输入图像中感受野(receptive field)内所有位置所对应的卷积值(即特征图数值)时,始终使用的是同一组权重和同一个偏置项。这样做旨在确保图像中的每一个点都能检测到相同的特征。出于这一目的而复用同一组权重和偏置项的做法,被称为“权重共享”(或“参数共享”)。

图 12.40 展示了网络第一层中的三个特征图。其余两个特征图也是以前文所述的方式生成的,但每个特征图都使用了不同的权重集和偏置。由于每组权重和偏置各不相同,因此每个特征图通常会包含一组不同的特征,而所有这些特征均提取自同一张输入图像。这些特征图统称为一个卷积层。因此,图 12.40 所示的 CNN 包含两个卷积层。

在卷积和激活操作之后,接下来的步骤是下采样(也称为池化),这一概念的灵感源自 Hubel 和 Wiesel [1959] 提出的哺乳动物视觉皮层模型。他们的研究发现表明,视觉皮层的某些区域由“简单细胞”和“复杂细胞”组成。简单细胞负责执行特征提取任务,而复杂细胞则将这些特征进行组合(聚合),从而形成一个更具意义的整体。在该模型中,空间分辨率的降低似乎正是实现“平移不变性”的关键所在。池化正是对这种降维过程进行建模的一种手段。在使用大型图像数据库训练 CNN 时,池化还具有另一项额外优势——即减少待处理的数据量(若沿用第 3 章的术语,特征图本质上就是经过空间滤波处理的图像)。你可以将下采样的结果视为生成了一系列“池化特征图”。换言之,池化特征图就是空间分辨率降低后的特征图。池化的具体实现方式是:将特征图划分为若干个小型区域(通常为 2 × 2 大小),这些区域称为“池化邻域”;随后,将每一个邻域内的所有元素替换为一个单一的数值。在此,我们假定各池化邻域之间是相邻的(即它们之间不存在重叠)。计算池化数值的方法有多种;我们将这些不同的计算方式统称为“池化方法”。三种常见的池化方法包括:(1) 平均池化(Average Pooling):将每个邻域内的数值替换为该邻域内所有数值的平均值;(2) 最大池化(Max-Pooling):将邻域内的数值替换为该邻域内所有元素中的最大值;(3) \color{red}{L_{2}}  池化 L_{2}  Pooling ):所得的池化数值等于该邻域内所有数值平方和的平方根。对于每一张原始特征图,都会对应生成一张池化特征图。这些池化特征图的集合统称为“池化层”。如图 12.40 所示,我们采用了 2 × 2 大小的池化操作;因此,每一张生成的池化特征图的尺寸仅为其前序特征图尺寸的四分之一。感受野、卷积、参数共享以及池化——正是这四大要素构成了卷积神经网络(CNN)所独有的特征。

由于特征图是空间卷积的产物,根据第 3 章的内容可知,它们本质上就是经过滤波处理的图像。由此推知,经过池化处理的特征图则是分辨率较低的滤波图像。如图12.40所示,第一层输出的池化特征图将作为网络下一层的输入。不过值得注意的是,虽然我们在展示第一层输入时仅呈现了一幅图像,但在作为第二层输入时,我们面对的却是多幅经过池化处理的特征图(即滤波图像)。

为了理解第二层如何处理这些多重输入,请暂时将注意力集中在一张经过池化的特征图上。为了生成第二卷积层中第一张特征图的数值,我们像之前一样,依次执行卷积运算、加上偏置项,并应用激活函数。随后,我们更换卷积核与偏置项,并针对第二张特征图重复上述流程——在此过程中,我们依然使用相同的输入数据。我们会对剩余的每一张特征图都执行这一操作,且针对每一张图更换相应的卷积核权重与偏置项。接着,我们转而处理下一张作为输入的池化特征图,并对第二层中的每一张特征图重复执行相同的流程(即卷积、加偏置、加激活),只不过这一次使用的是另一组截然不同的卷积核与偏置项。当上述步骤全部完成后,我们会发现:在第二层的每一张特征图上,针对同一空间位置,我们实际上生成了三个数值——这三个数值分别源自三张输入特征图中对应位置的数值。此时,问题便随之而来:我们该如何将这三个独立的数值整合成一个单一的数值呢?答案在于:卷积本质上是一种线性运算;基于这一特性,这三个独立的数值可以通过“叠加”(即求和运算)的方式,最终整合成一个单一的数值。

在第一层中,我们有一个输入图像和三个特征图,因此需要三个卷积核来完成所有必要的卷积运算。在第二层中,我们有三个输入和七个特征图,因此所需的卷积核(及偏置项)总数为 3 × 7 = 21 。每个特征图都经过池化处理以生成相应的池化特征图,最终得到七个池化特征图。在图 12.40 中,网络仅包含两个层,因此这七个池化特征图即为最后一层的输出。

照例,最终目标是利用特征进行分类,因此我们需要一个分类器。如图 12.40 所示,在卷积神经网络(CNN)中,我们通过将最后一层池化层的数值输入到一个全连接神经网络中来实现分类;关于该全连接网络的细节,您已在第 12.5 节中有所了解。然而,CNN 的输出是二维数组(即分辨率降低后的滤波图像),而全连接网络的输入则是向量。因此,我们必须将最后一层的二维池化特征图进行向量化处理。我们利用线性索引(参见图 12.1)来实现这一转换。CNN 最后一层中的每一个二维数组都会被转换为一个向量,随后将所有生成的向量进行拼接(按列方向垂直拼接),从而形成一个单一的向量。正如第 12.5 节所阐述的那样,该向量随后会在神经网络中向前传播。在任何具体的应用场景中,全连接网络的输出数量均等于待分类的模式类别数量。同前,输出值最高的那一项将决定输入样本所属的类别。

例 12.14:感受野、池化邻域及其对应的特征图。

图 12.41 的最上一行展示了一个数值示例,说明了特征图与池化特征图的相对尺寸如何随感受野和池化邻域的大小而变化。输入图像的尺寸为 28 × 28 像素,感受野的尺寸为 5 × 5。如果要求在卷积过程中感受野必须完全包含在图像范围内,根据第 3.4 节的内容可知,所得卷积数组(即特征图)的尺寸将为 24 × 24。若采用尺寸为 2 × 2 的池化邻域,如图所示,所得池化特征图的尺寸将为 12 × 12。正如前文所述,我们假定各池化邻域之间互不重叠。

为了与全连接神经网络进行类比,可以将图 12.41 最上一行二维数组中的每一个元素视为一个神经元。输入层神经元的输出即为像素值。第一层特征图中的神经元,其输出值是通过将输入图像与一个卷积核进行卷积运算而生成的;该卷积核的大小和形状与感受野一致,且其系数是在训练过程中学习得到的。对于每一个卷积计算结果,我们为其加上一个偏置项,并将所得结果通过激活函数进行处理,从而生成特征图中对应神经元的输出值。池化特征图中的神经元,其输出值则是通过对特征图中的神经元输出值进行池化操作而产生的。

图 12.41 中的第二行直观地展示了,基于图中所示的输入图像,特征图和池化特征图的具体形态。图中所示的卷积核(kernel)即为上一段落中所描述的那一个;其权重(以灰度值形式呈现)是通过对样本图像进行训练而习得的——这里的训练过程即为稍后在示例 12.17 中详述的 CNN 训练过程。因此,所习得特征的本质完全取决于这些已习得的卷积核系数。值得注意的是,特征图中的内容即是由卷积运算所检测到的特定特征。例如,其中的某些特征专门突显了字符的边缘轮廓。正如前文所述,池化特征则是这一检测效果的低分辨率版本。

----------------------图 12.41:上一行:感受野与池化邻域的大小如何影响特征图及池化特征图的大小。下一行:一个图像示例。本图在示例 12.17 中有更详细的解释。(图片来源:NIST。) --------------------------------------------------------------

例 12.15:图解CNN 分量所执行的功能。

图 12.42 展示了取自图 12.41 的 28 × 28 图像,该图像被输入到图 12.40 所示 CNN 架构的一个扩展版本中。这一扩展后的 CNN(我们将在示例 12.17 中对其进行更详细的探讨)在第一层包含六个特征图,在第二层包含十二个特征图。它采用 5 × 5 大小的感受野,以及 2 × 2 大小的池化邻域。由于感受野的大小为 5 × 5,因此第一层中的特征图大小为 24 × 24,正如我们在示例 12.14 中所解释的那样。每个特征图都拥有其专属的一组权重和偏置;因此,为了生成第一层的特征图,我们总共需要 (5 × 5) × 6 + 6 = 156 个参数(即六个卷积核,每个卷积核包含二十五个权重,外加六个偏置)。图 12.43(a) 的最上一行展示了这些卷积核,其中在 CNN 训练过程中学得的权重被以图像形式呈现,其图像亮度与卷积核数值成正比。

    由于我们采用了大小为 2 × 2 的池化邻域,图 12.42 中第一层的池化特征图尺寸为 12 × 12。正如我们此前所讨论的,特征图的数量与池化特征图的数量是相同的;因此,我们将得到六个尺寸为 12 × 12 的数组,作为输入提供给第二层的十二个特征图(通常而言,不同层之间的特征图数量是各不相同的)。每一个特征图都拥有其专属的一组权重和偏置;因此,为了生成第二层的特征图,总共需要 6 × (5 × 5) × 12 + 12 = 1812 个参数(即十二组卷积核,每组包含六个卷积核,每个卷积核包含二十五个权重,再加上十二个偏置)。图 12.43 的下半部分以图像形式展示了这些卷积核。由于我们采用了大小为 5 × 5 的感受野,第二层的特征图尺寸为 8 × 8。随后,通过采用 2 × 2 的池化邻域进行操作,第二层最终得到的池化特征图尺寸为 4 × 4。

----------------12.42: 一个数值示例,用于演示卷积神经网络(CNN)的各项功能,包括对输入图像的识别。整个过程中均采用了 Sigmoid 激活函数。--------------------

--------------图 12.43:上图:图 12.42 所示 CNN 第一层中对应于六个特征图的权重(以 5 × 5 图像形式显示)。下图:对应于第二层中十二个特征图的权重。----------

正如我们此前讨论过的,最后一层的池化特征图必须进行向量化处理,以便将其输入到全连接神经网络中。每一幅池化特征图都转化为一个大小为 16 × 1 的列向量。共有 12 个这样的向量;当它们垂直拼接在一起时,便形成了一个大小为 192 × 1 的单一向量。因此,我们的全连接神经网络拥有 192 个输入神经元。由于共有十个数字类别,因此设有 10 个输出神经元。正如您稍后将看到的,通过使用一个不含隐藏层的神经网络,我们取得了优异的性能;因此,我们完整的神经网络总共包含 192 个输入神经元和 10 个输出神经元。对于图 12.42 中所示的输入字符,全连接神经网络输出结果中的最高值出现在第七个神经元上,该神经元对应于数字“6”这一类别。因此,该输入被正确地识别了出来。这一结果在图中以粗体文本标示。

图 12.44 以图形化的方式展示了输入图像在通过 CNN 传播过程中,特征图所呈现出的形态。请观察第一层的特征图。若仔细审视每一张特征图,你会发现它们各自突显了输入图像的不同特征。例如,第一列最上方的特征图突显了字符顶部的两条主要边缘;第二张图突显了整个内部区域的边缘;而第三张图则突显了该数字某种“斑块状”的特性,仿佛经过了低通核的模糊处理一般。其余三张图像则展示了其他的特征。尽管经过池化(pooling)处理后的特征图分辨率有所降低,但它们依然保留了原始特征图中的关键特征。若观察第二层的前两张特征图,并将其与第一层的前两张图进行对比,你会发现它们可被解读为该字符上半部分的更高层级抽象——具体而言,它们展示了这样一个区域:该区域的两侧均被具有相反强度(即明暗对比)的区域所包围。尽管这些抽象特征并非总是易于通过肉眼直观分析,但正如后续示例所示,它们在实际应用中往往极其有效。最后一层池化层的向量化表示则一目了然。全连接神经网络的输出结果显示:数值较低的区域呈现为深色,而数值最高的区域则呈现为白色;这表明该输入图像已被准确识别为数字“6”。在本节的后续内容中,我们将展示:图 12.42 所示的这一简易 CNN 架构,能够以近乎完美的准确率,正确识别超过 70,000 个数字样本所属的类别。

----------------------图 12.44:图 12.42 所示 CNN 中,输入图像逐层传播过程的视觉化摘要。图中展示了该网络两个层级中,所有卷积(特征图)和池化(池化特征图)操作的输出结果。(示例 12.17 提供了关于此图的更多详细信息。)-----------------------

12.6.1.2  CNN 中的神经计算(Neural Computations in a CNN)

回顾图 12.29 可知,人工神经元执行的基本计算是:对来自上一层的数值与相应的权重进行乘积求和。在此基础上,我们加上一个偏置项,并将所得结果称为该神经元的“净(总)输入”,记作 z_{i}  。正如我们在式 (12-54) 中所示,用于生成 z_{i}  的求和运算实际上是一个单重求和。而在卷积神经网络( CNN )中,用于生成特征图中单个数值的计算过程则是二维卷积。正如你在第 3 章中所学到的,这本质上是一个双重求和运算,即对卷积核(kernel)的系数与该卷积核所覆盖的图像数组中相应元素进行乘积求和。参照图 12.40,令 w 表示一个卷积核;该卷积核由权重构成,其形状与我们在讨论该图时所提及的“感受野”形状相吻合。为了与第 12.5 节的符号表示保持一致,我们用 a_{x,y}  来表示图像数值或池化后的特征数值——具体代表何者,取决于当前所在的网络层级。输入中任意点 ( x ,y ) 处的卷积值为

(12-83)                 \displaystyle w {\bigstar}a_{x,y} = \sum_{l}\sum_{k}w_{l,k}a_{x-l,y-k}

其中 lk 跨越了核的维度。假设 w 的大小为 3 × 3,那么我们可以将该公式展开为如下的乘积之和:

\begin{array}{lcl} \displaystyle w{\bigstar}a_{x,y} &=&\displaystyle \sum_{l}\sum_{k}w_{l,k}a_{x-l,y-k} \\ \\ &=&\displaystyle w_{1,1} a_{x-1,y-1} + w_{1,2} a_{x-1,y-2} + \hdots + w_{3,3} a_{x-3,y-3} \end{array}

我们可以重标 wa 的下标,重写为

(12-85)        \displaystyle w{\bigstar}a_{x,y}=w_{1}a_{1} + w_{2} a_{2} + \hdots + w_{9} a_{9} = \sum_{i=1}^{9}w_{i} a_{i}

公式 (12-84) 与 (12-85) 的结果是相同的。若我们在后一公式中加入一个偏置项,并将所得结果记为 z,则有

(12-86)         \displaystyle z = \sum_{j=1}^{9}w_{j}a_{j} + b = w {\bigstar}a_{x,y} + b

该公式第一行的形式与公式式 (12-54) 完全一致。因此,我们可以得出结论:如果在 CNN 对输入图像中任意固定位置 ( x ,y ) 执行的空间卷积计算中引入一个偏置项,其结果便可表达为一种与全连接神经网络中人工神经元所执行的计算完全相同的形式。此处引入 xy 坐标,仅是为了体现我们当前是在二维空间中进行运算这一事实。若将 z 视为神经元的净输入,那么只需将 z 输入至激活函数 h 中以求得神经元的输出,我们便完成了与第 12.5 节中所讨论神经元之间的类比:

(12-87)           a = h(z)

这正是特征图中任意点(例如图 12.40 中标记为 A 的点)的数值的计算方式。

现在,请考虑该图中的点 B 。正如前文所述,其数值由三个卷积公式之和给出:

(12-88)         \begin{array}{l}\displaystyle w_{l,k}^{(1)}{\bigstar}a_{x,y}^{(1)} + w_{l,k}^{(2)}{\bigstar}a_{x,y}^{(2)} + w_{l,k}^{(3)}{\bigstar}a_{x,y}^{(3)}\\ \\ = \displaystyle\sum_{l}\sum_{k}w_{l,k}^{(1)}a_{x-l,y-k}^{(1)} + \sum_{l}\sum_{k}w_{l,k}^{(2)}a_{x-l,y-k}^{(2)} + \sum_{l}\sum_{k}w_{l,k}^{(3)} a_{x-l,y-k}^{(3)} \end{array}

其中上标对应于图 12.40 中的三个池化特征图。在上述三个公式中,l , k , xy 的取值均相同,因为这三个卷积核尺寸一致,且同步移动。我们可以展开该公式,得到一个乘积之和;尽管其表达式较图 12.40 中的点 A 所对应的表达式更为冗长,但我们仍可通过重新标记各项,将其化为一个仅包含单重求和的乘积之和——其形式与此前所得结果完全一致。

    上述结果表明,用于计算 CNN 中任意特征图内某一元素数值的公式,均可表达为由人工神经元所执行的计算形式。这一结论适用于任何特征图,无论该特征图内元素的计算过程涉及多少次卷积操作——在此类情况下,我们只需将其视为更多卷积公式的求和即可。其深层含义在于,我们可以利用公式 (12-86) 和 (12-87) 的基本形式,来描述 CNN 中任意特征图内某一元素的数值是如何得出的。这意味着我们无需显式地去考量池化层中所使用的不同池化特征图(进而也即不同卷积核)的具体数量。这一结果极大地简化了用于描述 CNN 前向传播与反向传播过程的数学公式。

12.6.1.3  多输入图像(Multiple Input Images)

    刚才讨论的 a_{xy}  值在第一层中代表像素值;但在第一层之后的各层中,a_{xy}  则代表池化特征的值。然而,我们的公式并未根据这些变量所代表的具体含义进行区分。例如,假设我们将图 12.40 的输入替换为三幅图像——比如一幅 RGB 图像的三个分量。此时,图中点 A 的数值计算公式将与我们此前针对点 B 所列出的公式具有相同的形式——唯一的区别仅在于权重和偏置项不同。因此,此前针对单幅输入图像得出的讨论结果,可以直接适用于多幅输入图像的情况。在接下来的讨论中,我们将举例说明一个采用三幅输入图像的卷积神经网络。

12.6.2  CNN前向传播公式(The Equations of a Forward Pass Through a CNN)

我们在前面的讨论中得出结论,我们可以将一个核 w 和一个输入数组  a_{xy}  的卷积表示为

(12-89)                         \begin{array}{lcl} \displaystyle z_{x,y}&=&\displaystyle \sum_{l}\sum_{k}w_{l,k}a_{x-l,y-k} + b \\ \\ &=&w{\bigstar}a_{x,y} + b \end{array}

其中,l张成核的维数,x张成输入的维数,而 b 是一个偏置。 a_{x,y}  的对应值是

(12-90)                         a_{x,y} = h(z_{x,y})

但这个  a_{x,y}  不同于我们在公式 (12-89) 中使用的那个  a_{x,y}  ,在那个公司中  a_{x,y}   表示来自前一层的值。因此,我们需要其它符号来做层间区分。同全连接神经网络,为此,我们使用 𝓁  ,并将公式 (12-89) 和 (12-90) 写成

(12-91)                         \begin{array}{lcl} \displaystyle z_{x,y}(\ell) &=&\sum_{l}\sum_{k}w_{l,k}(l)a_{x-l,y-k}(l-1) + b(\ell) \\ \\ &=&\displaystyle w(\ell){\bigstar}a_{x,y}(\ell - 1 ) + b(\ell) \end{array}

(12-92)                         a_{x,y}(\ell) = h(z_{x,y})(\ell)

\ell = 1 ,2 , \hdots , L_{c}   ,其中,L_{c}  是卷积层数,而  a_{x,y}(\ell)  表示卷积 𝓁 层上的池化特征值。当 𝓁 = 1  时,

(12-93)                 a_{x,y}(0)= { 输入图像中的像素数 }

而当  {\ell} = L_{c}  时,

(12-94)                 a_{x,y}(L_{c}) =  { CNN 最后一层中池化特征值 }

请注意,这里的索引 𝓁 是从 1开始计数的,而非像第 12.5 节那样从 2 开始。其原因在于,我们是在对层级进行命名——例如称之为“第 𝓁 个卷积层”;若从第 2 个卷积层开始编号,则容易引起混淆。最后值得一提的是,池化操作并不涉及任何卷积运算。池化的唯一功能是降低其前置特征图的空间维度,因此我们在此处不再列出具体的池化公式。

    公式 (12-91) 至 (12-94) 包含了我们在 CNN 卷积部分执行前向传播时计算所有数值所需的全部内容。如图 12.40 所示,最后一层的池化特征值会被向量化,并输入到一个全连接前馈神经网络中;该网络的正向传播过程已在公式 (12-54) 和 (12-55) 中予以阐述,若采用矩阵形式,则详见表 12.2。

12.6.3  训练 CNN 的反向传播公式(The Equations of Backpropagation Used to Train CNNs)

    正如你在上一节中所见,CNN 的前向传播公式与全连接神经网络的公式相似,但其中的乘法运算被卷积运算所取代;此外,其数学符号也反映了这样一个事实:即在第 12.5 节所定义的意义上,CNN 并非全连接网络。正如你在本节中即将看到的,反向传播公式在许多方面也与全连接神经网络中的相应公式十分相似。

    正如第12.5节中反向传播推导过程所示,我们首先从定义入手,考察 CNN 的输出误差相对于网络中每一个神经元是如何变化的。该误差的形式与全连接神经网络中的形式相同,但此时它不再是变量 j 的函数,而是变量 x y 的函数:

(12-95)                 \displaystyle \delta_{x,y}(\ell) = \frac{​{\partial}E}{​{\partial}z_{x,y}(\ell)}

与 12.5 节中一样,我们希望将这个量与  \delta_{x,y}(\ell + 1 )  关联起来,对此,我们再次使用链式法则:

(12-96)                \displaystyle \delta_{x,y}(\ell) = \frac{​{\partial}E}{​{\partial}z_{x,y}(\ell)}=\sum_{u}\sum_{v}\frac{​{\partial}E}{​{\partial}z_{u,v}(\ell+1)}\frac{​{\partial}z_{u,v}(\ell+1)}{​{\partial}z_{x,y}(\ell)}

其中 uv 是在 z 的可能取值范围内进行求和的任意两个变量。正如第 12.5 节所述,这些求和结果源自链式法则的应用。

按定义,公式 (12-96) 的双重求和的第一项是  \delta_{x,y}(\ell+1)  ,我们可以将该公式重写为

(12-97)                 \displaystyle \delta_{x,y}(\ell) = \frac{​{\partial}E}{​{\partial}z_{x,y}(\ell)}=\sum_{u}\sum_{v}\delta_{x,y}(\ell+1)\frac{​{\partial}z_{u,v}(\ell+1)}{​{\partial}z_{x,y}(\ell)}

将公式 (12-92) 代入公式 (12-91),并在公式 (12-97) 中应用此结果 z_{u,v}  ,我们求得

(12-98)                \begin{array}{l} \displaystyle \delta_{x,y}(\ell) = \sum_{u}\sum_{v}\delta_{x,y}(\ell+1)\frac{​{\partial}}{​{\partial}z_{x,y}(\ell)}[ \sum_{l}\sum_{k}\delta_{l,k}(\ell+1)h(z_{u-1,v-k}(\ell))+\ell+1]\end{array}

这个表达式在括号内的部分导数为零(除非 ul = x vk = y),因为 b( 𝓁 + 1) 关于 z_{x,y}(\ell)   的导数是零。但若 ul = x vk = y ,则 l = u - x k = vy 。因此,对括号中的表达式求指定的导数,我们可以将公式 (12-98) 写成

(12-99)         \displaystyle \delta_{x,y}(\ell) = \sum_{u}\sum_{v}\delta_{u,v} (\ell + 1)[ \sum_{u-x}\sum_{v-y}w_{u-x,v-y}(\ell + 1)h^{'}(z_{x,y}(\ell))]

x ,y ,u v 的取值是在括号内的项之外指定的。一旦这些变量的取值确定下来,括号内的 u - xvy 便仅仅是两个常数。因此,双重求和的结果为  w_{u-x,v-y}(\ell + 1)h^{'}(z_{x,y}(\ell))  ,我们可以将公式 (12-99) 写成

(12-100)

\begin{array}{lcl} \displaystyle \delta_{x,y}(\ell) &=&\displaystyle \sum_{u}\sum_{v}\delta_{u,v} (\ell + 1)w_{u-x,v-y}(\ell + 1)h^{'}(z_{x,y} (\ell)) \\ \\ &=&\displaystyle h^{'}(z_{x,y}) (\ell))\sum_{u}\sum_{v}\delta_{u,v} (\ell + 1)w_{u-x,v-y} (\ell + 1) \end{array}

该公式第二行中的双重求和表达式是卷积的形式,但位移量是公式 (12-91) 中位移量的负值。因此,我们可以将公式 (12-100) 写成

(12-101)                \delta_{x,y}(\ell) = h^{'}(z_{x,y}(\ell)) [ \delta_{x,y}(\ell + 1)] {\bigstar} w_{-x,-y} (\ell + 1) ]

下标中的负号表示 w 绕两个空间轴对称。这等同于将 w 旋转 180°,正如我们在公式 (3-35) 中解释的那样。利用这一事实,我们最终通过将公式 (12-101) 等价地写成如下形式,得到了 𝓁 层误差的表达式:

(12-102)                \displaystyle \delta_{x,y}(\ell) = h^{'}(z_{x,y}(\ell)) [\;\delta_{x,y} (\ell + 1)] {\;\bigstar\;} {\rm{rot180}}(w_{-x,-y}(\ell + 1))\; ]

但是核函数与 x y 无关,所以我们可以将这个公式写成

(12-103)                \displaystyle \delta_{x,y}(\ell) = h^{'}(z_{x,y} (\ell)) [\delta_{x,y} (\ell + 1)] {\;\bigstar\;} \text{rot180}(w(\ell + 1)) ]

与第 12.5 节类似,我们的最终目标是计算 E 相对于权重和偏差的变化。按照与上述类似的步骤,我们求得

(12-104)                

                                \begin{array}{lcl} \displaystyle \frac{​{\partial}E}{​{\partial}w_{l,k}}&=&\displaystyle \sum_{x}\sum_{y}\frac{​{\partial}E}{​{\partial}z_{x,y}(\ell)}\frac{​{\partial}z_{x,y}(\ell)}{​{\partial}w_{l,k}} \\ \\ &=&\displaystyle \sum_{x}\sum_{y}\delta_{x,y}(\ell)\frac{​{\partial}z_{x,y} (\ell)}{​{\partial}w_{l,k}} \\ \\ &=&\displaystyle \sum_{x}\sum_{y}\delta_{x,y}(\ell)\frac{​{\partial}}{​{\partial}w_{l,k}(\ell)}[\sum_{l}\sum_{k}w_{l,k}(\ell)h(z_{x-\ell,y-k}) (\ell-1)) + b(\ell)] \\ \\ &=&\displaystyle \sum_{x}\sum_{y}\delta_{x,y}(\ell)h(z_{x-l,y-k}(\ell-1)) \\ \\ &=&\displaystyle \sum_{x}\sum_{y}\delta_{x,y}(\ell)a_{x-l,y-k}(\ell-1) \end{array}

其中最后一行由公式 (12-92) 得出。这一行是卷积的形式,但与公式 (12-91) 比较,我们发现求和变量与其对应的下标符号相反。为了将其写成卷积的形式,我们将公式 (12-104) 的最后一行写成

(12-105)

  \begin{array}{lcl} \displaystyle \frac{​{\partial}E}{​{\partial}w_{l,k}}&=&\displaystyle \sum_{x}\sum_{y}\delta_{x,y}(\ell)a_{-(l-x),-(k-y)}(\ell-1)\\ \\ &=&\delta_{l,k}(\ell){\;\bigstar\;}a_{-l,-k}(\ell-1) \\ \\ &=&\delta_{l,k}(\ell){\;\bigstar\;}{\rm{rot180}}(a(\ell-1)) \end{array}

类似地(见问题 12.32),

(12-106)                \displaystyle \frac{​{\partial}E}{​{\partial}b(\ell)}=\displaystyle \sum_{x}\sum_{y}\delta_{x,y}(\ell)

利用梯度下降公式中的前两个表达式(见第 12.5 节),可得

(12-107)                \begin{array}{lcl} \displaystyle w_{l,k}(\ell) &=&\displaystyle w_{l,k}(\ell) - {\alpha}\frac{​{\partial}E}{​{\partial}w_{l,k}} \\ \\ &=&w_{l,k}(\ell) - {\alpha}\delta_{l,k}(\ell){\;\bigstar\;}{\rm{rot}180}(a(\ell-1)) \end{array}

(12-108)                 \begin{array}{lcl}\displaystyle b(\ell) &=&\displaystyle b(\ell) - {\alpha}\frac{​{\partial}E}{​{\partial}b(\ell)} \\ \\ &=&\displaystyle b(\ell) - {\alpha}\sum_{x}\sum_{y}\delta_{x,y}(\ell) \end{array}

公式 (12-107) 和 (12-108) 用于更新 CNN 中每一个卷积层的权重和偏置。正如我们此前所述,符号 w_{l,k}  代表了某一层的全部权重。变量 lk 遍历了二维卷积核的空间维度,且所有卷积核的尺寸均相同。

在前向传播过程中,我们从卷积层过渡到了池化层。而在反向传播过程中,我们则沿相反的方向进行。然而,池化后的特征图尺寸小于其对应的原始特征图(见图 12.40)。因此,在沿反向传播时,我们需要对每一个池化后的特征图进行上采样( 例如,通过像素复制的方式),使其尺寸与生成该特征图的原始特征图相匹配。由于每一个池化后的特征图都唯一对应于一个原始特征图,因此反向传播的路径是明确定义的。

    参照图 12.40,反向传播过程始于全连接神经网络的输出端。根据第 12.5 节的内容,我们已知如何更新该网络的权重。当反向传播抵达神经网络与 CNN 之间的“接口”处时,我们必须对此前用于生成输入向量的向量化方法执行逆操作。具体而言,在利用公式 (12-107) 和 (12-108) 继续进行反向传播之前,我们必须先将全连接神经网络反向传播回来的那个单一向量,重新还原为各个独立的池化特征图。

    我们在表 12.3 中总结了全连接神经网络的反向传播步骤。表 12.6 总结了针对图 12.40 所示 CNN 架构执行反向传播的步骤。该过程将重复执行预设的迭代次数(epochs),或者直至神经网络的输出误差达到可接受的数值。误差的计算方法与第 12.5 节中所述完全一致;该误差可以是均方误差,也可以是识别误差。请注意,在第 𝓁 层中,权重 w(𝓁) 和偏置值 b(𝓁) 对于每一个特征图(feature map)而言都是各不相同的。

表 12.6:用于训练 CNN 的主要步骤。网络首先利用一组较小的随机权重和偏置进行初始化。在反向传播过程中,从全连接层传入输出池化层的向量必须被转换为二维数组,且其尺寸须与该层中经池化处理后的特征图尺寸保持一致。随后,每一幅经池化处理的特征图均需进行上采样,以使其尺寸与对应的原始特征图相匹配。表格中所列的步骤对应于一个训练周期的完整过程。

例 12.16:教卷积神经网络识别一些简单的图像。

    为了展示 CNN 的性能,我们首先对图 12.45 所示的 CNN 进行训练,使其能够识别图 12.46 中的小型( 6 × 6 像素)图像。如图左侧所示,这里包含了三类图像的样本,每类各三个:分别是水平条纹、居中小型正方形以及垂直条纹。这些图像用作训练集。图右侧则是这三类图像的含噪样本,它们用作测试集。

--------图 12.45:包含一个卷积层的 CNN,用于学习识别图 12.46 中的图像。-----

-----------图 12.46:左侧:训练图像。顶行:深色水平条纹样本。中行:居中深色正方形样本。底行:深色垂直条纹样本。右侧:左侧三类样本的含噪版本,通过向左侧样本添加均值为零、方差为一的 Gauss 噪声生成。(所有图像均为 8 位灰度图像。)----------

    如图 12.45 所示,我们系统的输入为单张图像。我们采用了大小为 3 × 3 的感受野,由此生成了大小为 4 × 4 的特征图。由于共有两张特征图,这意味着我们需要两个大小为 3 × 3 的卷积核(kernels)以及两个偏置项(biases)。随后,我们利用大小为 2 × 2 的邻域进行平均池化操作,从而生成了池化后的特征图。鉴于原始特征图的大小为 4 × 4,经过池化后,我们得到了两张大小为 2 × 2 的池化特征图。这两张池化图共包含八个元素;我们将这些元素组织成一个 8 维列向量,以此实现对最后一层输出的向量化表示。(具体做法是:我们对每张图像进行线性索引,随后将由此得到的两个 4 维向量拼接成一个单一的 8 维向量。)接着,该向量被输入至右侧的全连接神经网络中;该网络由一个输入层和一个包含三个神经元的输出层构成,其中每个神经元对应一个类别。由于该网络不包含隐藏层,因此它实现的是线性决策函数(参见习题 12.18)。为了对系统进行训练,我们将学习率设定为 α = 1.0,并运行了 400 个训练周期(epochs)。图 12.47 绘制了均方误差(MSE)随训练周期变化的曲线图。尽管在训练约 100 个周期时,均方误差数值仍相对较高,但系统此时已实现了对训练集的完美识别。此外,系统对测试集的识别准确率也达到了 100%。系统所学习到的卷积核与偏置项数值如下:

\textbf{\textit{w}}_{1}=\begin{bmatrix} 3.0130&1.1808&-0.0945\\ 0.7918&0.7087&-0.9093\\ 0.7193&0.0230&-0.8833) \end{bmatrix}   ,b_{1} = -0.2990

\textbf{\textit{w}}_{2}= \begin{bmatrix} -0.7388&1.8832&4.1077\\ -1.0027&0.3908&2.0357\\ -1.2164&-1.1853&-0.1987 \end{bmatrix}   ,b_{2} = -0.2834

值得注意的是,该 CNN 是从原始训练图像中自动学习到这些参数的。其中并未采用第 11章中所讨论的那类特征。

-------------------图 12.47:图 12.46 所示图像的训练 MSE 随迭代次数(epoch)的变化曲线。尽管此时的 MSE 相对较高,但在经过大约 100 次迭代后,训练集和测试集均实现了完美识别。------------------------------------------------------------

例 12.17:利用大型训练集训练卷积神经网络识别手写数字。

在本例中,我们将探讨一个更为实际的应用场景,所用数据库包含了 60,000 张手写数字字符的训练图像以及 10,000 张测试图像。该数据库被称为 MNIST 数据库,其内容与 NIST(美国国家标准与技术研究院)的一个数据库颇为相似。前者可视为后者的“净化”版本,其中的字符均已居中对齐,并被统一格式化为 28 × 28 像素的灰度图像。这两个数据库均可在网上免费获取。图 12.48 展示了这些数据库中典型的数字字符示例。正如您所见,这些字符之间存在显著的差异性——而这仅仅是从可用于实验的 70,000 个字符中抽取的一小部分样本。

--------------------图 12.48:样本与 NIST 和 MNIST 数据库中的样本类似。每个字符子图像的大小为 28 × 28 像素。(单个图像由 NIST 提供。)--------------------

图 12.49 展示了我们为识别 MNIST 数据库中的十个数字而训练的 CNN 的架构。我们利用 α = 10 对该系统进行了 200 个周期的训练。图 12.50 绘制了针对 MNIST 数据库中 60,000 张训练图像,训练 MSE 随周期数变化的曲线。

---------------图 12.49:该卷积神经网络(CNN)曾用于识别 MNIST 数据库中的十个数字。该系统利用 60,000 张数字图像进行了训练,这些图像的大小与左侧所示的图像相同。其架构与我们在图 12.42 中所采用的架构一致。(图片来源:NIST。)----------

-------------------------图 12.50:MNIST 数据库中 60,000 张训练数字图像的训练均方误差随 epoch 变化的函数图。-----------------------------------------------

训练采用了每次包含 50 张图像的“小批量”(mini-batches)方式进行,旨在提高学习效率(详见第12.7节的相关讨论)。此外,在每轮(epoch)训练结束后,我们均对训练集和测试集中的所有图像进行了分类识别。此举的目的是为了观察系统学习数据特征的速度。图 12.51 展示了所得结果。对于这两个数据集而言,仅经过相对较少的训练轮次,系统便取得了极高的正确识别率;在大约 40 轮训练后,识别准确率已达到 98% 左右。这一结果与图 12.50 所示的训练集均方误差(MSE)变化趋势相吻合——该误差值起初迅速下降,在大约 40 轮训练后则转为缓慢下降。随后,系统又经过了 160 轮训练,最终才将识别准确率提升至约 99.9%。对于如此小规模的 CNN 而言,这些成果无疑令人印象深刻。

--------------------------图 12.51:(a) MNIST 数据库中 60,000 张训练图像的训练准确率(即对训练集的正确识别百分比)随迭代轮次(epoch)的变化曲线。所达到的最高正确识别率为 99.36%。(b) MNIST 数据库中 10,000 张测试图像的准确率随迭代轮次的变化曲线。最高正确识别率为 99.13%。--------------------------------------------

图 12.52 展示了模型在训练集和测试集上对各个数字类别的识别性能。这两幅图中最具启发性的特征在于,该 CNN 在这两组数据上的表现同样出色。这有力地表明训练是成功的,且模型对此前未曾见过的数字具有良好的泛化能力。这正是神经网络未对训练集数据产生“过拟合”现象的一个典型实例。

-----------------图 12.52:(a) 按图像类别划分的训练集识别准确率。每根柱状图代表一个介于 0 和 1 之间的数值;将这些数值乘以 100% 后,即为该类别的正确识别百分比。(b) 测试集中各类别的识别结果。在这两幅图中,识别率均高于 98% 。-----------

图 12.53 展示了第一层特征图所对应的卷积核数值,这些数值以灰度强度(亮度)的形式呈现。由于输入图像仅有一幅,而输出特征图共有六幅,因此需要六个卷积核来生成第一层的特征图。卷积核的尺寸与感受野的尺寸一致,在本例中我们将其设定为 5 × 5。因此,图 12.53 中最左侧的那幅图像,即为对应于第一层首张特征图的那个 5 × 5 卷积核。图 12.54 展示了第二层的卷积核。在这一层中,输入共有六组(即第一层经过池化操作后的特征图),而输出特征图则有十二幅;因此,我们需要总计 6 × 12 = 72 个卷积核及相应的偏置项,才能生成第二层的这十二幅特征图。图 12.54 中的每一列,均展示了对应于第二层某一张特定特征图的那六个 5 × 5 卷积核。我们在两层网络中均采用了 2 × 2 的池化操作,这使得每一层特征图在两个空间维度上的尺寸均缩小了 50%。

-----------图 12.53:经过200个训练周期后的第一层卷积核,以图像形式展示。-------

-----------------图 12.54:经过200个训练周期(epochs)后,第二层的卷积核以 5 × 5 大小的图像形式展示。第二层接收六个输入(即池化后的特征图)。由于第二层包含十二个特征图,该 CNN 共学习了 6 × 12 = 72 个卷积核的权重。---------------------

最后,值得我们通过可视化方式,来观察一幅输入图像是如何利用训练过程中学得的卷积核在网络中逐层传递的。图 12.55 展示了来自测试集的一幅数字图像,以及 CNN 在每一层所执行的计算过程。与前文一致,我们仍将数值结果以灰度强度的形式呈现。

------------------图 12.55:图 12.49 所示的 CNN 经过训练后,对单幅数字图像执行前向传播所得的结果。其中的特征图是利用图 12.53 和图 12.54 中的卷积核生成的,随后进行了池化操作。该神经网络即为图 12.49 所示的两层神经网络。输出端的高值(以白色显示)表明该 CNN 正确识别了输入图像。(本图与图 12.44 相同。)-------------

让我们来观察第一层卷积运算所产生的结果。如果你仔细审视每一张生成的特征图,你会发现它们各自突显了输入图像中不同的特征。例如,位于第一列顶部的特征图突显了字符上方的两条垂直边缘;第二张特征图突显了整个内部区域的边缘;而第三张特征图则突显了该数字某种“斑块状”的特征——仿佛经过了低通滤波核的模糊处理一般。其余三张特征图则展示了其他的特征。现在,如果你观察第二层中的前两张特征图,并将其与第一层中的第一张特征图进行对比,你会发现它们可以被解读为字符顶部特征的更高层级抽象;具体而言,它们呈现出一种两侧由白色区域夹持着深色区域的形态。尽管从视觉角度直接分析这些抽象特征并非总是易事,但本例清晰地证明了它们能够发挥极高的效用。此外,请务必铭记一个至关重要的事实:我们这套简易的系统,是完全基于 60,000 张训练图像自动学习并提取出这些特征的。正是这种能力,赋予了卷积神经网络在图像模式分类任务中无与伦比的强大威力。在接下来的示例中,我们将进一步探讨更为复杂的图像,并借此展示我们这套简易 CNN 架构所存在的某些局限性。

例 12.18:利用大型图像数据库,训练卷积神经网络识别自然图像。

    在本示例中,我们训练了与图 12.49 所示相同的 CNN 架构,但使用的是图 12.56 中的 RGB 彩色图像。这些图像具有代表性,类似于 CIFAR-10 数据库中的图像;CIFAR-10 是一个广泛用于测试图像分类系统性能的常用数据库。我们的目标是检验图 12.49 所示 CNN 架构的局限性,具体做法是利用复杂度远高于示例 12.17 中 MNIST 图像的数据对其进行训练。用于处理 CIFAR-10 图像的架构与图 12.49 中的架构之间唯一的区别在于:CIFAR-10 图像属于 RGB 彩色图像,因此具有三个通道。我们依据第 973 页题为“多输入图像”(Multiple Input Images)的小节中所阐述的方法,对这些输入图像进行了处理。

----------------------图 12.56:尺寸为 32 × 32 像素的微型图像,代表了 CIFAR-10 数据库中的 50,000 张训练图像和 10,000 张测试图像(其中的“10”代表十个类别)。类别名称显示在右侧。(图像由 Pearson Education 提供。)--------------------------

    我们利用 CIFAR-10 数据库中的 50,000 张训练图像,对经过修改的 CNN 进行了 500 个周期的训练。图 12.57 绘制了训练阶段均方误差(MSE)随训练周期变化的曲线。可以看出,MSE 曲线在数值约为 0.25 处开始趋于平稳。相比之下,图 12.50 中针对 MNIST 数据集的 MSE 曲线所达到的最终数值要低得多。鉴于 CIFAR-10 图像在目标物体及其背景方面均显著更为复杂,这一结果并不令人意外。图 12.58(a) 绘制了训练准确率随训练周期变化的曲线,该曲线证实了训练集上预期的识别性能确实相对较低。具体而言,训练数据的识别率在 68% 左右趋于平稳,而测试数据的识别率则在 61% 左右趋于平稳。尽管这些结果远不及在 MNIST 数据集上取得的成果,但它们与我们对一个非常基础的网络所抱持的预期是一致的。实际上,在该数据库上实现超过 96% 的准确率是可能的(参见 Graham [2015]),但这需要构建更为复杂的网络并采用不同的池化策略。

---------------------图 12.57:针对包含 50,000 张 CIFAR-10 图像的训练集,训练均方误差随 epoch 数量的变化曲线。---------------------------------------------

--------------------图 12.58:(a) CIFAR-10 数据库中 50,000 张训练图像的训练准确率(即对训练集的正确识别百分比)随 epoch 变化的曲线。(b) 10,000 张 CIFAR-10 测试图像的准确率随 epoch 变化的曲线。---------------------------------------

图 12.59 展示了训练集和测试集中各类别的识别准确率。除少数例外,无论是在训练集还是测试集中,识别率最高的均为人工制品,而最低的则是小型动物。青蛙是一个例外,这极可能是因为青蛙的体型和外形特征比(例如)狗或鸟类更为一致。正如你在图 12.59 中所见,若将小型动物从列表中移除,其余图像的识别性能将会显著提升。

------------------图 12.59:(a) CIFAR-10 训练集按图像类别划分的识别率。每个条形图代表一个介于 0 和 1 之间的数值;将这些数值乘以 100% 后,即为该类别的正确识别百分比。(b) 测试集中按类别划分的识别结果。----------------------------------

图 12.60 和图 12.61 展示了第一层和第二层的卷积核。请注意,图 12.60 中的每一列都包含三个 5 × 5 的卷积核。这是因为在本例中,该 CNN 具有三个输入通道。如果仔细观察图 12.60 中的各列,你会发现各列内部的系数排列及数值具有相似性。尽管目前尚不明显这些卷积核具体是在检测什么特征,但显然同一列内的卷积核之间保持着一致性;与此同时,各列之间又截然不同,这表明该网络具备检测输入图像中不同特征的能力。我们展示图 12.61 仅是为了保持内容的完整性;因为考虑到训练集图像的复杂性,加之网络深度尚浅、规模较小,我们很难从网络如此深层的位置推断出太多有意义的信息。最后,图 12.62 展示了利用图 12.60 和图 12.61 中的权重,通过该 CNN 进行一次完整识别过程的演示。图中的输入部分展示了图 12.56 中第一行第七列那幅 RGB 图像的三个颜色通道。第一列中的特征图显示了从输入图像中提取出的各种特征。第二列展示了池化(pooling)操作的结果,为了便于观察,这些结果已被放大至与特征图相同的大小。第三列和第四列展示了第二层的处理结果,第五列则展示了经过向量化处理后的输出。最后,最右侧的一列展示了最终的识别结果:其中白色区域代表输出值较高,而其他区域的数值则显著较小。结果显示,该输入图像被正确地识别为属于第 1 类。

-----------图 12.60:经过 500 个训练周期后,第一层卷积层卷积核的权重。---------

-------------------------图 12.61:经过 500 个训练周期后,第二层卷积层卷积核的权重。这些卷积核的解读方式与图12.54相同。-------------------------------------

-----------------------图 12.62:经过训练的 CNN 前向传播过程的图解。其目的是识别图 12.56 所示图像集中的某一张输入图像。正如输出结果所示,该图像被正确识别为属于第1类——即飞机类。(原始图像由 Pearson Education 提供。)-------------------

12.7  其它一些实现细节(Some Additional Details of Implementation)

    我们在上一节中提到,神经网络(包括卷积神经网络)具备直接从训练数据中学习特征的能力,从而降低了对“人工构建”特征的需求。尽管这是一项显著的优势,但这并不意味着神经网络的设计可以完全脱离人为干预。恰恰相反,设计复杂的神经网络需要极高的专业技能以及大量的实验探索

    在过去的两节中,我们的重点在于神经网络基本概念的构建,并着重阐述了全连接网络与卷积网络的反向传播算法推导过程。尽管反向传播是神经网络设计的基石,但仍有其他重要因素会影响神经网络的学习成效,进而决定其对未见模式的泛化能力。在本节中,我们将简要探讨全连接神经网络与卷积神经网络设计中的若干重要方面。

    在设计神经网络架构时,首要问题之一便是确定网络应包含多少层。从理论上讲,通用逼近定理( Cybenco [1989])告诉我们:在温和的条件下,任意复杂的决策函数都可以通过仅含一个隐层的连续前馈神经网络来逼近。尽管该定理并未指明如何计算这一单隐层的具体参数,但它确实表明,结构简单的神经网络也能具备极其强大的能力。在过去两节的示例中,你已经见证了这一点。然而,实验证据表明,深度神经网络(即包含两个或更多隐层的网络)在学习抽象表征方面,往往优于单隐层网络;而学习抽象表征通常正是机器学习的核心目标所在。目前尚不存在某种算法能够精确确定神经网络中“最优”的层数。因此,确定网络的层数通常需要结合经验与实验探索来共同决定。“从小规模入手”是解决这一问题的一种合乎逻辑的策略。网络的层数越多,反向传播算法遭遇诸如“梯度消失”等问题的概率也就越高——所谓梯度消失,是指梯度值变得极小,以至于梯度下降法彻底失效。在卷积神经网络中,我们还会面临一个额外的问题:随着图像信号在网络中逐层传递,其输入尺寸会逐渐缩小。导致这一现象主要有两个原因。首要原因是由卷积运算本身所引发的自然尺寸缩减,其缩减幅度与感受野的大小成正比。一种行之有效的解决方案是在执行卷积运算之前进行“填充”(padding)操作,正如我们在第3.4节中所讨论的那样。导致尺寸缩减的第二个(也是最主要的一个)原因则是“池化”(pooling)操作。最小的池化窗口尺寸通常为 2 × 2,这意味着在网络的每一层中,特征图的尺寸都会被缩减至原先的四分之一。一种有助于缓解这一问题的策略是对输入图像进行“上采样”(upsampling);但在实施此策略时必须格外谨慎,因为图像尺寸的放大会导致其中关键特征的相对大小也随之等比例增大,进而影响到后续各层感受野尺寸的选取与设定。

    在确定层数之后,接下来的任务是指定每一层的神经元数量。我们总是能够确知首层和末层所需的神经元数量,但中间层的神经元数量却是一个尚无理论上“最佳”答案的开放性问题。如果目标是尽可能减少层数,那么通过增加每层的神经元数量,可以在一定程度上提升网络的性能。

    指定神经网络架构的主要环节,是通过确定激活函数来完成的。在本章中,为了保持示例之间的一致性,我们采用了 Sigmoid 函数;但在某些应用场景下,双曲正切(Tanh)和 (ReLU) 激活函数在提升训练性能方面表现更为优越。

    一旦确定了网络架构,训练便成为赋予该架构实用价值的核心环节。尽管我们在本章中探讨的网络相对简单,但应用于超大规模问题的网络往往拥有数百万个节点,且需要耗费大量时间进行训练。若条件允许,预训练网络的参数将是开展进一步训练或验证识别性能的理想起点。在神经网络训练中,另一个核心主题是利用 GPU 来加速矩阵运算

    在训练过程中经常遇到的一个问题是“过拟合”(over-fitting):即模型在训练集上的识别效果尚可,但在针对未用于训练的样本进行识别时,其识别率却显著降低。换言之,神经网络无法将其所学知识进行泛化,并将其应用于此前从未遭遇过的输入数据上。当无法获取额外的训练数据时,最常用的解决途径是利用几何形变、亮度变化等变换手段,对现有训练集进行人为扩充。在实施这些变换时,必须确保变换后的模式样本仍保持其原有的类别归属不变。另一种主要的解决策略是采用“Dropout”技术;这是一种在神经网络训练期间,随机舍弃(即暂时移除)部分节点及其连接的技术。其核心理念在于通过对网络架构进行微调,从而防止网络过度依赖并适应于某组固定的参数集(参见 Srivastava 等人 [2014] 的研究)。

    除了计算速度,训练过程的另一个重要考量是效率。一些简单的做法——例如在每一个训练周期(epoch)开始时对输入模式进行洗牌——能够减少甚至消除“循环振荡”的可能性;所谓循环振荡,是指参数值以固定的时间间隔反复重现的现象。随机梯度下降是另一项重要的训练优化手段,在该方法中,模型不再使用整个训练集,而是随机选取样本并将其输入到网络中。你可以将此理解为:首先将训练集划分为若干个“小批量”(mini-batches),随后从每一个小批量中选取单个样本进行处理。这种方法往往能促使训练过程更快地收敛。

    除了上述议题之外,LeCun 等人 [2012] 发表的一篇论文对前文讨论中引入的各类考量因素提供了极佳的综述。事实上,这些议题所涵盖的广度足以构成一整本书的探讨内容(参见 Montavon 等人 [2012])。我们此前讨论的神经网络架构,受限于篇幅,其涵盖范围必然是有限的。若想深入了解构建实用型神经网络所需的具体工程要求,不妨研读 Krizhevsky,Sutskever 和 Hinton [2012] 的那篇论文;该文详尽总结了一套大规模深度卷积神经网络的设计与实现过程。在过去十年间,业界已涌现出形形色色的设计方案,其中既包括商业化的实现版本,亦不乏免费开源的实现版本。只需在互联网上稍作检索,便能发现大量可供参考的架构方案。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值