导读
此前,我们介绍了MCP模型和感知机,从今天开始,我们就来介绍下卷积神经网络(Convolutional Neural Networks, CNN),它可以说是深度学习最具代表性的模型之一。
01
CNN的来源
1.1 Hubel和Wiesel的视觉皮层研究
早在20世纪50年代末,David Hubel和Torsten Wiesel通过在猫的大脑皮层植入电极,记录了神经元对视觉刺激的反应。他们的工作揭示了视觉皮层中神经元的**感受野(receptive fields)**是如何组织和响应特定视觉刺激的。
Hubel和Wiesel发现,视觉皮层中的神经元对特定的视觉模式(如边缘、方向和空间位置)有选择性反应。这些神经元的感受野呈层级结构,简单细胞(simple cells)对边缘的反应,而复杂细胞(complex cells)则对这些边缘的特定组合有反应。他们的研究结果表明,视觉信息在大脑中是分层次处理的,这一发现为后续的人工神经网络设计提供了重要的生物模型。
1.2 福岛邦彦的Neocognitron模型
受到Hubel和Wiesel工作的启发,福岛邦彦在1980年提出了Neocognitron模型,这是一个早期的深度学习模型,也是卷积神经网络的直接前身。Neocognitron模型模仿了生物视觉系统的信息处理机制,特别是Hubel和Wiesel描述的层次结构和感受野的概念。
Neocognitron模型
Neocognitron模型由多个处理层组成,每一层都包含了一系列感受野,这些感受野能够检测图像中的特定特征。模型中的每个处理单元(或“细胞”)都与前一层的多个单元相连,形成了一个卷积层。这种结构允许模型在不同的尺度和位置检测相同的特征,从而实现平移不变性。
福岛邦彦的工作不仅在理论上具有开创性,而且在实践中也取得了成功。Neocognitron模型能够识别手写数字和其他视觉模式,这在当时是一项重大的技术突破。尽管Neocognitron模型并没有使用反向传播算法进行训练,但它为后来的卷积神经网络设计提供了重要的架构参考,特别是在处理图像数据时的层级结构和局部感受野的概念。
02
卷积神经网络的工作过程
卷积神经网络(Convolutional Neural Networks, CNN)是一种深度学习模型,广泛应用于图像和视频识别、自然语言处理等领域。CNN通过模仿生物视觉皮层的结构和功能来处理数据,具有强大的特征提取和分类能力。
CNN由输入层、卷积层、激活函数、池化层、归一化层、全连接层、输出层、损失函数、优化器*等关键部分组成。
下面,将详细介绍下CNN各个部件的作用。
2.1输入层
这是网络的第一层,接收原始数据,在图像识别任务中,输入层通常接收的是图像数据。
输入层通常接收三维数据,对于图像来说,这通常是高度、宽度和颜色通道(如RGB三通道)。
图像通常由三个颜色通道(红、绿、蓝)组成,形成一个二维矩阵,数值表示像素的强度值。
在某些情况下,输入数据可能是二维的,例如灰度图像,或者四维的,例如视频帧或具有时间维度的多张图像。
**输入层不涉及任何计算操作,它仅仅是数据的入口点。**输入数据的尺寸(例如,宽度、高度和通道数)需要与网络模型的期望输入尺寸相匹配。在实际应用中,输入数据通常需要经过预处理步骤,如归一化、中心化等,以提高模型的训练效率和性能。
在输入层,每个像素点的值都被视作一个特征,这些特征将被传递到后续的卷积层进行特征提取。预处理后的数据不仅提高了数据的质量和可用性,还为网络的深层结构提供了更好的初始信息,使其能够更有效地进行特征学习。
输****入层的设计对于整个CNN的性能至关重要,因为输入数据的质量直接影响到模型的训练效果和最终的识别准确率。通过对输入数据进行精心的预处理,可以确保网络在训练过程中能够专注于学习图像中的关键特征,而不是被无用或冗余的信息所干扰。
2.2 卷积层
最开始,看到“卷积”就想到了数学当中的卷积运算,它涉及两个函数:一个输入函数(信号)和一个卷积核(或滤波器)。卷积运算的结果是一个新的函数,该函数表达了一个函数的形状如何被另一个函数修改。
额…,看完是不是很懵?那我们看看卷积究竟是干什么用的。一句话概括就是“它在网络中用于提取输入数据的特征。”
毕竟,原始的图像特征太大了,而且有很多无用的信息,需要进一步的提取到关键的信息。
卷积层通过滤波器(或称为卷积核)扫描图像,对每个局部区域的像素进行加权求和,生成特征图(feature map)。这一过程可以捕捉到图像的局部特征,如边缘、纹理等。
2.2.1.卷积的基本概念
-
卷积核(Convolutional Kernel):卷积核是一个小的矩阵,它在输入数据(通常是图像)上滑动,以提取局部特征(如上图上面的绿色小正方形)。每个卷积核可以捕捉到不同的特征,如边缘、纹理或更复杂的模式。
-
**卷积操作(Convolution Operation):**卷积操作涉及将卷积核与输入数据的局部区域进行元素乘积和求和,这个过程称为“点积”。卷积核在输入数据上滑动,计算每个位置的点积,生成一个新的二维数组,称为特征图(Feature Map)。
-
滑动窗口(Sliding Window):卷积核在输入数据上滑动的过程可以看作是一个滑动窗口。窗口在输入数据的每个位置停留,计算卷积核与该位置的局部区域的点积。
-
步长(Stride):步长定义了卷积核在输入数据上滑动时的步长。较小的步长意味着卷积核移动的距离较小,这将导致输出特征图的分辨率更高。
-
填充(Padding):为了控制输出特征图的大小,可以在输入数据的边缘添加额外的像素,这个过程称为填充。常见的填充方式包括零填充(Zero Padding),即在边缘添加零值像素。
-
特征图(Feature Map):卷积操作的输出是一个二维数组,称为特征图。每个特征图代表了输入数据中特定特征的分布情况。
-
多通道(Multi-channel):在处理彩色图像时,输入数据通常有多个通道(如RGB三个通道)。卷积核也可以设计为多通道,以便在每个通道上独立地提取特征。
-
卷积层的输出尺寸(Output Size):
卷积层的输出尺寸可以通过以下公式计算:输出尺寸=⌊输入尺寸+2×填充−卷积核尺寸步长⌋+1
其中,输入尺寸是输入数据的尺寸,填充是添加到输入数据边缘的像素数,卷积核尺寸是卷积核的大小,步长是卷积核滑动的步长。
来看下面这个例子:
一个66的特征图,无填充,经过一个步长为1,卷积核为3的卷积,得到一个44的特征图。
输出尺寸=⌊6+2×0−3⌋\1+1=4
2.2.2感受野
在卷积神经网络中,感受野(Receptive Field)是一个重要的概念,它描述了网络中某个神经元对输入图像的哪些部分是敏感的。换句话说,感受野定义了网络中一个神经元在进行计算时,实际上“看到”了输入数据的多少区域。如下图标红的部分就是感受野:
感受野
以下是感受野的一些基本概念:
1. 局部感受野:
在单个卷积层中,每个神经元只对输入图像的一个局部区域进行响应,这个局部区域就是局部感受野。例如,一个3x3的卷积核在图像上滑动时,每次只覆盖3x3的区域,如上图所示。
2. 跨层感受野:
随着网络层数的增加,每个神经元的感受野也会随之增大。这是因为每一层的卷积操作实际上是在前一层的感受野基础上进行的。因此,一个位于较深层的神经元可以“看到”输入图像的更大区域。
感受野的大小可以通过卷积层的参数(如卷积核大小、步长和填充)来计算。
对于一个多层的CNN,感受野的大小可以通过以下公式计算:感受野大小=(1+(L−1)×步长)×卷积核大小−2×(填充×(L−1))其中,L是从输入层到当前层的层数
3. 感受野的作用:
**- 特征提取:**感受野允许网络在不同层级上提取不同尺度的特征。在较浅的层,网络可能提取边缘和纹理等低级特征;在较深的层,网络可能提取更复杂的模式,如物体的部分或整体。
**- 不变性:**通过设计,CNN可以对输入图像的平移、缩放等变化保持不变性。这意味着即使输入图像中的物体位置或大小发生变化,网络仍然能够识别出这些物体。
2.2.3 参数共享
参数共享指的是在模型的不同部分使用相同的参数。在CNN中,这意味着同一个卷积核(或滤波器)的参数在输入数据的不同位置上是共享的。这种共享减少了模型的复杂度,因为无论卷积核在图像的哪个位置进行操作,都使用同一组参数。
参数共享基于特征的局部性假设,即相邻的特征之间具有相似的统计特性。因此,可以使用相同的参数来处理它们。这种方法使得模型能够更好地捕捉数据中的局部模式,提高模型的表达能力和泛化能力
参数共享的优势:
- **减少参数数量:**通过共享参数,模型可以学习到一组特征,并在整个输入图像上应用这组特征,有效提取图像的局部特征,同时显著减少了网络的参数数量。
- **提高训练速度:**由于参数数量的减少,模型的训练速度得到提升,因为需要更新的权重更少,从而减少了计算量。
- **减少过拟合风险:**参数共享可以减少过拟合的风险,因为模型的参数数量大大减少,使得模型更加简洁。
- **提高模型效率:**共享参数减少了网络的参数数量,提高了计算的效率,节省了存储空间和计算资源。
2.3激活函数
激活函数在CNN中扮演着至关重要的角色,它们的主要作用是引入非线性因素,使得网络能够学习和模拟复杂的函数映射关系。在深度学习中,如果没有激活函数,无论神经网络有多少层,最终都相当于一个线性变换,这将极大地限制网络的表达能力和复杂性。
**激活函数的引入,使得神经网络可以执行非线性分类,解决线性不可分问题。**例如,在图像识别中,对象的识别往往涉及到复杂的特征提取,这些特征并不是简单的线性关系,而是需要通过非线性变换来更好地表示。
2.3.1 常用激活函数
在CNN中,有几种常用的激活函数,它们各自具有不同的特点和应用场景。
-
ReLU (Rectified Linear Unit): ReLU是当前最流行的激活函数之一,其公式为f(x)=max(0,x)。
ReLU函数在正区间的导数恒为1,这使得在梯度下降过程中,正权重的神经元不会被抑制,从而加快了学习速度。此外,ReLU在计算上非常高效,因为它仅涉及一个阈值操作。然而,ReLU也存在“死亡ReLU”问题,即当输入为负时,梯度为0,导致部分神经元不再更新。
-
Sigmoid: Sigmoid函数的公式为f(x)=11+e−x,它的输出范围在(0, 1)之间,这使得它在处理二分类问题时非常有用,如输出层的激活函数。
然而,Sigmoid函数在输入值较大或较小的时候,梯度接近0,这会导致梯度消失问题,从而影响网络的学习能力。
-
Tanh (Hyperbolic Tangent): Tanh函数是Sigmoid函数的变形,其公式为f(x)=tanh(x)=ex−e−xex+e−x,输出范围在(-1, 1)之间。
与Sigmoid类似,Tanh函数也存在梯度消失的问题,但由于其输出以0为中心,因此在某些情况下可能比Sigmoid函数表现得更好。
-
Leaky ReLU函数:Leaky ReLU函数是ReLU函数的改进,其公式为Leaky ReLU(x)=max(0.01x,x)。
Leaky ReLU函数允许负输入有一个非零的梯度,这有助于解决“死亡ReLU”问题。
-
**ELU函数:**ELU(Exponential Linear Unit)函数是另一种改进的ReLU函数,其公式为ELU(x)={xif x>0α(ex−1)if x≤0。
ELU函数在负输入时有一个非零的输出,这有助于减少神经元的输出均值为零,从而加速训练过程。
-
**Softmax函数:**Softmax函数常用于多分类问题的输出层,其公式为Softmax(xi)=exi∑jexj。Softmax函数可以将一个向量转换为概率分布,使得所有输出值的和为1,从而可以用于表示多个类别的概率。
总的来说,激活函数的选择取决于具体的应用场景和网络结构。**ReLU函数因其简单和高效而在现代深度学习网络中占据主导地位,但在某些特定的任务中,Sigmoid或Tanh函数可能更为合适。**在实际应用中,可能需要通过实验来确定最适合特定任务的激活函数。
2.4. 池化层
池化层(Pooling Layer)在CNN中起着至关重要的作用,主要目的是降低特征维度,提高特征的不变性(如平移不变性、尺度不变性等),并减少后续计算的复杂度。
2.4.1 降低特征维度
在卷积层提取特征后,特征图(Feature Map)的尺寸往往很大,这会导致大量的参数和计算。池化层通过降低特征图的空间尺寸(即宽度和高度),从而减少参数数量和计算量,这有助于防止过拟合,提高网络的泛化能力。
2.4.2 最大池化与平均池化
最大池化(Max Pooling)和平均池化(Average Pooling)是两种最常用的池化策略。
- 最大池化:最大池化通过在特征图的局部区域选择最大值来工作。这种方法能够捕捉到最具代表性的特征,如图像中的边缘和纹理等。最大池化能够突出最显著的特征,因为它保留了每个区域中最突出的部分,这在处理图像时特别有用,因为图像中的重要信息往往集中在某些关键点上。
- 平均池化:平均池化则是计算特征图局部区域的平均值。这种方法能够提供更平滑的特征表示,因为它考虑了区域内所有值的平均效果。平均池化有助于减少噪声,并保持特征的全局信息。
在实际应用中,最大池化和平均池化可以根据具体任务的需求进行选择。例如,在图像分类任务中,最大池化由于其突出显著特征的能力,通常更受欢迎。而在某些需要保留更多背景信息的任务中,平均池化可能更为合适。
池化层的设计和选择对CNN的性能有重要影响。通过合理地设计池化层,可以有效地减少计算量,提高模型的泛化能力,并在各种视觉任务中取得更好的效果。
2.5. 归一化层
**归一化层在卷积神经网络(CNN)中起到调整和规范化网络中间层输出的作用,以提高训练的稳定性和效率。**归一化处理有助于减少内部协变量偏移,加速收敛,提高模型的泛化能力,并在一定程度上起到防止过拟合的作用。
2.5.1 局部响应归一化
局部响应归一化(Local Response Normalization,LRN)是CNN中早期使用的一种归一化技术,它在AlexNet中被首次引入。LRN的目的是模拟生物神经系统中的侧抑制现象,通过归一化局部区域内的神经元活动,增强了模型的泛化能力。
LRN通过在相邻卷积核生成的feature map之间引入竞争,使得某些特征在某些feature map中更显著,而在相邻的其他feature map中被抑制,从而减小了不同卷积核产生的feature map之间的相关性。这种竞争机制使得响应较大的值变得更大,而抑制其他反馈较小的神经元。
然而,LRN在后续的网络架构中使用较少,主要原因是它相对于其他归一化技术(如批量归一化)计算更复杂,且效果并不总是优于其他方法。
2.5.2 批量归一化
批量归一化(Batch Normalization,BN)是当前深度学习中广泛使用的归一化技术。它通过规范化小批量数据的均值和方差,使得网络中间层的输出更加稳定,从而加速训练过程并提高模型性能。
BN的计算公式为:
批量归一化的优点包括:
- 加速网络训练,允许使用较大的学习率。
- 提高模型的泛化能力,减少过拟合。
- 使得网络可以更深,因为每层的输入分布更加稳定。
- 减少了对初始化权重的依赖。
在训练阶段,BN使用当前小批量的统计量进行归一化,而在测试阶段,使用训练过程中累积的全局均值和方差进行归一化,以确保模型的确定性输出。
总的来说,批量归一化通过规范化每层的输出,使得网络训练更加稳定和高效,是目前深度学习中不可或缺的技术之一。
2.6. 全连接层
**全连接层,又称为密集层(Dense Layer),在CNN中位于网络的末尾,起着至关重要的作用。**它的作用是将卷积层和池化层提取的特征进行整合,形成最终的输出结果。这些输出可以是类别概率(例如在图像分类任务中)或其他类型的预测值。
2.6.1特征组合
在全连接层中,每个神经元都与前一层的所有神经元相连,这意味着网络中的每个特征都会被充分考虑并组合起来。这种连接方式允许网络在这一层次上学习特征之间的复杂交互和组合。
- 参数学习:全连接层包含了大量的参数,每个连接都有一个权重,这些权重在训练过程中通过反向传播算法进行学习和更新。通过这种方式,网络能够学习如何将低层特征组合成更高层次的表示。
- 特征整合:全连接层将前面层次提取的特征图(通常是二维的)展平成一维向量,这使得网络能够在一个统一的空间中对所有特征进行处理和整合。
- 分类决策:在分类任务中,全连接层的输出通常通过一个softmax函数,将特征表示转化为类别概率分布,从而实现最终的分类决策。
2.6.2 分类任务
在图像分类任务中,全连接层的作用是将提取的特征转化为类别标签的概率分布。这一层通常包含大量神经元,每个神经元对应一个类别,其输出值表示输入数据属于该类别的概率。
- 多分类问题:对于多分类问题,全连接层的输出维度等于类别数量,使用softmax激活函数将输出转化为概率分布,每个类别对应一个输出节点。
- 二分类问题:对于二分类问题,全连接层可能只包含一个神经元,使用sigmoid激活函数将输出转化为概率值,表示输入数据属于某一类别的概率。
- 损失函数:在分类任务中,全连接层的输出会与真实的标签一起输入到损失函数中。常见的损失函数包括交叉熵损失(Cross-Entropy Loss),它衡量模型预测的概率分布与真实标签之间的差异。
- 优化器:优化器如梯度下降(Gradient Descent)或其变体(如Adam或RMSprop)用于根据损失函数的梯度更新网络权重。这些优化算法指导网络如何调整参数以最小化损失函数,从而提高模型的分类准确性。
在实际应用中,全连接层的设计和配置需要根据具体任务的需求进行调整。例如,可以通过增加或减少神经元的数量来控制模型的复杂度和容量。此外,为了避免过拟合,可以在全连接层之后添加Dropout层,随机地丢弃一部分神经元,以提高模型的泛化能力。
2.7. 输出层与损失函数
2.7.1 输出层作用
输出层是卷积神经网络(CNN)中负责生成最终预测结果的部分。在不同的任务中,输出层的结构和激活函数的选择也会有所不同。
**对于分类任务,输出层通常由几个神经元组成,每个神经元对应一个类别,其数量取决于类别的总数。**在多分类问题中,输出层的激活函数一般选择Softmax函数,它可以将输出转换为概率分布,使得每个类别的输出值之和为1。这样,输出值最高的类别就被认为是网络的预测结果。
**对于回归任务,如预测房价或连续数值,输出层通常只包含一个神经元,并且使用线性激活函数。**这是因为回归任务的目标是预测一个连续的数值,而不是进行分类。
输出层的设计必须与任务需求紧密相关,确保网络的预测结果能够准确反映所需解决的问题。
2.7.2 损失函数的选择
损失函数是衡量模型预测与实际标签之间差异的关键指标,它指导着模型训练过程中参数的优化方向。选择合适的损失函数对于模型的性能至关重要。
**对于分类任务,交叉熵损失函数(Cross-Entropy Loss)是最常用的选择。**它测量的是模型输出的概率分布与真实标签的概率分布之间的差异。
对于二分类问题,可以使用二元交叉熵损失(Binary Cross-Entropy Loss),而对于多分类问题,则使用多类交叉熵损失(Categorical Cross-Entropy Loss)。
对于回归任务,常用的损失函数包括均方误差(Mean Squared Error, MSE)和平均绝对误差(Mean Absolute Error, MAE)。
MSE计算预测值与真实值之间差的平方的平均值,对异常值更为敏感。MAE则计算预测值与真实值之间差的绝对值的平均值,对异常值的鲁棒性更好。
除了这些传统的损失函数,还有一些其他的损失函数可以根据特定任务的需求进行选择。例如,Huber损失函数结合了MSE和MAE的特点,对于小的误差采用平方项,对于大的误差采用绝对值项,这使得它在存在离群点时比MSE更加鲁棒。
在实际应用中,损失函数的选择往往需要结合任务的特点和数据的特性进行调整。有时候,为了解决特定问题,可能需要设计自定义的损失函数。此外,损失函数的权重和形式也可以根据任务的复杂度和模型的表现进行微调,以达到最佳的训练效果。
2.8. 优化器
优化器在深度学习中扮演着至关重要的角色,尤其是在训练卷积神经网络(CNN)时。其核心功能是调整网络的权重,以最小化损失函数,从而提高模型的预测性能。
在CNN的训练过程中,优化器通过迭代更新网络的参数来逐步减少预测误差。这个过程涉及到计算损失函数关于网络参数的梯度,然后根据这些梯度来调整参数。优化器的不同之处在于它们更新参数的具体策略。
2.8.1 梯度下降法
梯度下降法是深度学习中用于优化模型参数的核心算法。其基本原理是计算损失函数关于模型参数的梯度,然后更新参数以减少损失函数的值。
在CNN中,梯度下降法通过迭代过程逐步优化网络权重。每次迭代中,网络对整个数据集或一个mini-batch进行一次前向传播,计算损失函数的值;接着进行反向传播,计算损失函数相对于每个参数的梯度;最后,根据梯度和预设的学习率更新参数。
梯度下降法的关键在于学习率的选择。学习率太大可能导致训练过程不稳定,甚至发散;学习率太小则会导致训练过程缓慢,甚至陷入局部最优解。为了解决这个问题,实践中常常采用学习率衰减策略,即随着训练的进行逐渐减小学习率。
此外,梯度下降法存在一些变体,如带动量的SGD(SGDM)、Nesterov加速梯度(NAG)等,这些方法通过引入动量或提前计算下一位置的梯度来加速训练过程,并减少震荡。
2.8.2 优化器种类
在深度学习中,优化器的选择对模型的训练效果和收敛速度有重要影响。以下是一些常用的优化器:
- SGD(随机梯度下降):最基本的优化器,每次更新参数时只使用一个样本或一个小批量样本的梯度信息。SGD简单、易于实现,但训练过程可能不稳定,且容易陷入局部最优解。
- SGDM(带动量的SGD):在SGD的基础上引入动量项,即考虑之前梯度的方向和大小,以平滑梯度的波动并加速训练过程。动量项可以帮助SGDM跳出局部最优解,提高训练的稳定性。
- NAG(Nesterov加速梯度):在SGDM的基础上进一步优化,通过提前计算下一位置的梯度来调整当前的更新方向,从而实现更快的收敛。
- Adagrad:自适应梯度算法,通过累积所有梯度的平方和来调整每个参数的学习率。Adagrad对稀疏数据表现良好,但可能会导致学习率过快减小。
- RMSprop:通过使用梯度的指数加权移动平均来替代Adagrad中的累积和,解决了Adagrad学习率过快减小的问题。RMSprop在很多情况下表现良好,尤其是在处理非平稳目标时。
- Adam:结合了Adagrad和RMSprop的优点,并引入了动量项。Adam在训练深度神经网络时表现出色,是目前最流行的优化器之一。
- AdamW:是Adam的变体,对权重衰减更加鲁棒。在某些任务中,AdamW可能比标准的Adam表现更好。
每种优化器都有其特点和适用场景。在实际应用中,可能需要根据具体任务和数据集的特性来选择或调整优化器。此外,一些高级优化器,如LARS、FTRL等,也在特定场景下有出色的表现。选择优化器时,可以考虑模型的规模、训练数据的大小和特性,以及训练过程中对稳定性和收敛速度的要求。
文章来源:微信公众号-智驻未来,原始发表时间:2024年10月21日。