咨询热线
0898-08980898传真:0000-0000-000
深度学习中的优化算法研究
1. 引言
2006年,Hinton等人提出了一种新的机器学习研究领域——深度学习 [1],通过建立多层的神经网络结构来模拟人脑的多层次学习过程,在计算机视觉、自然语言处理等方向发挥着显著的优势,广泛应用于自动驾驶、目标识别、图像处理等领域 [2] [3] [4] [5]。
深度学习模型是一个多层次的网络结构,由输入层、多个隐藏层和输出层构成,网络的每一层中都含有大量的参数,主要包括权重矩阵w和偏差向量b,这些参数的取值直接决定了网络模型的优劣。为了获得优秀的深度学习模型,需要在网络模型训练时使用深度学习优化算法对模型中的参数进行优化更新。
深度学习中的优化算法 [6] [7] [8] 主要分为一阶算法和二阶算法:一阶算法基于梯度下降法 [9],是目前深度学习理论和实际应用中的主导优化方法;二阶算法有牛顿法 [10] [11] 和共轭梯度法 [12] [13] 等,由于二阶优化算法需要进行二阶求导,受限于计算量与内存成本,很少应用在深度学习的各项任务中。本文着眼于对当前深度学习模型中广泛流行的一阶优化算法进行介绍。
2. 梯度下降法
梯度下降法(Gradient Descent)最初是最优化理论中的基础方法,常常用于求解无约束最优化问题,广泛应用于目标追踪、工程设计和产品优化等方面 [14] [15] [16] [17],后来拓展到机器学习和深度学习领域中。
深度学习网络模型训练的目标是最小化损失函数,即尽可能降低目标真实值和模型预测值之间的差距,如果将损失函数看作目标函数,那么任务目标等价于求解一个最优化问题。梯度下降法正是一个可以找到最小损失函数值的优化算法,它首先利用所定义的损失函数来计算当前参数值的损失,然后计算网络中每个参数的梯度,并且在梯度的相反方向上通过与梯度成比例的因子更新参数值,重复上述步骤直到符合需要。
网络训练时,根据每次更新使用的样本数据量大小,可以将梯度下降法分为三个种类:批量梯度下降(Batch Gradient Descent)、随机梯度下降(Stochastic Gradient Descent)以及小批量梯度下降(Mini-Batch Gradient Descent)。
批量梯度下降法是最原始的形式,指的是在每一次迭代时使用全部样本来进行模型参数的更新。它的优点在于使用全部数据可以很准确地朝目标值所在的方向梯度下降,并且实现了并行运算;缺点在于当数据量过大时,一次迭代的时间成本较大,训练过程较慢。
随机梯度下降法不同于批量梯度下降法选择全部样本进行参数更新,而是在每一次迭代时在所有样本数据中随机选择一个来进行模型参数的更新。这样的好处是可以大大加快训练过程,实现了在线更新;但是弊端是由于每次只随机选择一个样本进行更新,会有随机的噪声波动,使得每次梯度下降的方向不准确,很可能无法收敛到全局最优值。
小批量梯度下降法,是介于批量梯度下降法和随机梯度下降法之间的一个折中方法,每一次迭代时随机使用固定数量的样本数据进行参数更新,这个固定数量被叫做批大小(Batch size),是小于样本数据总数的一个值,实践中往往选取16、32和64等值。小批量梯度下降法兼顾了训练时间和更新速度,是深度学习中最常使用的方法。
在深度学习中,常常把随机梯度下降法和小批量梯度下降法都称为随机梯度下降法,下文中我们提到的随机梯度下降法所指代的是它们两者。
3. 历史发展与现状
为了寻找最优参数,大部分深度学习神经网络中采取的最基本方法是随机梯度下降法(SGD) [18] [19]。根据参数更新时实际学习率是否固定为常数,可以将SGD算法大体分为两类:第一类是随机梯度下降及其动量变体算法,第二类是自适应学习率算法。
3.1. 随机梯度下降及其动量变体算法
随机梯度下降法在训练集所有的n个样本中,随机选取 个独立同分布的小批量样本 ,其中 对应目标为 ,然后利用所定义的目标优化函数L在小批量样本上计算网络中每个参数的梯度,之后计算它们的梯度均值获得梯度的估计,最后在负梯度方向上通过学习率超参数和梯度均值来更新参数值,重复上述步骤直到达到停止条件。
SGD中,参数 在第t次迭代时更新为: ,其中, 和 分别是参数先前值和更新值, 为固定的学习率超参数, 是第t次迭代时的参数梯度。算法1中展示了随机梯度下降法的伪代码流程。
基本的随机梯度下降法有以下四个主要缺点:1) 梯度高度敏感于参数空间的某些方向 [20];2) 如果目标损失函数有局部最小值或鞍点,由于该区域中的零梯度,参数更新会卡住 [21];3) 不是在全批量而是在小批量上计算梯度,会有随机的噪声扰动;4) 每个参数采取相同的学习率超参数进行更新,需要小心设置学习率的值。
为改进随机梯度下降法的几个缺陷,设计更适合神经网络的优化方法,研究人员陆续提出了几种SGD变体。具有动量的随机梯度下降法(SGD with Momentum, SGDM) [22] [23] 是SGD的一个广泛使用的拓展。鉴于神经网络中的优化目标函数并不总是严格的凸函数,所以使用经典的SGD时参数很可能会由于局部最小值或鞍点处梯度近似为零,困在此处无法更新。SGDM考虑这个问题,通过结合过去的梯度信息来保持一个“动量”,使得参数可以跳出局部最小值和鞍点。物理学中,动量表示物体的质量和速度的乘积,指的是运动物体在它运动方向上保持运动的趋势,SGDM中把参数看作单位质点,梯度看作力,当力(梯度)改变时参数会随之加速或减速。SGDM将动量定义为梯度的指数移动平均值(EMA),同时引入动量超参数 用于调节先前梯度的衰减效果,相对于学习率超参数,动量超参数越大,历史梯度对当前方向的影响也越大。
在SGDM中,过去的梯度被合并以获得具有一致梯度的参数的动量,目标是在任何具有一致梯度的维度上发展高“速度”。直观的理解为:要是当前时刻的梯度与历史时刻梯度方向相似,这种趋势在当前时刻则会加强;要是不同,则当前时刻的梯度方向减弱。前者能够加速收敛,后者能够减小摆动。如图1所示,动量方法解决了SGD中梯度敏感于参数空间某些方向和易陷入局部最小值或鞍点的问题,并且加快了参数的学习和收敛 [24]。SGDM的伪代码如算法2所示。
2013年,Sutskever等 [25] 受到Nesterov动量的启发 [26] [27],提出了具有动量的随机梯度下降法的另一个变体——NAG优化器(Nesterov’s Accelerated Gradient)。NAG和SGDM的差别在于:NAG先跟随历史累计梯度信息更新一步到临时参数点,然后再计算临时参数点处的梯度,将该梯度加入动量后更新到实际参数点;SGDM则不“先走一步”进行临时更新,而是直接计算梯度和动量来更新参数。NAG比SGDM多应用了一次梯度信息,对参数的当前梯度方向进行了修正,得到了更为精确的更新梯度,进一步地提升了SGDM的算法稳定性,并且加快了收敛速度。NAG算法的伪代码如算法3所示。
3.2. 自适应学习率算法
上述介绍的随机梯度下降及其动量变体算法都使用固定的常数作为学习率,参数以相同的步长更新,不考虑梯度行为,因此如何设定学习率的大小在实际应用中十分重要。然而,学习率是一个难以设置的超参数,它对模型性能有显著的影响。近年来,深度网络优化的有效方法是为每个参数制定自适应步长,即在整个迭代过程中自动地调整学习率,该类算法被称为自适应学习率优化算法。
3.2.1. 经典的自适应学习率算法
2011年,Duchi等人 [28] 受到Delta-bar-delta算法训练早期时适应参数的学习率 [29] 的启发,提出了第一个经典自适应学习率优化算法——AdaGrad。AdaGrad算法采用参数的过去累计梯度平方和的平方根来划分学习率,可以很好地处理稀疏数据。它对不频繁的参数执行较大的更新,使得步长较大,多学习一些知识;而对频繁的参数执行较小的更新,使得步长较小,学习过程更稳定,不至于被单个样本影响太多。AdaGrad减少了传统SGD及其动量变体算法中需要手动调节学习率的需要,实现了学习率的动态调节,提高了超参数的鲁棒性。AdaGrad算法的伪代码如算法4所示。
但是,AdaGrad的缺点是会不断累积梯度的平方,在一段时间后分母过大,会大幅降低学习率甚至使其逐渐递减至零,反而扼杀了学习过程,导致训练提前结束。为了改进AdaGrad算法的上述缺点,2012年Adadelta算法 [30] 和RMSProp算法 [31] 被提出。RMSProp使用指数移动平均法计算累计梯度平方,替代了AdaGrad中直接计算梯度平方和的方法。利用指数移动平均法的好处在于,计算二阶动量时不累积全部历史梯度,而只关注最近某一段时间窗内的梯度信息,衰减率超参数 用来控制时间窗长短。RMSProp算法的伪代码如算法5所示。
2014年,Adam算法 [32] 被提出,它是现今最为广泛使用的一种自适应学习率优化算法,在深度学习相关的各种任务实践上都很受欢迎。Adam算法可以看作是SGDM算法和RMSprop算法的结合,基于被称为一阶矩和二阶矩的两个向量来自适应地调节学习率。一阶矩m和二阶矩v分别使用梯度和梯度的平方的指数移动平均值来定义,在迭代的初始阶段,观察到一阶矩m和二阶矩v有一个向初值的偏移(过多的偏向了零)。为解决,Adam校正了一阶矩和二阶矩的偏差,然后通过校正的两者计算每个参数的自适应学习率。如果我们把矩想象成是一个球滚下斜坡,Adam表现得像一个有摩擦的重球,因此可以更快速更准确地朝着目标曲面上的平坦极小值前进。算法6展示了Adam算法的伪代码流程。
对于标准的随机梯度下降法,L2正则化和权重衰减正则化是等价的,但是对于如Adam的自适应学习率优化算法,Loshchilov等 [33] 在2017年证明,L2正则化和权重衰减并不相同,这也是Adam的泛化性能较差的一个主要原因。由于L2正则化对Adam的效果远不如对SGD有效,而权重衰减正则化对Adam和SGD同样有效,因此作者提出了AdamW,将权重衰减从损失函数的优化步骤中解耦出来,恢复权重衰减正则化的原始公式。AdamW算法使得正则化权重衰减率与学习率两个超参数的影响解耦,提升了Adam算法的泛化性能。
3.2.2. 对梯度信息的利用改进算法
2018年后,研究人员陆续基于Adam算法进行了改进,他们考虑已有的长期或短期样本梯度信息对学习过程的调节作用,对自适应学习率进行更改,来动态加大或减小更新步长。
2018年,Zaheer等 [34] 考虑到Adam使用了本质上是“乘性”的指数移动平均法,导致过去的梯度以相当快的方式被“遗忘”,在稀疏情况下即梯度大多为零时会出现问题,提出了一种“加性”改进算法Yogi。Yogi将二阶矩v的计算从Adam中的指数移动平均乘性算法变为加性算法,两者相同的一个重要特性是 和 的差异仅取决于 和 。然而,这种差异的大小在Yogi中仅取决于 ,而Adam中则取决于 和 。相比于Adam,Yogi减轻了指数移动平均法对过去梯度信息的比重过小,同时还可以控制实际的自适应学习率的增长情况,来获得更好的性能。Yogi的伪代码如算法7所示。
2018年,Reddi等 [35] 发现当Adam中梯度的平方大幅下降时,二阶矩变得较低,自适应学习率会变高,可能会引起参数更新超过最优解并发散的问题,于是提出了AMSGrad算法作为对Adam的改进。AMSGrad考虑用过去二阶矩的最大值,即过去梯度的长期记忆值,来代替Adam算法中的二阶矩,目的是给学习过程施加更多的摩擦,来避免超过目标最小值。AMSGrad的伪代码如算法8所示。
2020年,耶鲁大学团队提出了AdaBelief算法 [36],同样针对Adam算法的二阶矩进行了更改。AdaBelief将一阶矩看作当前梯度的预测值,根据梯度方向上的“信念”(Belief)来自适应地调节实际的学习率进行参数更新。当一阶矩和当前梯度的差值较小时,“相信”当前梯度是正确的,参数更新步长大;当一阶矩和当前梯度的差值较大时,“不相信”当前梯度,参数更新步长小。团队在论文中表示,该优化器兼具Adam的快速收敛特性和SGD的良好泛化性。AdaBelief算法的伪代码如算法9所示。
Dubey等在2020年提出了Adam算法的又一改进——diffGrad算法 [37],不同于AMSGrad算法中考虑“长期梯度行为”,而是展现了如何利用“短期梯度行为”来控制优化环境中的自适应学习率,使参数更新接近或远离最优解。diffGrad算法基于近期梯度的变化信息,引入了差分梯度摩擦系数(diffGrad Friction Coefficient, DFC)来动态调整自适应学习率,使参数按照需要的方向来更新。第t次迭代时的差分梯度摩擦系数DFC定义为: 。其中, 是上一次迭代和当前迭代之间的梯度变化; 是一个非线性Sigmoid函数,它把每个值压缩在0.5到1之间。如果梯度变化很大时,DFC趋近于1,摩擦力几乎没有,此时diffGrad与Adam相同;如果梯度变化很小时,DFC趋近于0.5,会产生摩擦力。这意味着,DFC不仅允许高梯度变化表面的高学习率,而且降低了低梯度变化表面的学习率,并防止超过可能的目标值。算法10展示了diffGrad算法的伪代码。
2021年,Khan等提出的AdaDB算法 [38] 是针对diffGrad算法的改进,两者的差别在于计算差分梯度摩擦系数DFC的方法。diffGrad基于上一期梯度和当前梯度的变化来计算更新梯度差,而AdaDB则是考虑过去三期梯度与当前梯度来计算更新梯度差。为了能进一步地加快学习过程,AdaDB根据连续两次迭代的梯度异号或是同号,分别定义了DFC,使其可以动态增大或减小自适应学习率,而不像diffGrad中只能减小而不能增大自适应学习率。算法11展示了AdaDB算法的伪代码。
3.2.3. 对极端学习率的探索改进算法
与传统的随机梯度下降算法相比,Adam这类自适应学习率优化算法存在泛化能力较差、甚至可能由于不稳定和极端的自适应学习率而无法收敛的问题 [39] [40] [41] [42]。针对这些问题,国内外的研究学者们展开了探索,尝试设计一种兼具好的泛化性能与快的收敛速度的优化算法。
2019年,AdaBound算法被Luo等人 [43] 提出,旨在结合Adam算法和经典SGD算法的优势,即分别是训练早期快速的收敛速度和训练末期更好的最终性能。AdaBound的创新在于设计了一个动态学习率裁剪函数: ,其中 和 分别是非减的下界函数和非增的上界函数。在这一动态的学习率边界操作下,自适应学习率被限制在一定范围之间。训练早期时,上界和下界对学习率的影响很小,算法更加接近于Adam;而随着训练过程的推进,裁剪区间越来越收紧,学习率逐渐趋于稳定,算法更加接近于SGD。于是,AdaBound算法就实现了从Adam到SGD的渐进动态平稳过渡。
在AdaBound算法基础上,Ding等 [44] 又进一步提出了AdaMod算法。为了避免训练过程中可能出现的极端自适应学习率值,AdaMod通过计算自适应学习率的指数移动平均值,来动态修剪过高的学习率,使训练过程变得更加平稳。AdaBound算法和AdaMod算法的伪代码如算法12和算法13所示。
2020年,来自伊利诺伊州大学的团队 [45] 更深入地研究了Adam优化算法在训练早期会由于较大的学习率引起模型振荡问题的原因与解决方案。在此之前,基于工程直觉,实践中往往采用学习率预热方法(Warmup) [46] 解决Adam的振荡问题——在训练最初几个时期使用较小的学习率,等模型相对稳定后再选择预先设置的学习率进行训练。预热一般可以使模型收敛更快、效果更佳,防止早期的梯度分布被扭曲。但是,由于缺乏理论基础,不能保证预热会为各种机器学习的任务带来一致的改进,也不能指导面对不同数据集中应该如何进行预热。伊利诺伊州大学团队在论文中给出了预热的理论依据,表明Adam等的收敛问题是由于使用的训练样本数量有限,在模型训练的早期阶段自适应学习率有不期望的大方差。团队将预热看作是一种方差减少技术,从统计学的角度对学习率方差进行了研究,并提出了一种新的Adam变体——RAdam,意为“整流版的Adam”(Rectified Adam)。RAdam使用简单移动平均法近似Adam二阶矩中的指数移动平均法,将自适应学习率的平方看作服从缩放逆卡方分布,从而估算出自适应学习率的方差,最后提出修正因子 来校正各时刻的方差使其最小。总而言之,RAdam避免了传统需要手动选择数量超参数的预热方法,采用一个“整流器”函数,根据实际遇到的方差散度,动态地打开、关闭或者修正自适应学习率,起到如预热一样防止早期梯度分布扭曲的作用,当变差稳定下来之后,它在剩下的训练过程中基本就等效于Adam或SGDM。RAdam算法如下算法14所示。
多伦多大学的研究团队对于自适应学习率的较大方差问题,提出了另一种有效的优化算法Lookahead [47],该算法采用了一种全新的设计,与之前已有的方法都不相同。非常需要注意的是,Lookahead严格来说不算一种优化器,更像是一种“包装”,需要搭配其他任意一种优化器(如SGD、Adam)一起工作,从而加强已有优化算法的性能,并且有效地降低自适应学习率的方差。具体来说,如图2所示,Lookahead维持快速、慢速两组权重,首先使用其内循环中的任何标准优化器更新“快速权重”k次,然后沿最终快速权重的方向更新一次“慢速权重”,重复进行上述步骤直至完成。直观地说,该算法允许更快的那一组权重“向前看”或“探索”来选择搜索方向,同时更慢的那一组权重可以留在后面拽回,以带来更好的长期稳定性。Lookahead实践中常常结合SGDM、Adam和RAdam等使用,通常可以提高内部优化器的性能,稳定深度神经网络的训练过程。算法15展示了Lookahead算法的伪代码。
Figure 2. The parameter update process of Lookahead when synchronization period k=5
图2. 同步周期k=5时,Lookahead的参数更新流程
4. 研究展望
近年来,深度学习中的优化算法层出不穷,但是在深度学习的实际任务中,选择和设计合适的优化器仍面临着许多困难。探索影响优化算法寻找目标点的损失曲面的性质,提升优化算法的收敛速度与泛化性能是具有挑战和价值的研究方向。
1) 损失曲面的性质
深度学习神经网络的损失函数对优化算法的参数更新方向和步长有着关键影响,损失平面的几何特征与性质指导着如何设计优化算法。对于深度学习任务中非凸的目标函数,以及小批量会引起的随机噪声扰动,优化算法如何体现深度神经网络参数的分布信息、正确找到目标点是值得深入探索的问题。
2) 收敛速度与泛化性能
尽管诸如Adam等自适应学习率优化算法在大多深度学习实践任务中表现出优秀的性能,但SGD还是经常在任务训练后期时被使用。自适应学习率优化算法虽然在训练早期有着快速的收敛速度,但在测试时的泛化能力往往不如SGD优秀。目前,实验证实自适应学习率优化器更倾向于收敛到泛化性能效果差的尖锐极小值,而不是和SGD一样,收敛到所期望的平坦极小值。因此,如何提高自适应学习率优化算法的泛化效果、同时保证快速收敛是一个具有价值的研究方向。
基金项目
国家自然科学基金(No. 62072024);北京建筑大学北京未来城市设计高精尖创新中心资助项目(UDC2017033322, UDC2019033324);北京建筑大学市属高校基本科研业务费专项资金资助(No. X20084, ZF17061);北京建筑大学研究生创新项目(PG2022144);北京高等教育本科教学改革创新项目(201910016004)。
参考文献