当前位置: 首页 > 科技观察

从梯度下降到亚当!一篇文章看懂各种神经网络优化算法

时间:2023-03-19 21:54:15 科技观察

本文经AI新媒体量子位(公众号ID:QbitAI)授权转载,转载请联系出处。在调优模型更新权重和偏差参数的方式时,是否考虑过哪种优化算法会让模型表现得更好更快?我应该使用梯度下降法、随机梯度下降法还是Adam方法?这篇文章描述了不同优化算法之间的主要区别以及如何选择最佳算法。什么是优化算法?优化算法的作用是通过改进训练方法来最小化(或最大化)损失函数E(x)。模型内部的一些参数用于计算测试集中目标值Y的真实值与预测值的偏离程度。基于这些参数,形成了损失函数E(x)。例如,权重(W)和偏差(b)就是这样的内部参数,通常用于计算输出值,在训练神经网络模型中起主要作用。模型的内部参数对于有效地训练模型和产生准确的结果起着非常重要的作用。这就是为什么我们应该使用各种优化策略和算法来更新和计算影响模型训练和模型输出的网络参数,使它们接近或达到最优值。优化算法分为两类:1.一阶优化算法该算法使用每个参数的梯度值来最小化或最大化损失函数E(x)。最常用的一阶优化算法是梯度下降。函数梯度:导数dy/dx的多元表达式,用来表示y相对于x的瞬时变化率。通常为了计算多元函数的导数,用梯度代替导数,偏导数用来计算梯度。梯度和导数之间的一个关键区别是函数的梯度形成一个向量场。因此,对于单变量函数,采用导数进行分析;而梯度是基于多元函数生成的。更多理论细节在此不再详述。2.二阶优化算法二阶优化算法使用二阶导数(也称为Hessian方法)来最小化或最大化损失函数。由于二阶导数的高计算成本,这种方法没有被广泛使用。各种神经网络优化算法详解梯度下降是训练和优化智能系统时最重要的技术和基础之一。梯度下降的作用是寻找最小值,控制方差,更新模型参数,最终使模型收敛。网络更新参数的公式为:θ=θ?η×?(θ).J(θ),其中η为学习率,?(θ).J(θ)为损失函数J(θ)的梯度).这是神经网络中最常用的优化算法。现在,梯度下降主要用于神经网络模型中的权重更新,即在一个方向上更新和调整模型的参数,使损失函数最小化。2006年引入的反向传播技术使训练深度神经网络成为可能。反向传播技术是在正向传播中首先计算输入信号与其对应权重的乘积,然后将激活函数应用于这些乘积的总和。这种将输入信号转换为输出信号的方式是对复杂非线性函数建模的重要手段,并引入非线性激活函数,使模型能够学习几乎任何形式的函数映射。然后,在网络的反向传播过程中,返回相关误差,使用梯度下降更新权值。通过计算误差函数E相对于权重参数W的梯度,在损失函数梯度的反方向更新权重参数。图1:权值更新方向与梯度方向相反图1显示权值更新过程与梯度向量误差方向相反,其中U型曲线为梯度。需要注意的是,当权值W过小或过大时,都会产生较大的误差,需要对权值进行更新优化,使其转化为合适的值,因此我们尽量寻找局部最优值在梯度的相反方向。梯度下降的变体传统的批量梯度下降会为整个数据集计算梯度,但只做一次更新,因此在处理大数据集时速度慢且难以管理,甚至会导致内存溢出。权值更新的快慢由学习率η决定,在凸误差面上可以收敛到全局最优值,在非凸面上可能趋向于局部最优值。使用标准形式的批量梯度下降的另一个问题是在大型数据集上训练时存在冗余的权重更新。标准梯度下降的上述问题在随机梯度下降法中得到解决。1.Stochasticgradientdescent(SDG)Stochasticgradientdescent(SGD)对每个训练样本进行参数更新,每次执行执行一次更新,执行速度较快。θ=θ?η??(θ)×J(θ;x(i);y(i)),其中x(i)和y(i)是训练样本。频繁的更新导致参数间的高方差,损失函数随着强度的不同而波动。这实际上是一件好事,因为它可以帮助我们发现新的和可能更好的局部最小值,而标准梯度下降只会收敛到某些局部最优值。但是SGD的问题在于,由于频繁的更新和波动,最终会收敛到最小值,并且会因为频繁的波动而出现overshoot。虽然已经表明,当学习率η缓慢下降时,标准梯度下降的收敛模式与SGD相同。图2:每个训练样本中具有高方差的参数更新会导致损失函数大幅波动,因此我们可能无法获得给定损失函数的最小值。另一种变体称为“mini-batchgradientdescent”,可以解决高方差参数更新和不稳定收敛的问题。2.小批量梯度下降为了避免SGD和标准梯度下降存在的问题,一种改进的方法是小批量梯度下降(MiniBatchGradientDescent),因为对于每个batch中的n个训练样本,这种方法只执行更新。使用mini-batch梯度下降的优点是:1)可以减少参数更新的波动,最终得到更好更稳定的收敛。2)也可以使用最新的深度学习库中的通用矩阵优化方法,让小批量数据的梯度计算更加高效。3)一般来说,mini-batch样本的大小在50到256之间,可以根据实际问题而变化。4)训练神经网络时,通常选择mini-batch梯度下降算法。这种方法有时称为SGD。使用梯度下降及其变体时的挑战1.难以选择合适的学习率。学习率太小会导致网络收敛太慢,而学习率太大可能会影响收敛,导致损失函数在最小值上波动,甚至梯度发散。2.此外,相同的学习率并不适用于所有参数更新。如果训练集数据稀疏,特征频率相差很大,不应该都更新到相同的程度,但对于很少出现的特征,应该使用较大的更新率。3.最小化神经网络中非凸误差函数的另一个关键挑战是避免陷入多个其他局部最小值。实际上,问题并非源于局部最小值,而是源于鞍点,即一个维度向上倾斜而另一个维度向下倾斜的点。这些鞍点通常被具有相同误差值的平面包围,这使得SGD算法难以突破,因为梯度在所有维度上都接近于零。进一步优化梯度下降我们现在讨论进一步优化梯度下降的各种算法。1.动量SGD方法中的高方差振荡使得网络难以稳定收敛,因此有研究人员提出了一种称为动量(Momentum)的技术,通过优化相关方向的训练和减弱无关方向的振荡来加速SGD。火车。换句话说,这种新方法将上一步更新向量的分量“γ”添加到当前更新向量中。V(t)=γV(t?1)+η?(θ).J(θ)最后通过θ=θ?V(t)更新参数。动量项γ通常设置为0.9或接近于此的值。这里的动量与经典物理学中的动量是一致的,就像从山上扔球一样,下落时收集动量,小球的速度不断增加。在参数更新过程中,原理类似:1)使网络收敛得更好更稳定;2)减少振荡过程。当其梯度指向实际运动方向时,动量项γ增加;当梯度与实际移动方向相反时,γ减小。这种方法意味着动量项只对相关样本进行参数更新,减少了不必要的参数更新,收敛速度更快更稳定,同时也减少了震荡过程。2.Nesterov梯度加速法YuriiNesterov研究员认为,动量法存在一个问题:如果一个从山上滚下来的球盲目地滑下斜坡,这是非常不合适的。一个更聪明的球应该注意到它要去哪里,所以球在上坡和再次上坡时应该减速。事实上,当球到达曲线的最低点时,动量相当大。由于高动量可能导致它完全错过最小值,球不知道何时减速并继续向上移动。YuriiNesterov在1983年发表了一篇关于解决动量问题的论文,因此,我们称这种方法为Nestrov梯度加速法。在这个方法中,他提出根据之前的动量做一个大跳跃,然后计算梯度来修正,从而实现参数的更新。这种预更新方法可以防止大的振荡,不会错过最小值,并且对参数更新更敏感。NesterovGradientAcceleration(NAG)是一种赋予动量项可预测性的方法,通过使用动量项γV(t?1)来改变参数θ。通过计算θ?γV(t?1),得到参数在下一个位置的近似值,这里的参数是一个粗略的概念。因此,我们可以通过相关参数的大概未来位置来有效预测未来,而不是计算当前参数θ的梯度值:V(t)=γV(t?1)+η?(θ)J(θ?γV(t?1)),然后使用θ=θ?V(t)更新参数。现在,我们通过使网络更新适应误差函数的斜率来顺序加速SGD,并且还可以根据每个参数的重要性调整和更新相应的参数,以执行更大或更小的更新幅度。3.Adagrad方法Adagrad方法通过参数调整合适的学习率η,对稀疏参数进行大更新,对频繁参数进行小更新。因此,Adagrad方法非常适合处理稀疏数据。在时间步长中,Adagrad方法根据为每个参数计算的过去梯度为不同的参数θ设置不同的学习率。之前,每个参数θ(i)使用相同的学习率,每次更新所有参数θ。在每个时间步t,Adagrad方法为每个参数θ选择不同的学习率,更新相应的参数,然后进行向量化。为简单起见,我们将参数θ(i)在时间t的损失函数的梯度设置为g(t,i)。图3:参数更新公式Adagrad方法是在每个时间步根据过去已经计算出的参数梯度,修改每个参数θ(i)对应的学习率η。Adagrad方法的主要优点是它不需要手动调整学习率。大多数参数使用默认值0.01并保持不变。Adagrad方法的主要缺点是学习率η总是在下降和衰减。因为每增加一个项都是正数,分母中就累加了多个梯度平方值,所以累加和在训练过程中不断增长。这反过来又导致学习率下降到如此小的数字,以至于模型完全停止学习并停止获取新的额外知识。因为随着学习速度越来越小,模型的学习能力下降很快,收敛速度很慢,需要很长时间的训练和学习,即学习速度下降。另一种称为Adadelta的算法改进了这个学习率衰减问题。4.AdaDelta方法这是AdaGrad的一个扩展方法,倾向于解决其学习率衰减的问题。Adadelta不是累积所有先前的平方梯度,而是将累积先前梯度的窗口限制为某个固定大小w。梯度之和递归地定义为所有先前平方梯度的衰减平均值,而不是无效地存储w的先前平方梯度。作为类似于动量项的分数γ,时间t处的移动平均值Eg2仅取决于先前的平均值和当前的梯度值。Eg2=γ.Eg2+(1?γ).g2(t),其中γ设置为接近动量项的值,约为0.9。Δθ(t)=?η?g(t,i).θ(t+1)=θ(t)+Δθ(t)图4:参数更新的最终公式AdaDelta方法的另一个优点是它是不再需要设置默认学习率。目前已经完成的改进:1)对每个参数计算不同的学习率;2)计算动量项动量;3)防止学习率衰减或梯度消失等问题。还有什么可以改进的?前面的方法中计算了每个参数对应的学习率,但是为什么不计算每个参数对应的动量变化并独立存储呢?这是Adam算法提出的改进点。Adam算法Adam算法是自适应矩估计法(AdaptiveMomentEstimation),可以计算出每个参数的自适应学习率。该方法不仅存储了AdaDelta前一个平方梯度的指数衰减平均值,还保持了前一个梯度M(t)的指数衰减平均值,类似于动量:M(t)是梯度的平均值第一时刻,V(t)是第二时刻梯度的非中心方差值。图5:两个公式分别是第一时刻梯度的平均值和第二时刻的方差。参数更新的最终公式为:图6:参数更新的最终公式。其中,β1设为0.9,β2设为0.9999,ε设为10-8。在实践中,Adam方法效果很好。与其他自适应学习率算法相比,其收敛速度更快,学习效果更有效,可以纠正其他优化技术存在的问题,如学习率消失、收敛过慢或参数更新具有高方差会导致损失函数波动等问题。优化算法可视化图8:鞍点的SGD优化从上面的动图可以看出,自适应算法可以快速收敛,在参数更新中快速找到正确的目标方向;而标准的SGD、NAG和momentumitems等方法收敛较慢,很难找到正确的方向。结论我们应该使用哪个优化器?在构建神经网络模型时,选择最好的优化器以实现快速收敛和正确学习,同时调整内部参数以最大程度地最小化损失函数。Adam在实际应用中表现良好,优于其他自适应技术。如果输入数据集稀疏,SGD、NAG和动量项等方法可能效果不佳。因此,对于稀疏数据集,应该采用一些自适应学习率的方法,还有一个好处是不需要手动调整学习率,使用默认参数就可以得到最优值。如果你想快速收敛训练的深度网络模型或者构建一个复杂的神经网络,你应该使用Adam或者其他自适应学习率的方法,因为这些方法有更好的实际效果。希望通过这篇文章,您可以很好地理解不同优化算法之间的特性差异。