购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

1.4 卷积神经网络的训练

通过对1.3节的学习,读者们应该已经学会了如何搭建一个卷积神经网络。本节将详细介绍卷积神经网络的几个常用损失函数和优化方法。

1.4.1 常用损失函数

卷积神经网络和一般的神经网络一样,是通过最小化损失函数的值来进行训练的。神经网络在未经过训练之前,其权重是随机初始化的,没有任何预测或识别能力,输出来的结果当然也没有任何意义,等于在随机猜测。对于有监督学习(Supervised Learning)而言,每一张输入图片都会有人工标注的真实值,而神经网络训练的目标就是让模型输出的预测值和人类标注的真实值一致。损失函数就是用来测量模型输出和真实值之间差距大小的,模型的输出和真实值差别越大,损失函数的损失值就越大。训练的过程,就是使用优化算法来优化模型的参数,让损失值变小的过程。

不同的模型有不同的输出,回归型任务的输出和分类型任务的输出就大不相同,这在1.3.2小节已有详述。对不同的任务会有不同损失函数,甚至同一种任务的损失函数都会有很多种选择。损失函数的选择对模型的训练和最终结果的质量影响很大,有时一个巧妙的损失函数能让无法训练的模型变得容易训练。因此,掌握各种常用损失函数的特点是极其重要的。

1.回归任务的损失函数和梯度计算

如果希望一个神经网络输出某个特定的数值,那就是一个回归型任务。例如,预测明天的温度,预测图片中某一个像素点离相机的距离等,都是回归型任务。回归型任务最常用的损失函数是均方误差函数,在1.1节就提到了。如果神经网络的输出值是 f ,对应的真实值是 y ,那么均方误差的公式如下:

也就是输出值和真实值误差的平方。因为均方误差也被称为误差的L2范数(L2 Norm),所以也常被称为L2损失(L2 Loss)。

对于回归任务而言,损失值的含义是输出值和真实值的误差,所以必须是正数,平方是一个很好的选择。那么很容易想到,使用误差的绝对值也可以表现误差的大小,这就是所谓的L1损失(L1 Loss),这是因为误差的绝对值也被称为误差的L1范数(L1 Norm)。

L1损失的特点和L2损失有很大的不同,不妨构建一个最简单的回归任务对这两种损失进行对比。用一个激光测距仪对准一个1m外的目标点测量5次,观测到5个数据,5个数据点分别是0.98m、0.99m、1.01m、1.02m、0.85m,利用这5个数据来推断测距仪和目标点之间的距离。

将上面的问题构造成一个优化问题,那么其L2损失为:

式中, y 是目标距离; x i 代表5个测量数据,计算损失值的时候一般会求所有样本损失的平均值,这样损失值的尺度就不会随着样本的数量变化,所以要除以5。这个优化问题的目的是求一个目标距离 y 使得L2损失函数最小。

如果使用最简单的梯度下降法求 y ,就要计算L2损失函数对 y 的梯度,也就是:

显然,当 y 等于5个测量数据点的平均值时梯度为0。因为式(1-23)是凸函数,于是梯度为零的位置也是L2损失函数的极小值所在的位置。所以 使用L2损失函数就意味着用求平均值的方法进行推断, 最后求得的 y 值为0.97。如果使用L1损失,损失函数就变成了:

和L2损失一样,先计算梯度,式(1-25)对 y 的梯度很简单,当 x i > y 时,这个样本贡献的梯度就是-1,反之为1。用公式表达如下:

其中,sgn是符号函数,正数输出1,负数输出-1。这个梯度的含义是> y 的测量值的数目和< y 的测量值的数目之差。当> y 和< y 的测量值一样多的时候,梯度等于零,这也是L1损失函数极小值所在的位置。显然,当 y 等于所有测量值的中位数的时候损失值最小,所以 使用L1损失函数就意味着用求中位数的方法进行推断, 最后求得的 y 值为1.01。

经过对比可以发现,使用L1损失得到的推断结果1.01比L2损失得到的0.97明显更好。这是因为数据中有一个偏离真实值很远的数据点(0.85m),这个数据点会让平均值产生一个很大的偏移,但对于中值而言,0.85m和0.98m并没有区别,都是偏小的测量值。换句话说, L1损失对误差大的数据有更高的容忍度,而L2损失对误差大的数据更为敏感。 所以,到底使用哪种损失函数,需要根据实际项目中的数据特点来定。

除了从数据的角度对比两种损失的区别,还可以从优化算法的角度来对比。从式(1-24)可知, L2损失函数的梯度会随着误差的变小而变小,但L1损失函数却不会, 这意味着当误差很小的时候,L1损失函数的梯度仍然很大,可能会导致训练的不稳定。因此,研究人员结合两者的优点发明了平滑L1损失(Smoothed L1 Loss)。这三种损失函数的梯度曲线如图1-33所示。

· 图1-33 L1、L2和平滑L1损失的梯度曲线

图1-33中颜色最浅的线是L1损失的梯度,颜色最深的线是L2损失的梯度,两者中间的线为平滑L1损失的梯度。可以看出来,L2损失随着误差的变化平滑变化,但如果某一个样本误差太大,会产生一个很大的梯度,可能导致训练不稳定。L1损失在0附近的梯度忽然从1变成-1,也会导致不稳定。而绿线则结合了两者的优点,不会因为大的样本误差产生大的梯度,也不会在0附近产生梯度的骤变,因此被称为平滑L1损失。

2.分类任务的损失函数和梯度计算

分类任务的损失函数和回归任务大不相同。如前文所述,分类任务输出的是概率值,如果预测目标分为 K 个类别,那就会输出 K 个概率值。假设数据集中某一个样本 X i 的类别是 y i ,当前模型的参数是 W t ,使用Softmax作为输出层,则当前模型输出如图1-34所示。

· 图1-34 分类任务Softmax输出层的概率理解

图1-34中Sofmax层输出4个概率值,代表的是在当前模型和输入样本的条件下,预测输入样本属于各个类别的概率。因为是有监督学习,故通过真实值可知这个样本对应的类别 y i 等于1,训练的目标就是让模型从标签为1的输出端输出概率最大,这样预测的分类才是正确的。在最理想的情况下,标签为1的输出端输出概率为1.0,而其他3个输出端均输出0,在实际情况下这几乎是不可能的。如果把所有训练样本都考虑进去,希望模型所有样本真实值对应的输出概率是最大的,于是可以使用极大似然函数(Maximum Likelihood Function)来构造优化问题:

式中, P 指的是第 i 个样本 X i 的真实值标签 y i 对应的输出概率,也就是图1-34中标签为1的概率。公式的含义是所有样本真实标签对应的输出概率的联合概率,所以是 N 个样本的概率相乘,这个联合概率一般被称之为似然(Likelihood),常用字母 L 表示。训练样本和其真实值标签都是给定的,只有神经网络的权重 W 是变量,因此 L W 的函数。最理想的情况下,神经网络在每一个样本的真实值对应的输出端都输出1.0,那么式(1-27)中的联合概率等于 N 个1.0相乘,便得到理论最大值1.0。

神经网络的训练目标就是寻找最优的 W 来让似然 L 达到最大,可以表示为以下优化问题:

根据Softmax激活函数,式(1-27)中的条件概率可以用以下公式表达:

式中, f 1 f k 代表的是整个神经网络模型的直接输出,常被称为Logits, f k 代表的是第 k 个标签的输出,而 k 代表的是标签的编号,从0到3。式(1-29)右侧的分子为 f 1 ,这是因为已经根据真实值得知 y i 等于1。将式(1-29)代入式(1-27)易得:

在解决极大似然问题时,为了让优化的目标函数变得更容易处理,一般会把似然函数转化为负对数似然函数(Negative Log-likelihood Function,NLL)作为优化目标,也就是对原似然函数求自然对数并乘以-1:

展开后不难得到:

而原本的最大化问题也变成了最小化负对数似然的优化问题:

显然,这个负对数似然函数正是损失函数。于是就可以用梯度下降法来训练模型了。如果复习一下本章开头学过的反向传播算法,可以使用链式法则对 W 求导:

反向传播算法让求导计算变得非常简单,每一层都只需要关注本层的求导问题。例如,式(1-34)中计算 NLL 损失函数对 f 的导数时,完全不需要考虑神经网络的参数 W 。如果将式(1-32)代入式(1-34)求 NLL f 的导数,会发现导数的形式极其简单:

式(1-35)中 NLL 损失函数对 f 的导数,可以简单地理解为实际输出概率和目标输出概率的差值。对于真实值标签对应的输出,目标输出概率是1.0,于是导数就是 NLL 损失函数传回的梯度是输出概率减去1。而对于其他标签,目标概率是0,所以梯度是输出概率本身。这也是Softmax函数和负对数似然损失函数的巧妙之处,一方面为分类问题建立了概率模型,另一方面又特别容易计算梯度。

可能读者们还知道交叉熵(Cross Entropy)也是分类问题的损失函数,其实这里的负对数似然损失函数正是交叉熵。 交叉熵是根据信息论中的信息编码长度公式推导出来的,而负对数似然函数是通过似然函数推导出来的,两者的思考角度大不相同,但推导出来的损失函数是一样的,殊途同归。 通过信息论中的编码长度公式推导交叉熵的过程就不在这里展开了,读者可查阅相关资料自行学习。

1.4.2 常用的正则化方法

前文提到过,神经网络模型存在过拟合(Overfitting)的问题。应对这个问题最根本的解决方法是增加训练数据,训练数据集越大,多样性越强,就越不易发生过拟合现象。但是在训练数据有限的情况下,还可以使用正则化(Regularization)方法来防止模型过拟合。最常用的正则化方法有L1正则化、L2正则化和Dropout。正则化也译作规则化,其功能是让模型的参数尽量符合某个规则,通过对模型进行约束来防止模型过拟合。不同的正则化方法代表了不同的约束规则,当然也会对最终的模型产生不同的效果。

1.L2正则化的搜索空间解释

L2正则化的做法是在损失函数中加入模型权重的L2范数作为一个损失项:

式中, λ 是控制正则化强度的系数, λ 越大则正则化的力度越大; W 是神经网络的权重。从式(1-36)可以看出来,权重值越大,L2正则化损失就越大。而优化的目标是让损失变小,所以在优化算法的作用下,这个L2正则化损失会让模型的权重值越变越小。那么为什么L2损失可以防止模型过拟合呢?从不同的角度出发,有很多种解释的方法。

第一种解释是 L2损失可以缩小权重值的参数搜索空间 。在没有L2损失的情况下,模型的权重没有任何约束,最终权重在训练过程中张成的搜索空间会呈现出一个范围很大的奇怪形状,如图1-35所示。

· 图1-35 对L2正则化原理的直观解释

图1-35是对神经网络参数的一种高度简化。横轴和纵轴代表了两个参数 W 1 W 2 ,虚线圈代表的是没有任何正则化情况下神经网络参数覆盖的搜索范围。所谓搜索范围,就是在训练过程中参数达到过的值围成的区域。加入了L2正则化之后,优化器会让权重值变小,等于压缩了搜索范围,于是加入L2正则化之后的权重搜索范围就大大缩小了,变成了如图1-35中所示的深色实线标记的区域。因为L2正则化对极端值有更强的压缩效果,所以原始搜索范围的很多棱角都被压平,因而实线所标记的搜索范围也更加规整。而优化器寻找的正确权重则是图中的点,显然,通过压缩搜索范围,最终达到最优解的可能性大大增加了。

通过L2正则化,权重中极端大的值和极端小的负数都会变少,最终会让模型更接近真实模型。图1-36所示是一个简单的回归问题,黑色的点是数据样本点,回归的目标是黑色的直线,虚线是没有使用任何正则化情况下得到的模型,灰色实线是使用L2正则化得到的模型,显然灰色实线更接近真实模型。读者可能会问,如果真实模型真的很复杂呢?在深度神经网络的世界里,模型一般都是过度参数化的(Overparameterized),就是说一般神经网络的复杂度总是会远远超过真实模型的复杂度,所以正则化就是必不可少的了。

· 图1-36 对过拟合现象的直观解释

2.L2正则化的概率解释和权重的初始化

第二种解释是从概率角度出发的解释。前文说到,训练一个神经网络就是对似然函数最大化的过程,最大似然函数表示的是在给定输入 X i 和权重值 W 的情况下,模型预测得到输出 y i 的条件概率,即:

式(1-37)中的条件概率可以表示成联合概率的形式:

式中, P W )表示的是当前权重值 W 出现的概率,也就是 W 的先验概率(Prior probability)。既然当前的权重值是经过上一轮的迭代更新计算得出的,所以在一般情况下,认为这个概率就等于1.0。但也可以巧妙地构造一个先验概率引入对权重值的约束。

通过学习前文介绍的输入归一化和批归一化,读者已经知道,通过对每一层的输入进行归一化,能让训练变得更快、更稳定。所以理所当然地可以想到,是不是权重也需要归一化?所谓一个巴掌拍不响,损失曲面不仅是由输入决定的,也是由权重决定的,每一层归一化之后可以让损失曲面变得更规整,但权重如果是扭曲的,损失曲面也会变得扭曲,因此,希望权重也能归一化。所谓权重归一化,就是强行把每一次迭代后每一层的权重进行归一化操作,使之符合均值为0的正态分布。事实上,确实有研究人员发现在训练过程中对权重进行归一化可以让训练变得更稳定。但在一般的工程实践中,不会在训练中进行粗暴的权重归一化。一般的做法是通过加入正则化损失,对偏离正态分布的权重进行惩罚,让权重尽量符合正态分布。如果在概率的框架里考虑,则等价于为权重赋予一个符合标准正态分布的先验概率(Prior probability),也就是说,默认正确权重值应符合均值为0的正态分布。所以式(1-38)中的 P W )就可以表示为:

只需将式(1-39)代入式(1-38),然后按照1.4.1节中介绍的从似然函数推导出负对数似然损失函数的方法,最终就变成了:

读者应该发现了,这正是加入了L2正则化损失的损失函数。所以, L2正则化等价于为权重值赋予一个均值为0的正态分布作为先验概率分布。换句话说,是让权重值在优化器的帮助下慢慢地归一化。

值得注意的是,虽然在训练中会通过L2正则化让权重值慢慢归一化,但在开始训练的时候,模型的参数是随机生成的,这就给了很大的自由度。所以在随机初始化模型参数的时候,可以选择直接按照均值为0的正态分布来初始化模型的参数,相当于直接生成已经归一化过的随机权重,这会让训练变得更加顺利。

3.L2正则化的模型复杂度解释和权重衰减

第三种解释是从模型复杂度角度出发的解释。 当训练数据没有为某些权重带来足够梯度的时候,这些权重值会因为L2正则化的存在变得越来越小直至等于0。 原理其实不难理解,如果训练数据没有为某些权重提供梯度,说明这些权重其实并不重要,于是L2正则化损失就会慢慢地让这些权重消失,所以L2正则化起到了一个为模型删除不必要参数的作用。而删除模型的参数,就意味着降低了模型的复杂度。因为整个删除的过程是缓慢地在训练过程中进行的,所以完全可以认为,降低的复杂度其实是不必要的复杂度,而降低不必要的复杂度,正是防止过拟合的方法之一。

因为L2正则化直观的特性,很多深度学习框架都直接提供了让权重慢慢变小的功能,也就是所谓的权重衰减(Weight Decay)。所以在实际的操作中,就不再需要额外定义L2正则化损失项了,直接设置优化器的权重衰减系数即可。

除了L2正则化,还有L1正则化。L1正则化对神经网络的压缩有独特的作用,因此和L1正则化有关的内容会在第7章网络压缩详细讲解。

4.Dropout

L1和L2正则化适用于很多机器学习方法,如多项式回归、逻辑斯蒂回归、支撑向量机等。但有一个正则化方法是针对神经网络的,那就是Dropout。Dropout的原理很简单,就是在训练过程中随机切断全连接网络里的一些连接(见图1-37)。

实现的方法就是每一次迭代都将某一层神经网络一定比例的输入元素随机设置为0,这个比例就称为Dropout比率。常用的比率是0.5,也就是切断50%的连接。

这个正则化方法看起来非常无理,让人难以置信,其实其隐含了神经网络的重要内在规律。神经网络经常会被描述为在训练的时候“喜欢作弊”,意思是神经网络并不一定会按照人的愿望学习到足够的特征,往往会选择学习最简单的特征来完成任务,这就让神经网络的健壮性变得很差。例如,语义分割网络的一个类别是天空,而天空往往是蓝色的,最后语义分割可能会偏向于识别蓝色的天空,遇到阴天可能就无能为力了。这是因为天空有很多特征,如是蓝色的、位于房屋和树木的上方等,人类识别天空也是一样的原理,会综合多种特征对天空进行识别。但神经网络总是偏向大批量的训练数据(也就是过拟合),更倾向于用简单而单一的特征进行识别。 为了让神经网络学习到更复杂、更综合的知识,人们干脆在训练中随机地丢弃一些特征,也就是说希望神经网络在丢弃掉一些特征的情况下,也能够依靠其他特征识别出目标,从而强迫模型学习多种特征。

· 图1-37 Dropout的原理示意图

值得注意的是,Dropout一般用于最后的全连接层,而卷积层不使用Dropout,这是因为在实践中发现Dropout会影响批归一化的稳定性反而产生不好的效果。此外,Dropout只在训练中使用,是帮助训练的正则化方法。在训练完成进行真实数据推断的时候,就不使用Dropout了,这时人们希望神经网络训练好的所有特征能一起发挥作用。

1.4.3 常用的优化器

有了模型和损失函数,就可以使用梯度下降法对模型进行训练了。普通的梯度下降法需要对整个数据集的损失加和然后求梯度,这对使用大量图片作为输入的卷积神经网络而言显然是不现实的,所以需要分批次(Batch)进行训练,批次的概念已经在前文介绍过了。简而言之,训练卷积神经网络的时候,每一轮训练都只对若干张图片产生的损失加和,一般一个批次内包含的图片越多,训练速度就越快,所以在实际训练过程中会尽可能地把批次加大。常用的批次大小一般在8到32之间,也就是一个批次包含8张图片到32张图片。如果图片太多,用于训练的显卡(GPU)显存有限,可能无法加载图片。

因为在构造一个批次的时候是随机选择图片,所以这种基于批次的梯度下降法就称作随机梯度下降法(Stochastic Gradient Descent,SGD)。熟悉优化算法的读者可能会想到,梯度下降法是优化算法里最简单的了,还有牛顿法(Newton's Method)、莱文贝格-马夸特(Levenberg Marquardt,LM)方法,是不是都可以用来优化神经网络?从理论上来说是可以的,但工程实践中一般不会使用。主要原因是这些更先进的优化方法一般都要对神经网络的参数求二阶导,优化的过程中需要维护一个庞大的海森矩阵(Hessian Matrix),无论是存储开销还是计算开销都太大了,即便考虑这些算法带来的优化加速,仍然得不偿失。因此大部分优化方法都是基于随机梯度下降法的改进方法。其中最常用的优化方法莫过于Adam优化法,要理解Adam优化法,先得理解动量(Momentum)的概念。

1.利用动量逃离局部极小值

仍然使用前文使用过的讲解梯度下降算法的例子。如图1-38所示,横轴代表的是神经网络的参数点,每一个点都代表了整个模型的参数,纵轴是损失值,代表的是在已有模型参数的情况下,模型在数据集上进行推断之后通过损失函数得到的损失值。

通过梯度下降法,优化的过程如同一个小球从右侧的初始位置滑落到局部极小值。很容易发现,其实这个小球只需要越过左侧的小山峰,就有机会达到左侧的全局极小值。但是因为局部极小值附近梯度很平缓,使用梯度下降的方法小球将无法爬过左侧的小山峰。研究者们联想到,现实世界中的小球从那么高的位置滑下来,肯定能够轻而易举地滑过左侧的小山峰,这是因为小球具有动量,那么优化算法中自然也可以使用动量的概念来让模型逃出局部极小值的“陷阱”。所谓动量,就是值在优化过程中进行梯度更新的时候,不完全使用当前的梯度,而是保留一部分之前的梯度,让优化过程具有一定的“惯性”。

· 图1-38 梯度下降算法示意图

假设神经网络模型的参数是 W ,损失函数是 L ,那么使用普通的梯度下降算法对 W 进行更新可以用式(1-41)表示:

式中, λ 是学习率, g i -1 是梯度。如果使用动量,每次更新时使用的就不是梯度了,而是动量:

式中, m i -1 就是动量,动量则根据梯度进行更新:

式中, β 的大小决定了惯性的大小,常用的 β 值为0.9,也就是说保留前一步动量的90%。使用动量之后,优化过程中遇到的小山峰都可以毫无阻碍地越过,带动量的梯度下降法能让模型摆脱局部极小值的陷阱。 纯数学地看,动量是对历史梯度进行指数移动平均(Exponential Moving Average,EMA)的结果。

2.通过动态调整学习率解决局部摆动和鞍点问题

除了局部极小值陷阱问题,优化算法很容易遇到的另一个问题是局部摆动问题。如图1-39所示,当优化进行至极小值附近时,因为学习率过大,模型会在极小值附近来回摆动,无法进一步下探。

· 图1-39 梯度下降算法在极小值附近的摆动问题

一般的解决方案是隔一段时间缩小一次学习率,让模型到了极小值附近得以进一步下探,但这需要人工确定间隔时间。一种称作RMSprop的优化方法试图通过自动调节梯度大小来达到目的,具体调整幅度通过二阶动量确定:

式(1-44)中的 ϵ 是一个很小的值,用于保证分母>0; v i -1 便是二阶动量。之所以称之为二阶动量,是因为它是由梯度的二次方计算出来的:

仔细观察会发现,RMSprop在对参与更新的梯度进行负反馈式的缩放,而且是各个权重单独计算的,也就是说会针对每一个权重的历史梯度进行适配。RMSprop会对历史梯度大的权重缩小学习率进行“刹车”,使之得以下探到更深的极小值。同时,对于历史梯度小的权重,RMSprop也会对这些梯度进行负反馈,让这些梯度小的权重“加速”往外闯。通过对不同权重进行“刹车”和“加速”,RMSprop解决了优化算法中著名的鞍点问题(见图1-40)。

假设当前的模型正在沿损失曲面上的AB方向进行梯度下降,因为AB沿线上CD方向的梯度很小,模型将在AB方向来回摆动而无法沿着CD线进一步下探。有了RMSprop算法,AB方向的权重会因为梯度很大被“刹车”,而CD方向的权重则因为梯度很小得到“加速”,从而让模型摆脱鞍点的束缚进一步沿着CD方向下探。

· 图1-40 优化问题中的鞍点问题

3.Adam优化算法,集大成者

通过结合带动量的梯度下降算法和RMSprop算法,研究人员发明了Adam优化算法,希望能结合两者的优点,得到最好的效果。实践经验也证实了这一点,Adam算法是现在最流行的优化算法,一般使用Adam优化模型总是能得到比较好的结果。由于Adam是两种优化算法的结合,所以首先要计算梯度,一阶动量和二阶动量:

一阶动量和二阶动量应该是历史梯度的平均,但在训练开始的第一歩,因为缺乏历史数据,一阶动量和二阶动量只能被初始化为0。因而一阶动量和二阶动量都会产生一个(1 )的尺度偏移(Bias):

很显然,既然一阶动量和二阶动量是历史梯度的平均,那么训练开始时的第一个动量值就应该等于第一个梯度值,所以要通过除法来去掉这个尺度偏移,得到经过偏移矫正(Bias-corrected)的动量值:

然后使用经过偏移矫正的一阶动量和二阶动量对参数进行更新:

以上便是Adam优化算法的计算过程。简而言之,Adam优化算法就是进行过偏移矫正的动量梯度下降法和RMSprop法的结合。

1.4.4 常用的训练学习率调整方法

前文提到过,使用随机梯度下降的时候,会过一段时间降低一次学习率,这样才能让优化下探到更低的位置。观察图1-41中所示模型的损失曲线很容易发现,当优化进行到一定程度,因为学习率太高,模型会在极小值附近反复横跳。

· 图1-41 学习率调整算法示意图

如果不降低学习率,模型几乎没有可能达到极小值。如果按照图1-41b中学习率变化趋势图所示的规则降低学习率,训练损失值就会呈现出图1-41c所示的变化趋势,在学习率降低的瞬间,损失会陡然降低。这是因为模型下探到了损失曲线中更陡峭、更低的谷底。

虽然已经知道学习进行到一定的程度要把学习率降低,但具体应该什么时候开始降低,降低到什么程度,这就要依赖于调度器(Scheduler)了。常用的调度器有三种:多步调度器(Multi-Step Scheduler)、指数调度器(Exponential Scheduler)和余弦调度器(Cosine Scheduler)。这三种调度器按照不同的规则降低学习率,其效果如图1-42所示。

· 图1-42 几种学习率调整算法的调整策略

多步调度器是最为自由的调度器,用户可以自定义学习率变化的每一个节点作为里程碑(Milestone),同时还可以定义每一个里程碑学习率下降的比率。如图1-42中所示的多步调度器分别在第4、8、16、32、64和84个Epoch将学习率降低为之前的1/2。指数调度器相比多步调度器更为平滑,所谓指数调度是指每一个Epoch都会将学习率按照某一个百分比降低,如图1-42中的指数调度器就是将每一个Epoch的学习率降低为前一个Epoch的90%。指数调度器会在一开始快速调低学习率,这也符合训练的一般规律:一开始学习率大,训练快,所以大学习率训练的轮次少;后期学习率小,训练慢,因而训练轮次多。余弦调度器,顾名思义,就是按照余弦曲线降低学习率。

具体使用哪个调度器进行学习率调整,并没有定规,常用的方法是先分别试用余弦和指数调度器,取其优者,这两种调度器都不需要太多的参数设置,非常方便。在最后获得最优模型后,再使用多步调度器对模型进行最后微调,将精度推至极限。 qNOSi1ocm2pvfLe6l388LvXEHU3vfy5NJHf6dEqFzukcLkQazy/y/ePT00g6j/TG

点击中间区域
呼出菜单
上一章
目录
下一章
×