卷积神经网络
卷积神经网络(Convolutional Neural Network, CNN)作为深度学习的一种重要模型架构,已经成为计算机视觉领域的中流砥柱。卷积神经网络的核心思想是通过卷积操作提取数据的局部特征,并通过层层递进的方式逐步捕捉更高层次、更抽象的特征。它摒弃了传统神经网络中全连接层的高昂计算成本,代之以卷积层和池化层,从而大幅减少了模型的参数数量和计算复杂度。同时,卷积操作具有平移不变性,使得CNN在处理图像等视觉数据时能够更好地识别和分类对象。
2012年,AlexNet的问世标志着深度卷积神经网络在图像分类上的巨大成功,使得CNN成为计算机视觉领域的标准方法。随后,VGGNet、GoogLeNet、ResNet等更为复杂的卷积神经网络架构相继提出,并被广泛应用在图像识别、医疗影响分析、人脸识别等领域。
这一部分我们将探讨卷积神经网络的基本原理、架构以及常见结构。
CNN的基本结构
在介绍CNN的基本结构之前,我们首先要熟悉/回顾一下卷积操作是什么。
卷积操作的概念
卷积操作的概念来源于数学中的卷积运算。在数学中,两个函数之间的卷积(Convolution)(Rudin, 1973)被定义为:
这里卷积是通过计算函数和一个翻转并平移后的函数的重叠面积得到的。卷积也可以看成是将一个函数滑过另一个函数,并在每个位置计算两个函数的重叠程度。
当我们处理离散对象时,积分会转化为求和:
对于二维张量数据,比如CNN通常处理的二维图像数据,卷积操作可以通过对两个索引的求和来定义。二维卷积定义为:
卷积层(Convolutional layer)
在卷积神经网络中,卷积操作通过在输入数据上滑动一个小的矩阵(称为卷积核或滤波器),并计算点积来生成一个新的特征图(Feature Map)。这个过程可以视为在输入数据中应用一个局部感受野的滑动窗口,从而提取不同位置的局部特征。
具体来说,假设我们有一个输入图像(或特征图) ,以及一个卷积核(滤波器),它们的大小分别为和。卷积操作就是将卷积核在输入图像 上滑动,并在每个位置上计算二者对应元素的乘积之和。该过程可以通过以下数学公式表示:
其中,表示输入图像中第行、第列的像素值,表示卷积核中第行、第列的权重值,表示输出特征图中的第个值。
卷积核(Filter,kernal)是一个小矩阵,通常比输入图像小得多。每个卷积核都有固定的大小(如 ,),并且卷积核的权重在整个卷积操作过程中保持不变。卷积核的目的是捕捉特定的特征,如边缘、角点、纹理等。在实际应用中,通常使用多个卷积核,每个卷积核学习不同的特征。卷积层的输出特征图的数量等于卷积核的数量。卷积核的参数(权重)在整个输入图像上共享,这意味着同一个卷积核在不同位置使用相同的参数。这种方式极大地减少了参数数量,避免了过拟合。
下面,我们将以一个例子来说明卷积操作的具体计算过程。假设我们有如下 的图片,我们使用的卷积核是。
这里我们只考虑一个简单的例子就是图片和卷积核都是单通道的,而实际中,图片跟卷积核则通常都是3通道的(RGB)。
我们从左上角开始进行卷积,可以形象化的将卷积核叠放在图片上,并计算两者之间的点乘/内积,得到了特征图中第一个元素的值。
接下来,我们将卷积核向右移动一步,再次进行内积运算,得到特征图中第二个元素的值。
重复这一过程,我们最终将会得到使用这一卷积核的特征图。
在上面的卷积操作中,我们发现,每当卷积核是无法“真正”到达图像边界的,换句话说,卷积核的中心位置“看不到”图像边缘,这也就会导致边缘信息的丢失。为了避免边缘信息丢失,通常会进行一个零填充(zero-padding)的操作,也就是在输入数据的边界处添加零值,以控制输出特征图的尺寸。假设有一个 的输入图像,我们应用一个 的卷积核进行卷积。如果不使用填充,输出特征图的尺寸将为 (即 )。但如果我们在输入图像的每一边填充一圈零值,使其变为 ,那么卷积操作后的输出特征图尺寸将保持为 。
此外,步长(Stride)是指卷积核在输入图像上移动的步幅(每次滑动的距离,上面例子中stride=1)。Stride 的大小直接影响输出特征图的尺寸和计算复杂度。Stride = 1是最常见的设置,卷积核每次移动一个像素。这个设置下,输出特征图的尺寸最大。当步长大于1时,卷积核每次移动的距离会增加,导致输出特征图的尺寸减小。例如,Stride=2 表示卷积核每次移动两个像素,输出特征图的尺寸会缩小一半(忽略填充的影响)。Stride 的作用类似于池化层,它通过减小输出特征图的尺寸来达到下采样的效果。通过使用较大的Stride,可以在不使用池化层的情况下减小特征图的尺寸,从而降低计算量。假设有一个 的输入图像,使用一个的卷积核进行卷积。如果Stride为1,输出特征图的尺寸为 ;如果Stride为2,输出特征图的尺寸将变为()。
刚才提到图像通常具有RGB三个通道,因此在对彩色图像进行处理时,需要单独考虑每个通道的颜色分量。输入通道数:卷积层的输入特征图可以有多个通道。例如,RGB图像有3个输入通道。每个通道与卷积核的相应部分进行卷积,结果再进行加权求和,生成一个输出通道。输出通道数:卷积层的输出通道数通常由卷积核的数量决定。每个卷积核提取不同的特征,因此增加卷积核数量可以增加输出通道数,也就是生成更多的特征图。输出通道数增加可以使模型捕获到更多的特征信息。
池化层(Pooling Layer)
池化层(Pooling Layer) 是卷积神经网络(CNN)中的一个关键组成部分,用于对卷积层输出的特征图进行下采样,从而减少数据的空间维度,同时保留重要的特征。池化层通过对输入特征图应用池化操作,生成一个缩小的输出特征图。
池化操作(Pooling Operation)是一种用于简化特征图的操作,通过将特征图的某一区域聚合为一个值,来减少特征图的尺寸。池化操作在输入特征图上滑动一个窗口(通常称为池化窗口),并在每个位置上对窗口内的像素值应用某种聚合函数,如最大值或平均值。
池化的主要目标是通过减少特征图的空间维度来控制计算量,同时保持重要的空间特征不变,从而提高模型的效率和鲁棒性。
常用的池化有最大池化(Max Pooling)与平均池化(Average Pooling)。
最大池化是在池化窗口中选择最大值作为输出。这种操作保留了窗口区域中最显著的特征,通常用于提取图像中的边缘、角点等高频特征。如,池化窗口大小为 ,输入的窗口区域为 ,则最大池化的输出为(即窗口内的最大值)。平均池化是对池化窗口中的所有像素值取平均值作为输出。这种操作平滑了特征图,通常用于保留整体特征的平均信息。对于上面的输入 ,平均池化的输出为。
池化层通过降采样(down sampling)操作减少了特征图的空间维度,从而减少了后续层的计算量。由于卷积层生成的特征图通常非常大,因此在进行多次卷积后通过池化层减小特征图的尺寸非常重要。例如,一个 的输入图像经过 的最大池化后,特征图的尺寸将缩小到 ,降低了卷积神经网络的计算复杂度,同时减少参数数量(通过降低特征图的维度)也可以防止模型在训练数据上过拟合,提升模型的泛化能力。
池化操作也有一些参数选择,如窗口大小与步幅。池化窗口的大小决定了在特征图上每次操作所考虑的区域范围。常见的池化窗口大小为 ,即在 的区域内进行聚合操作。较大的池化窗口可以进一步减小特征图的尺寸,但也可能导致信息丢失。因此,选择合适的窗口大小是非常重要的。步幅决定了池化窗口在特征图上移动的距离。步幅越大,特征图的输出尺寸越小,池化效果越明显。常见的步幅值为2,表示池化窗口每次移动两个像素。当步幅等于窗口大小时,池化操作不会有重叠区域,输出尺寸大幅减小;当步幅小于窗口大小时,池化窗口之间会有重叠,这种情况通常用于保留更多的局部信息。
全连接层(Fully Connected Layer)
在卷积神经网络(CNN)中的最后几层,通常使用全连接层将提取到的特征映射到输出空间,完成最终的分类或回归任务。全连接层的每个神经元都与上一层的所有神经元相连,因此称为“全连接”。
在卷积神经网络的前几层(卷积层和池化层)中,模型通过一系列的卷积和池化操作逐步提取输入数据的高阶特征。到达全连接层时,这些高阶特征通常被展平(Flattening)为一维向量,然后输入到全连接层中。假设经过卷积和池化后得到的特征图尺寸为,在展平操作后,这些特征将被转化为长度为 的向量。全连接层的最后一层通常是输出层,输出层的神经元数目取决于具体的任务需求。例如,在一个10分类任务中(如MNIST手写数字识别),输出层的神经元数为10,每个神经元对应一个类别的概率。而分类任务中,全连接层将提取到的特征映射到类别空间,通过Softmax函数生成概率分布;在回归任务中,全连接层生成预测的连续值。
有了以上这些基础知识之后,大家在阅读文献时看到CNN架构中的各种参数应该就不会陌生了,下面是一个CNN的例子,大家可以检测一下输出尺寸的计算跟你的一样吗?
常见的CNN架构
在过去的十几年中,随着计算能力的提升和深度学习的广泛应用,许多经典的卷积神经网络架构被提出,这些架构在各种视觉任务中取得了优异的表现。以下是对一些经典的CNN架构进行简单的介绍,感兴趣的同学推荐可以直接阅读原始论文。
AlexNet
AlexNet 是卷积神经网络(CNN)发展史上的一个重要里程碑,它在2012年的ImageNet大规模视觉识别挑战赛(ImageNet Large Scale Visual Recognition Challenge, ILSVRC)中取得了巨大的成功,标志着深度学习在计算机视觉领域的突破。AlexNet展示了通过学习得到的特征可以超越手工设计的特征,彻底改变了计算机视觉领域的传统范式。
虽然AlexNet和LeNet的架构在形式上非常相似,但两者之间也存在显著的差异。AlexNet远比LeNet-5要深得多,包含5个卷积层、2个全连接的隐藏层,以及1个全连接的输出层。此外,AlexNet首次采用了ReLU激活函数而非LeNet使用的Sigmoid函数,大大加速了训练速度。为了防止过拟合,AlexNet在全连接层中使用了Dropout层。通过数据增强技术(如翻转、裁剪)和L2正则化进一步防止过拟合。
AlexNET在深度和宽度上的扩展使得训练速度更慢,图像分辨率更高,卷积计算更复杂,因此,AlexNet采用了更小的学习率。AlexNet的成功证明了深度卷积神经网络在大规模图像分类任务中的潜力,开启了深度学习的新时代。
VGG
在深度学习的早期,AlexNet 的成功展示了深度卷积神经网络(CNN)在计算机视觉任务中的强大能力。然而,AlexNet并没有提供一个通用的模板来指导后续研究者设计新的网络架构。随着研究的进展,神经网络的设计逐渐从以单个神经元为单位到以整层为单位,再到现在的以模块为单位的设计模式。深度学习的架构设计也变得越来越抽象和模块化。VGG 是由牛津大学的Visual Geometry Group提出的,它通过使用非常小的卷积核()以及增加网络深度来提升性能。VGG架构主要包括VGG16和VGG19,分别指包含16层和19层可训练参数的网络。VGG网络的关键创新是引入了“块”的概念,将多个卷积层和池化层组合成一个模块。VGG网络的这一设计思想在后续深度学习模型中得到了广泛应用。
VGG网络的基本构建模块是一个序列化的结构,包含:卷积层、激活函数、池化层。在传统的CNN设计中,随着层数的增加,特征图的分辨率会迅速下降。特别是在大规模数据集(如ImageNet)中,使用过多的卷积层会导致空间维度(如图像的高度和宽度)迅速耗尽,从而限制网络的深度。VGG的核心思想是,在每次池化操作进行降采样之前,先通过多个连续的卷积层进行特征提取。这种方式不仅保持了特征图的空间分辨率,还能够通过更深的网络捕捉到更加细致的特征。例如,连续应用两个 的卷积核,理论上可以覆盖与一个 卷积核相同的感受野,但使用的参数却要少得多。因此,VGG网络通过更深的层次结构来提升网络性能,而不是单纯依赖更宽的网络。
VGG网络的成功展示了深层和窄层网络的优越性,并为后续的深度学习架构设计提供了重要的启示。同时也表明小卷积核可以在保持高效计算的同时提升模型性能。VGG架构尽管参数量较大,但由于其优异的性能,至今仍被广泛使用。
GoogleNet
GoogLeNet,也称为Inception网络,是由Google的研究团队提出的,是2014年的ImageNet竞赛的获胜者,它结合了前人工作的结果,如VGG的重复块结构,以及多种卷积核的组合,不仅在准确率上超越了此前的模型,还引入了一种新的网络架构设计模式,即明确区分CNN中的stem(数据输入部分)、body(数据处理部分)和head(预测部分)。这一设计理念至今在深度网络中广泛应用。
GoogLeNet由一系列Inception块组成,整个网络可分为三部分:Stem:初始的几层卷积层,用于从图像中提取低级特征。类似于AlexNet和LeNet的初始部分。Body:由多个Inception块组成的主体部分,负责从特征中提取更高级的语义信息。Head:使用全局平均池化层来整合特征图,然后通过全连接层输出分类结果。
GoogLeNet通过Inception模块引入了多尺度特征提取的概念,将卷积神经网络的发展推向了一个新高度,大大提高了参数效率,它通过多分支卷积和高效的计算设计,成功实现了更深、更广的网络结构,并在保持计算效率的同时提升了模型性能。这一设计理念在之后的深度学习模型中得到了广泛应用,影响深远。
ResNet
随着CNN的进一步发展,研究者早已意识到增加网络层数可以提升模型的复杂性和表达能力。然而网络深度增加有时会带来“退化问题”(随着网络深度增加,网络性能反而下降)。为了应对上述挑战,He等人在2016年提出了残差网络(ResNet)。其核心思想是通过残差块(Residual Block)来保证每新增一层都能严格提升网络的表达能力。
ResNet引入了残差学习的概念,通过引入“捷径连接”(Skip Connection),将输入直接传递到后面的层,同时学习一个残差映射。具体来说,假设输入为 ,我们希望通过学习得到一个映射 。传统的网络需要直接学习这个映射,而在残差块中,我们学习的是残差映射 。因此,残差块实际上学习的是一个偏差校正项,而不是整个映射。当 时,残差映射 就变为0,这使得学习恒等映射变得更容易。这种设计确保了在添加新层时,网络至少与之前一样有效,且有可能获得更好的训练结果。
ResNet架构非常深,标准的ResNet有50、101甚至152层。残差模块的引入使得训练极深的网络成为可能。ResNet使用批次归一化(Batch Normalization)来加速训练,并稳定网络性能。ResNet开启了深度学习的“超深网络”时代,它证明了增加网络深度可以显著提高模型性能,而不会导致退化问题。残差块的思想也被广泛应用于其他类型的神经网络中,如循环神经网络(RNN)、变压器(Transformer)和图神经网络(GNN)。
DenseNet
DenseNet是ResNet思想的进一步扩展,它在2017年由Huang等人提出。DenseNet的核心特点在于其连接模式,即每一层都与之前的所有层相连,且通过级联操作(而不是ResNet中的加法操作)来保留和重用前一层的特征。对于第 层的输出 ,它是所有前 层输出的级联结果:
这种连接方式形成了一个非常密集的依赖图,因此得名DenseNet。DenseNet的最终层连接了所有之前层的输出,并通过一个全连接层(或MLP)将这些特征组合起来。
DenseNet的关键思想是将每一层的输出直接连接到所有后续层(不仅仅是下一层)。这种密集连接减少了冗余计算,同时促进了特征的复用。尽管每层的连接显著增加,但DenseNet通常具有比ResNet更少的参数,因为它不需要为每一层重复计算特征。DenseNet通过密集连接的设计,使得特征在整个网络中得到了更好的传递和重用。这种级联操作提高了计算效率,但也带来了更高的GPU内存消耗。与ResNet相比,DenseNet在跨层连接上采用了级联而不是加法操作,这种设计虽然有效地重用了特征,但在实际应用中可能需要更多的内存优化技术来提高训练效率。
这些经典的CNN架构在深度学习的发展历程中起到了关键作用。它们各自引入了不同的设计理念,如小卷积核、Inception模块、残差连接、密集连接等,推动了CNN在各类视觉任务中的应用和发展。
最后更新于