首页 理论教育常用基本单元:CNN的优化方案

常用基本单元:CNN的优化方案

【摘要】:CNN模型具有自动的特征学习能力,能够从输入图像中逐层提取从简单到复杂、从底层到高层、从具体到抽象的特征,并实现图像分类。CNN模型中常用的功能单元如下。但是,当利用其他研究人员发布的预训练CNN模型时,需要考虑相关人员在预训练模型时对输入数据的具体操作。图6-2图像卷积操作和传统的神经网络不同,CNN中的卷积层具有两个核心特点:①局部连接。

CNN模型具有自动的特征学习能力,能够从输入图像中逐层提取从简单到复杂、从底层到高层、从具体到抽象的特征,并实现图像分类。同时,CNN是一种有监督的特征学习方法,能够根据不同的数据库和任务自动调节模型中的参数,从而学习到与具体任务更加匹配的特征表达方式。上述功能是通过CNN模型中不同的功能单元和操作来实现的。CNN模型中常用的功能单元如下。

1.输入层(Input Layer)

输入层是CNN模型的第一层,用于接收输入的原始数据。在利用CNN进行图像识别时,一般情况下不需要对输入的原始图像进行预处理操作,可以直接将原始的图像数据送入CNN的输入层,作为整个CNN模型的输入数据。但是,当利用其他研究人员发布的预训练CNN模型时,需要考虑相关人员在预训练模型时对输入数据的具体操作。例如,若采取了零均值化等预处理操作,在使用预训练的CNN模型时也需要对输入的原始数据进行对应的预处理操作,然后才能送入输入层。

2.卷积层(Convolutional Layer)

在CNN模型中,卷积层是最核心的单元之一,每个卷积层内含有多个卷积核(Kernels),卷积核中的权值(Weights)体现了不同位置的输入数据具有不同的重要性,其主要功能是提取图像中的局部特征,即当输入图像经过卷积层时,卷积层内的卷积核在图像上按指定的方向和步长滑动,在不同的位置与相同尺寸的图像块进行卷积运算,从而提取出图像中对识别任务有用的信息。卷积层输出的特征图(Feature Map)与卷积核的尺寸、输入图像的尺寸、卷积时的滑动步长、填充尺寸等有关,通过合理设置上述参数值,可有效提取输入图像中具有鉴别性的局部细节特征。通常情况下,卷积层数越多,提取输入图像特征的能力就越强,所提取出的图像特征就越丰富。另外,需要特别注意的是,每一层卷积核的厚度(Depth)与该层输入数据的厚度(Channels)必须是相同的,如果CNN模型的输入图像是RGB三通道的彩色图像,则模型第一个卷积层的每个卷积核也是三通道的。图6-2展示了单通道情况下一次图像卷积操作的原理,其中输入图像是单通道的7×7矩阵,卷积核(卷积模板)也是单通道的3×3权值矩阵,卷积核与输入图像矩阵中对应位置的元素进行相乘然后相加,即可得到一次卷积输出的结果;当设置滑动步长为2时,卷积核每次在输入图像上滑动2个像素进行卷积,则输入一幅7×7像素的图像时,对应最终的卷积输出图像的像素是3×3。

图6-2 图像卷积操作(滑动步长为2)

和传统的神经网络不同,CNN中的卷积层具有两个核心特点:

①局部连接。传统的神经网络采用的是全连接,即卷积核中的每个权值与输入图像中的每个像素都进行连接,这使卷积核权值的个数激增,导致模型的参数规模非常大,而要对这些大规模的参数进行训练就需要更多的训练样本和训练时间,同时会导致生成模型的体积增大,不利于模型的存储和部署;相反,CNN中的卷积核只与输入图像的一个局部区域进行连接,不但能够有效提取图像中的局部特征,而且显著减小了参数规模,有利于模型的训练、存储和部署。

②权值共享。CNN中的卷积核具有权值共享的性质,即一个卷积层可以有多个不同的卷积核,每一个卷积核都对应一个滤波后输出的特征图,同一个特征图中的每一个像素都来自完全相同的卷积核。权值共享可以有效减少网络的参数个数、降低模型的复杂度、减轻过拟合问题。但是,权值共享后会导致一种卷积核只能提取一种特征的问题,因此为了增加CNN模型的表达能力,需要设计多个卷积核,通过采用不同尺寸(如3×3、5×5)的卷积核可以提取图像中不同尺度的特征,在网络中的表现就是增加了特征图的深度。

通常情况下,适当增加卷积层的层数能够增强CNN模型的特征提取能力,有利于提取到更加丰富和具有鉴别力的图像特征,但在实际应用中,无限深的CNN模型是不存在的,这是因为当卷积层的个数达到一定数量时,可能会出现梯度消失(Vanishing Gradient)或梯度爆炸(Exploding Gradient)的问题,导致CNN模型的学习能力降低,使模型的训练过程非常缓慢甚至停滞,无法获得良好的训练结果。

3.池化层(Pooling Layer)

池化层也称为下采样层,是模仿人类的视觉系统对图像进行降维和抽象的。在利用卷积层进行特征提取之后,可通过池化层进行信息过滤和特征选择。池化层的主要作用如下:①使用一个特征值代替原特征图中的一个区域,显著降低了特征图的维数,减少了模型训练的参数数量,有利于模型的训练;②在一定程度上引入尺度缩放的稳健性,使模型更关注是否存在某些特征而不是特征的具体位置;③减缓过拟合现象。池化操作主要有最大池化(Max Pooling)和平均池化(Average Pooling)两种方法。一般情况下,最大池化有助于保存图像的边缘等细节特征信息,能够获得更好的效果。最大池化就是选择一个区域的最大值作为该区域的输出代表值,如图6-3所示,通过最大池化操作,不但显著降低了特征的数据维度,而且能够保留主要的特征信息。在池化过程中,可通过调节池化模板的尺寸和池化步长来控制特征降维的程度,当池化模板的尺寸和池化步长越大时,特征降维越明显,但同时可能会损失更多的特征信息。

图6-3 尺寸为2×2,步长为2时最大池化的示例

4.激活层(Activation Layer)

激活层,也称为非线性变换层。卷积操作属于线性操作,在没有激活函数的情况下,CNN模型的每一层都只是做线性变换,即每一层的输出都是上一层输入的线性组合,无论CNN模型有多少层,经过叠加之后还是线性变换,这会限制CNN模型的非线性表达能力。因此,可引入非线性函数作为激励函数,从而增加整个网络的非线性表达能力。激活层通常位于卷积层之后,为卷积层输出的特征图加入非线性变换。

传统CNN常用的激活函数是Sigmoid函数,其表达式如式(6-1)所示,对应的图形如图6-4所示,它是一个S形曲线,可以模仿生物神经元的响应特性,即对不同强度的刺激信号,神经元会产生不同程度的兴奋信号。Sigmoid函数是一个有界可微的实函数,所有实数值都可以作为输入、输出被限定在(0,1)范围内,在每个点上的微分值都是非负的。当输出的激活值为0时,对应生物神经元的“抑制状态”,当输出的激活值为1时,则对应神经元的“兴奋状态”。由于Sigmoid函数在中间区域的信号增益大,两侧区域的信号增益小,应尽量将输入值控制在中间区域。但是,Sigmoid激活函数存在两个明显的问题:①计算量较大,因为它需要进行指数运算;②存在梯度消失问题,也就是当输入信号非常大或非常小时,Sigmoid函数趋于饱和,激活输出值基本不变,这时对应的梯度值非常小,甚至趋近于0,由于CNN模型在进行反向传播时,后一层的梯度是以乘性方式传递到前一层的,这使梯度在反向传播时会变得越来越小,从而导致在反向传播过程中模型的参数基本得不到更新,导致模型难以训练或收敛速度非常慢。所以,为了防止进入饱和区域,应对初始权值进行适当调整,并规范权值参数的更新过程。

图6-4 Sigmoid函数曲线

为了解决Sigmoid函数存在的问题,在2012年的ILSVRC竞赛中AlexNet提出了校正线性单元(Rectified Linear Unit, ReLU)作为激活函数,其表达式如式(6-2)所示,对应的图形如图6-5所示。由图可以看出,对于ReLU函数,当输入值大于或等于0时,输出值就等于输入值;当输入值小于0时,输出值直接设为0。ReLU函数的优点很明显:①计算速度快。因为ReLU函数不需要进行指数运算,只需把输入值和0进行比较即可,显著降低了计算量;②从ReLU的曲线形状可以看出,当x>0时,其导数始终为1,则在反向传播过程中不会出现梯度消失的情况,从而加快了CNN模型的收敛速度;当x<0时,输出值为0,增加了网络的稀疏性和泛化能力。ReLU激活函数的上述优点,使该函数成为CNN模型中常用的激活函数之一。

图6-5 ReLU函数曲线

但是,ReLU函数也存在不足之处,即当输入值x<0时,其输出值总是为0,这可能导致在训练过程中出现神经元死亡、权值无法更新的情况。为了弥补ReLU函数的不足之处,研究人员提出了Leaky ReLU函数,即当输入值x<0时,输出值保持一个很小的梯度,这样当神经元非激活时也能有一个非零的梯度更新参数,避免永远不能被激活,基于此Leaky ReLU激活函数在一定程度上解决了神经元死亡的问题。

5.全连接层(Fully-connected Layer)

全连接(Fully Connected, FC)层是根据前面多层(卷积层、池化层、激活层)提取的特征进一步抽象出高层语义特征,然后映射到标记的样本空间的。FC层通常出现在CNN模型隐含层的最后部分,其主要作用是对最后提取的特征进行降维,并将输出端的个数调整为样本集的类别个数。对于FC层,每个神经元的节点都与前一层的所有神经元节点进行连接,这种全连接的特点导致FC层的参数量非常大,通常占整个CNN模型参数量的大部分比例,这也容易造成CNN模型训练过程中的过拟合现象。另外,在FC层之前,通常需要把所有的特征图展平(Flatten)成一个一维向量,以便再与后面的FC层进行连接。

6.批量归一化层(Batch Normalization Layer)

在最初训练模型的时候,假设训练数据的特征分布和验证数据的特征分布是相同的,深度CNN模型通过学习训练样本的特征分布,从而实现对验证样本的识别。但是在训练过程中,模型的参数不断被更新,导致每一层的数据分布都不停地变化,即在经过了每一层的层内操作后,各层输出分布就与对应的输入信号分布不同,而且这个差异会随着网络深度的增加而增大。因此,随着CNN模型网络层数的不断加深,样本特征在一层层的网络传输中会发生变化,甚至波动很大,这称为内部协方差偏移(Internal Covariate Shift)。经过多层神经网络的处理,信号的数学分布发生了巨大变化,从而导致模型的泛化能力被限制,这也给深度CNN模型的训练和测试带来了困难,因此在训练过程中必须对训练样本和验证样本的特征分布进行校正。

要解决上述问题,可采用归一化的方法,常用的方法是批量归一化(Batch Normalization, BN)[127]。BN方法的总体思想是标准化所有层的输入数据,从而固定每层输入信息的均值和方差,以免数据的特征分布发生过大的变化,具体来说就是将每一层的输入数据归一化为均值为0、标准差为1。通过对每一层的输入数据进行归一化,使数据在经过多层神经网络处理之后的特征分布依然被强制固定,每一层激活值的均值和标准差都不会再发生改变,这就意味着梯度也不会再轻易地改变激活值的数学分布,从而消除了梯度下降对激活值数学分布的影响。可见,归一化操作确保了数据分布的稳定性,使梯度传递更为顺畅,并且可以使用较高的学习率来训练模型,从而加快了神经网络的收敛速度。同时,训练深度CNN模型时所用的样本数量通常是十分庞大的,很难一次性对所有的样本数据进行归一化,所以需要将全部的训练样本分成一个个小批量的数据,然后对每一个小批量的数据进行归一化,这样就可以把一个庞大的难以实现的计算任务变成小批量的容易实现的任务,从而降低对硬件设备的性能需求。另外,在层级很深的CNN模型中,除了存在梯度扩散问题,还存在退化问题,而BN方法也是解决梯度扩散问题的一种有效方法。

7.随机丢弃层(Dropout Layer)

Dropout方法[128]是训练CNN模型过程中减少过拟合,使模型更具有稳健性的一种方法,它能够提升模型的泛化能力。如图6-6所示,在训练一个CNN模型时,通过采用Dropout方法可以在每轮训练时以一定概率随机断开一部分神经元的连接,相当于使这些神经元的输出值设置为0,这些神经元既不参与前向传播,又不参与反向传播。因此,对每轮的样本输入和训练过程,都会随机生成一种新的网络结构,而保留下来的神经元按梯度下降算法更新权重和偏置。每轮训练结束后,会恢复上一轮被断开的神经元,并重新开始下一轮的训练,直到训练结束。在采用Dropout方法时,通常设置Dropout的概率值为p=0.5,即每轮训练都会随机丢弃一半的神经元连接,简化了网络结构,加速了训练过程。

图6-6 引入dropout前后的网络结构对比

采用Dropout方法能够减少模型过拟合的原因有以下两点:①Dropout方法随机断开某些神经元的连接会使每次训练的网络结构不同,相当于每次都随机选择不同的子网络进行训练,但是这些网络结构之间是共享权值的,从而达到了结构融合的效果。②采用Dropout 方法后,即使相邻的神经元在训练时也可能不同时出现,因此权值的更新不再依赖于神经元的相互作用,这阻止了一些特征仅在其他特定特征出现的情况下才有效,降低了不同神经元之间复杂的依赖和相互适应关系,有效地减少了网络训练的过拟合现象,提高了泛化能力,从而在训练的过程中可以学习到更具鲁棒性的特征。需要注意的是,Dropout方法只是在训练阶段使用,即在每次训练时随机选择并断开一部分神经元的连接,但是当模型训练结束进入测试阶段时,所有的神经元都会保留连接,即在测试阶段所有的神经元及其连接都会发挥相应的作用。

8.输出层(Output Layer)

在利用前面的各层网络充分提取输入样本的特征之后,在CNN模型的最后需要利用输出层对提取的样本特征进行判别,从而获得输入样本的类别标签。在CNN模型的具体实现中,输出层通常是一个特殊的FC层,它的主要作用如下:①把输出端的个数调整为待识别样本的类别个数。例如,对于手写数字的识别,因为只有0~9这10个数字,所以输出端的个数就设为10,而在ILSVRC竞赛中,由于样本集的类别个数为1 000,输出端的个数也相应地设为1 000。②计算当前输入样本对每个类别的分类得分或归属概率,通过对分类得分或归属概率的判断,将分类得分或归属概率最大的那个类别作为当前输入样本的类别,从而实现对输入样本的类别判定。为了方便对比和判断,输出层通常采用Softmax函数,它是一个线性的多类分类模型,实际上它是直接从Logistic回归模型转化而来的,区别在于Logistic回归模型为两类分类模型,而Softmax模型为多类分类模型。Softmax函数的另一个主要功能是将各个类别的“打分”转化为对应的概率值。打分越高代表输入样本属于这个类别的概率越高,但是打分本身不代表概率,因为打分值可以是负数,也可以很大,但概率值要求必须在0~1之间,并且输入样本对所有类别的概率归属加起来应该等于1。因此,可利用Softmax函数将当前样本对所有类别的分类得分值转换为归属概率值,即实现分类得分的归一化。其具体实现方法如下:①首先利用式(6-3)计算输入样本对各个类别的Logit值z。

其中,x表示输入的样本数据,W表示网络的权值参数,b表示网络的偏置参数,上标T表示矩阵转置操作,σ表示激活函数操作,则计算得到的Logit值z就表示输入样本对各个类别的“打分”值。②设一共有K个类别,当前输入样本对K个类别的分类得分值分别为zi ,i=1,2,,K ,则可利用式(6-4)进行计算。

将每个分类得分值转换为(0, 1)范围内的归属概率值。