首页 理论教育CNN模型的训练方法及流程解析

CNN模型的训练方法及流程解析

【摘要】:在训练CNN模型时,所采用的训练算法也称为优化器,它是影响CNN模型性能的一个重要因素。CNN模型的训练过程是该模型逐步拟合训练数据集的过程,即针对训练数据集,通过多次的迭代训练改变CNN模型中卷积核的权值和偏置参数值,使损失函数的值达到设定的目标值。在训练CNN模型时,几乎所有的训练方法都需要计算梯度,即利用梯度来更新CNN模型中的权值和偏置等参数。

CNN方法最大的优点之一是能够自动从输入数据中提取特征,自动调节模型中的参数。和传统方法中只有少量参数相比,CNN模型中的参数数量成千上万,尤其对于层数较多的深度CNN模型,其参数数量可能达到上亿。对于CNN模型中如此大规模的参数,要依靠传统的手工调节方法几乎是不可能完成的,这就需要设计一套有效的训练方法,让CNN模型在学习输入数据特征的过程中自动调节模型中的参数值,从而使模型的性能达到最佳。

在训练CNN模型时,所采用的训练算法也称为优化器(Optimizer),它是影响CNN模型性能的一个重要因素。CNN模型的训练过程是该模型逐步拟合训练数据集的过程,即针对训练数据集,通过多次的迭代训练改变CNN模型中卷积核的权值和偏置参数值,使损失函数的值达到设定的目标值。由于训练过程中可指定迭代次数或损失函数的阈值,当达到指定的迭代次数或损失函数的阈值时,可停止训练。

在训练CNN模型时,几乎所有的训练方法都需要计算梯度,即利用梯度来更新CNN模型中的权值和偏置等参数。常用的训练算法之一是随机梯度下降(Stochastic Gradient Descent, SGD)算法,其工作原理是对损失函数求偏导,然后利用训练误差反向传播的方法使模型的参数值朝着使损失函数最小化的方向更新变化。SGD算法在每次更新参数值时会随机选择一个训练样本来计算梯度更新值,因此这种方法单次训练的速度比较快,但是SGD算法每次仅用一个样本决定梯度方向,导致迭代方向变化很大,造成损失函数出现严重震荡的情况,同时由于SGD算法每次只迭代一个样本,不能很快收敛到局部最优解。为了解决这个问题,研究人员又提出了小批量(Mini-Batch)模式,即把训练集随机分成m个批次,每个批次包含少量训练样本,根据训练集的一个子集来估计梯度并执行权值更新,然后使用下一个子集来估计一个新的梯度并用于权值更新,直到使用了所有训练集来更新权值。虽然每一次迭代得到的损失函数不一定是朝着全局最优方向,但总体方向是朝着全局最优解的方向靠近,收敛后得到的结果通常会在全局最优解的附近,因此这种方法的收敛速度更快、更平稳。批量大小(Batch Size)通常选择为2的π次幂,一般取值范围是16~256,这样可以获得更快的运行速度。在利用SGD算法训练CNN模型时,需要设置合理的学习率:当学习率过小时,梯度下降的速度过慢,时间成本过高;而当学习率过大时,梯度下降法有可能直接跨过最小值点,导致模型无法收敛到最优点。因此,在后续的实际应用中研究人员又提出了多种改进的梯度下降算法,需要根据实际需求对学习率进行合理的选择和调整。

动量(Momentum)算法[129]是引用了物理学中动量的方法来解决梯度下降中的相关问题。梯度下降算法是令代价函数沿着梯度下降的方向不断减小,但存在梯度下降时沿着梯度减少的方向不断震荡的情况,虽然最终梯度下降算法可能会达到一个极小值点,但是由于其存在震荡现象,会消耗更多的时间。为了解决这个问题,引入了动量算法,该算法积累了之前梯度指数级衰减的移动平均,并且继续沿该方向移动。在SGD算法中,梯度下降的步长仅仅是梯度的范数乘以学习率,但是动量算法中梯度下降的步长取决于梯度的大小以及连续梯度的方向,也就是说,当许多连续的梯度指向相同的方向时,步长最大,即速度的更新是由本次的梯度下降方向与上一次的速度方向共同决定的。从宏观上理解,动量算法是希望能有一个量牵引着代价函数向梯度下降的方向移动,以减少震荡的幅度,从而加快学习和训练进程,尤其当运动方向与梯度下降方向相同时,牵引速度使代价函数的下降速度加快。所以,动量算法的主要优点是在梯度方向改变时降低超参数的更新速度,从而使震荡受到抑制,当梯度方向一致时,加速超参数的更新,使收敛速度增加。因此,当处理高曲率、小但一致的梯度,或是带噪声的梯度时,动量方法可以有效地加速学习。

AdaGrad算法是对训练过程中的学习率进行更好的控制。学习率是一个非常重要的超参数,它对模型的训练速度和收敛效果有重要的影响,太小的学习率会使模型的训练非常缓慢,时间消耗大,而太大的学习率则有可能使模型跨过要寻找的最优点,影响模型最终的收敛效果。AdaGrad算法是使学习率独立地应用于模型所有的参数,即拥有较大偏导数的参数对应一个较大的学习率,具有较小偏导数的参数对应一个较小的学习率,从而对学习率进行更好的分配和控制。虽然AdaGrad算法在理论上有着较优的性能,但是在实际应用中发现,当训练深度CNN模型时,从训练开始就积累平方梯度会导致有效学习率过早和过量地降低,影响了模型的学习速度。

RMSProp算法[130]是由Geoffrey Hinton提出的一种自适应学习率优化算法,它是对AdaGrad算法进行优化,将梯度积累改变成指数加权的移动平均,即结合梯度平方的指数移动平均数来调节学习率的变化。AdaGrad算法可以应用于凸问题时的快速收敛,它根据平方梯度的整个历史收缩学习率,使学习率在达到较优结果前变得太小。而RMSProp算法使用指数衰减平均以丢弃过去的历史值,从而避免了过大衰减的问题,使其能够找到较优值,并且快速收敛。RMSProp算法的主要优点是依赖于全局学习率,并解决了当权值更新步长变小时,学习率急剧下降的问题,能够在非平稳的(Non-Stationary)目标函数情况下进行很好的收敛。

Adam方法[131]是由Kingma和Lei Ba于2014年提出的一种学习率自适应优化算法。Adam算法与传统的随机梯度下降算法不同,传统的随机梯度下降算法利用单一的学习率更新所有的权值,学习率在训练过程中保持不变,而Adam算法利用梯度的一阶矩估计和二阶矩估计为不同的参数设计独立的自适应学习率,对训练参数的学习率进行动态调节,并将每一次的迭代学习率限定在一个大致的范围内(初始学习率),使参数变化更缓和,从而加快训练速度。Adam方法的优点是实现简单、计算效率高、存储需求小,参数的更新不受梯度的伸缩变换影响,并且非常适合数据和参数数量较大的情况,该方法也适用于目标函数不稳定和噪音复杂、梯度稀疏的情况。因此,从综合性能来看,Adam算法综合了AdaGrad算法和RMSProp算法的优点,在很多实际的工程应用中都有良好的性能表现,成为多种应用场景中优先选用的训练优化器。

CNN是一种前馈神经网络,其基本的训练策略是进行有监督的学习。CNN模型的训练过程主要分为两个阶段:

第一,前向传播阶段。在前向传播阶段,将带有类别标签的训练样本数据输入CNN模型,通过多层级联的卷积层、激活层、池化层等来逐层提取特征,最后将提取的特征送入FC层来获得输入样本对所有类别的预测得分或分类概率,并计算预测结果与期望目标之间的差异,将其作为本次训练的损失函数值。

第二,反向传播阶段。利用损失函数计算CNN模型需要调节的参数的梯度值,设置合理的学习率,然后通过反向传播算法逐层更新模型的参数值,直到损失函数达到设定的目标值,即获得训练的CNN模型。

训练CNN模型的具体流程如下:

(1)设置模型的超参数(如批尺寸、最大迭代次数、学习率等),并初始化所有卷积层的权值参数和偏置参数。

(2)输入训练样本,数据沿着CNN模型的各层结构向前传播,计算模型的输出值。

(3)计算CNN模型的实际输出值与期望目标值之间的损失函数。

(4)判断损失函数的当前值是否大于设定的目标阈值,如果大于设定的损失函数目标阈值,则进入反向传播阶段;否则,就结束训练。

(5)在反向传播阶段,计算CNN模型中神经元的参数误差,并根据参数误差计算梯度值,然后对CNN模型中的权值和偏置参数进行逐层更新。

(6)重复上述步骤(2)~(5),当损失函数的值等于或小于设定的目标阈值,或达到设定的训练次数时,结束训练,即可获得训练的CNN模型。

在上述的训练流程中,损失函数(Loss Function)也称为代价函数,用于描述CNN模型的实际输出值与期望目标值之间的接近程度,损失函数的值可以视为优化CNN模型的最终目标。常用的损失函数是基于Softmax函数的交叉熵损失函数,优化的目标是使损失函数的值最小化。

最后,需要注意的是,虽然保存的CNN模型参数通常是全部训练样本都参与训练完成后的参数,但这个参数不一定是最优的,因为当模型具有很强的学习能力时很有可能会过度学习训练样本集,使训练误差不断减小,但在验证集上的误差可能会增大。考虑到最初的目的是要获得使验证集误差最低的参数设置,因此可采用一种提前终止(Early Stopping)的策略,即当在验证集上的误差在预先设定的训练次数内没有进一步降低时,就可以提前终止训练过程,此时可获得最佳的训练模型。例如,当循环次数设定为6时,如果CNN模型在验证集上的损失值在6次循环中没有得到提升,算法就会提前终止模型的训练,上述设定的循环次数被称为耐心值(Patience)。在耐心值规定的循环次数内,如果CNN模型在验证集上的性能没有得到提升,则认为后续的训练对模型性能的提升是没有意义的,并且继续训练可能导致模型的过拟合现象,因此可以提前终止训练过程,这样不但能获得最佳的模型参数,而且能避免不必要的继续训练所带来的时间和存储空间的损耗。