深度学习基础入门篇[三]:优化策略梯度下降算法:SGDMBGDMomentumAdamAdamW

丰富的线上&线下活动,深入探索云世界

做任务,得社区积分和周边

最真实的开发者用云体验

让每位学生受益于普惠算力

让创作激发创新

资深技术专家手把手带教

遇见技术追梦人

技术交流,直击现场

海量开发者使用工具、手册,免费下载

极速、全面、稳定、安全的开源镜像

开发手册、白皮书、案例集等实战精华

为开发者定制的Chrome浏览器插件

深度学习基础入门篇[三]:优化策略梯度下降算法:SGD、MBGD、Momentum、Adam、AdamW

如果我们定义了一个机器学习模型,比如一个三层的神经网络,那么就需要使得这个模型能够尽可能拟合所提供的训练数据。但是我们如何评价模型对于数据的拟合是否足够呢?那就需要使用相应的指标来评价它的拟合程度,所使用到的函数就称为损失函数(LossFunction),当损失函数值下降,我们就认为模型在拟合的路上又前进了一步。最终模型对训练数据集拟合的最好的情况是在损失函数值最小的时候,在指定数据集上时,为损失函数的平均值最小的时候。

由于我们一般情况下很难直接精确地计算得到当模型的参数为何值时,损失函数最小,所以,我们可以通过让参数在损失函数的“场”中,向着损失函数值减小的方向移动,最终在收敛的时候,得到一个极小值的近似解。为了让损失函数的数值下降,那么就需要使用优化算法进行优化,其中,损失函数值下降最快的方向称为负梯度方向,所使用的算法称为梯度下降法,即最速下降法(steepestdescent)。当前,几乎所有的机器学习优化算法都是基于梯度下降的算法。

总结的来讲优化器(例如梯度下降法)就是在深度学习反向传播过程中,指引损失函数(目标函数)的各个参数往正确的方向更新合适的大小,使得更新后的各个参数让损失函数(目标函数)值不断逼近全局最小。

举一个简单例子

优化问题可以看做是我们站在山上的某个位置(当前的参数信息),想要以最佳的路线去到山下(最优点)。首先,直观的方法就是环顾四周,找到下山最快的方向走一步,然后再次环顾四周,找到最快的方向,直到下山——这样的方法便是朴素的梯度下降——当前的海拔是我们的目标(损失)函数值,而我们在每一步找到的方向便是函数梯度的反方向(梯度是函数上升最快的方向,所以梯度的反方向就是函数下降最快的方向)。

使用梯度下降进行优化,是几乎所有优化器的核心思想。当我们下山时,有两个方面是我们最关心的:

梯度下降是机器学习中常见优化算法之一,梯度下降法有以下几个作用:

下表列举了自然语言处理(NLP),计算机视觉(CV),推荐系统(RecommendationSystem,RS),强化学习(ReinforcementLearning,RL)这四个方向的主流模型使用优化器的情况,可以看出在NLP领域AdamW(AdamWeightDecayOptimizer)使用比较普遍,CV领域SGD和momentum使用比较普遍,推荐领域比较杂,强化学习领域Adam使用比较普遍。

标准的梯度下降,即批量梯度下降(batchgradientdescent,BGD),在整个训练集上计算损失函数关于参数θ的梯度。

$\theta=\theta-\eta\nabla_\thetaJ(\theta)$

其中θ是模型的参数,η是学习率,$θJ(θ)$为损失函数对参数θ的导数。由于为了一次参数更新我们需要在整个训练集上计算梯度,导致BGD可能会非常慢,而且在训练集太大而不能全部载入内存的时候会很棘手。BGD也不允许我们在线更新模型参数,即实时增加新的训练样本。

BGD对于凸误差曲面(convexerrorsurface)保证收敛到全局最优点,而对于非凸曲面(non-convexsurface)则是局部最优点。

随机梯度下降(stotasticgradientdescent,SGD)则是每次使用一个训练样本$x_i$和标签$y_i$进行一次参数更新。

$\theta=\theta-\eta\cdot\nabla_\thetaJ(\theta;x^i;y^i)$

其中θ是模型的参数,η是学习率,θJ(θ)为损失函数对参数θ的导数。BGD对于大数据集来说执行了很多冗余的计算,因为在每一次参数更新前都要计算很多相似样本的梯度。SGD通过一次执行一次更解决了这种冗余。因此通常SGD的速度会非常快而且可以被用于在线学习。SGD以高方差的特点进行连续参数更新,导致目标函数严重震荡.

BGD能够收敛到(局部)最优点,然而SGD的震荡特点导致其可以跳到新的潜在的可能更好的局部最优点。已经有研究显示当我们慢慢的降低学习率时,SGD拥有和BGD一样的收敛性能,对于非凸和凸曲面几乎同样能够达到局部或者全局最优点。

Mini-batchgradientdescent(mini-batchgradientdescent,MBGD)则是在上面两种方法中采取了一个折中的办法:每次从训练集中取出batchsize个样本作为一个mini-batch,以此来进行一次参数更新

$\theta=\theta-\eta\cdot\nabla_\thetaJ(\theta;x^{(i:i+n);y^{(i:i+n)}})$

样本数目较大的话,一般的mini-batch大小为64到512,考虑到电脑内存设置和使用的方式,如果mini-batch大小是2的n次方,代码会运行地快一些,64就是2的6次方,以此类推,128是2的7次方,256是2的8次方,512是2的9次方。所以我经常把mini-batch大小设成2的次方。

MBGD是训练神经网络时的常用方法,而且通常即使实际上使用的是MBGD,也会使用SGD这个词来代替。

选择一个好的学习率是非常困难的。太小的学习率导致收敛非常缓慢,而太大的学习率则会阻碍收敛,导致损失函数在最优点附近震荡甚至发散。相同的学习率被应用到所有参数更新中。如果我们的数据比较稀疏,特征有非常多不同的频率,那么此时我们可能并不想要以相同的程度更新他们,反而是对更少出现的特征给予更大的更新。为了能在学习期间自动调节学习率,根据先前定义好的一个规则来减小学习率,或者两次迭代之间目标函数的改变低于一个阈值的时候。然而这些规则和阈值也是需要在训练前定义好的,所以也不能做到自适应数据的特点

上图中,学习率设置过大,导致目标函数值沿着“山谷”周围大幅震荡,可能永远都到达不了最小值。

对于神经网络来说,另一个最小化高度非凸误差函数的关键挑战是避免陷入他们大量的次局部最优点(suboptimal)。事实上困难来自于鞍点而不是局部最优点,即损失函数在该点的一个维度上是上坡(slopesup),而在另一个维度上是下坡(slopesdown)。这些鞍点通常被一个具有相同误差的平面所包围,这使得对于SGD来说非常难于逃脱,因为在各个维度上梯度都趋近于0。

如图,鞍点得名于它的形状类似于马鞍。尽管它在x方向上是一个最小值点,但是它在另一个方向上是局部最大值点,并且,如果它沿着x方向变得更平坦的话,梯度下降会在x轴振荡并且不能继续根据y轴下降,这就会给我们一种已经收敛到最小值点的错觉。

为了抑制SGD的震荡,SGDM认为梯度下降过程可以加入惯性。可以简单理解为:当我们将一个小球从山上滚下来时,没有阻力的话,它的动量会越来越大,但是如果遇到了阻力,速度就会变小。SGDM全称是SGDwithmomentum,在SGD基础上引入了一阶动量:

$v_t=\gammav_{t-1}+\eta\nablaJ(\theta)$

SGD-M参数更新公式如下,其中η是学习率,J(θ)是当前参数的梯度

$\theta=\theta-v_t$

一阶动量是各个时刻梯度方向的指数移动平均值,也就是说,t时刻的下降方向,不仅由当前点的梯度方向决定,而且由此前累积的下降方向决定。γ的经验值为0.9,这就意味着下降方向主要是此前累积的下降方向,并略微偏向当前时刻的下降方向。想象高速公路上汽车转弯,在高速向前的同时略微偏向,急转弯可是要出事的。SGD震荡且缓慢的沿着沟壑的下坡方向朝着局部最优点前进,如下图:

momentum能够加速SGD方法,并且能够减少震荡,如下图:

特点

SGD还有一个问题是困在局部最优的沟壑里面震荡。想象一下你走到一个盆地,四周都是略高的小山,你觉得没有下坡的方向,那就只能待在这里了。可是如果你爬上高地,就会发现外面的世界还很广阔。因此,我们不能停留在当前位置去观察未来的方向,而要向前一步、多看一步、看远一些。

NAG全称NesterovAcceleratedGradient,是在SGD、SGD-M的基础上的进一步改进,我们知道在时刻t的主要下降方向是由累积动量决定的,自己的梯度方向说了也不算,那与其看当前梯度方向,不如先看看如果跟着累积动量走了一步,那个时候再怎么走。因此,NAG不计算当前位置的梯度方向,而是计算如果按照累积动量走了一步,那个时候的下降方向:

$v_t=\gammav_{t-1}+\eta\nabla_\thetaJ(\theta-\gammav_{t-1})$

NAG参数更新公式如下,其中η是学习率,$\nabla_\thetaJ(\theta-\gammav_{t-1})$是当前参数的梯度

然后用下一个点的梯度方向,与历史累积动量相结合,计算当前时刻的累积动量。

如上图,动量法首先计算当前梯度(图中的小蓝色向量),然后在更新累积梯度(updatedaccumulatedgradient)方向上大幅度的跳跃(图中的大蓝色向量)。与此不同的是,NAG首先在先前的累积梯度(previousaccumulatedgradient)方向上进行大幅度的跳跃(图中的棕色向量),评估这个梯度并做一下修正(图中的红色向量),这就构成一次完整的NAG更新(图中的绿色向量)。这种预期更新防止我们进行的太快,也带来了更高的相应速度,这在一些任务中非常有效的提升了RNN的性能。

SGD系列的都没有用到二阶动量。二阶动量的出现,才意味着“自适应学习率”优化算法时代的到来。SGD及其变种以同样的学习率更新每个参数,但深度神经网络往往包含大量的参数,这些参数并不是总会用得到。对于经常更新的参数,我们已经积累了大量关于它的知识,不希望被单个样本影响太大,希望学习速率慢一些;对于偶尔更新的参数,我们了解的信息太少,希望能从每个偶然出现的样本身上多学一些,即学习速率大一些。因此,Adagrad非常适用于稀疏数据。

Dean等人发现Adagrad能够大幅提高SGD的鲁棒性,并在Google用其训练大规模神经网络,这其中就包括在YouTube中学习识别猫。除此之外,Pennington等人用Adagrad来训练GloVe词嵌入,因为罕见的词汇需要比常见词更大的更新。

AdaGrad算法就是将每一个参数的每一次迭代的梯度取平方累加后在开方,用全局学习率除以这个数,作为学习率的动态更新。对于不同的参数动态的采取不同的学习率,让目标函数更快的收敛。为了简洁,我们用$g_t$来表示t时刻的梯度,$g_{t,i}$就是目标函数的偏导数:

$g_{t,i}=\nabla_{\theta}J(\theta_{t,i})$

SGD在在每个时刻t对参数$θi$的更新为:

$\theta_{t+1,i}=\theta_{t,i}-\eta\cdotg_{t,i}$

Adagrad修改了t时刻对于每个参数$θi$的学习率η:

$\theta_{t+1,i}=\theta_{t,i}-\dfrac{\eta}{\sqrt{G_{t,ii}+\epsilon}}\cdotg_{t,i}$

其中$G_t∈R_d×d$是对角矩阵,其中每一个对角元素i,i是$θi$在时刻t的梯度平方和,一般为了避免分母为0,会在分母上加一个小的平滑项,用符号表示,通常为108左右。因此$\sqrt{G_{t}+\epsilon}$恒大于0,而且参数更新越频繁,二阶动量越大,学习率就越小。有趣的是,如果去掉开方操作,算法性能会大幅下降

RMSProp算法(Hinton,2012)修改AdaGrad以在非凸情况下表现更好,它改变梯度累积为指数加权的移动平均值,从而丢弃距离较远的历史梯度信息。RMSProp与Adadelta的移动均值更新方式十分相似

$E[g^2]_{t}=0.9E[g^2]_{t-1}+0.1g_{t}^{2}$

RMSProp参数更新公式如下,其中η是学习率,$g_t$是当前参数的梯度

$\theta_{t+1}=\theta_t-\dfrac{\eta}{\sqrt{E[g^2]_t+\epsilon}}g_t$

RMSprop将学习速率除以梯度平方的指数衰减平均值。Hinton建议γ设置为0.9,默认学习率η为0.001

Adam最开始是由OpenAI的DiederikKingma和多伦多大学的JimmyBa提出的。Adam使用动量和自适应学习率来加快收敛速度。SGD-M在SGD基础上增加了一阶动量,AdaGrad和AdaDelta在SGD基础上增加了二阶动量(二阶矩估计)。把一阶动量和二阶动量都用起来,就是Adam了——Adaptive+Momentum。

$v_t=max(\beta_2\cdotv_{t-1}+(1-\beta_2)g_t^2,v_{t-1})\quad\text{}$

修正的方法。由于Adam中的学习率主要是由二阶动量控制的,为了保证算法的收敛,可以对二阶动量的变化进行控制,避免上下波动。

Adam可以被看作是融合了RMSProp和momentum,RMSprop贡献了历史平方梯度的指数衰减的平均值$v_t$,而动量则负责历史梯度的指数衰减平均值$m_t$,Nadam在Adam的基础上加入了一阶动量的累积,即Nesterov+Adam=Nadam,为了把NAG融入到Adam中,我们需要修改momentum的项$m_t$

AMSGrad在ICLR2018年被提出来,并获得了最佳论文。AMSGrad是一个随机梯度下降优化方法,它试图解决基于Adam的优化器的收敛问题。AMSGrad使用最大化过去平方梯度vt来更新参数,而不是使用指数平均,这样就降低了指数衰减平均,造成重要历史信息快速丢失的影响。

$\begin{array}{c}m_t=\beta_1m_{t-1}+(1-\beta_1)g_t\\v_t=\beta_2v_{t-1}+(1-\beta_2)g_t^2\end{array}$

上面的两个公式跟Adam是一样的,求的是一阶矩和二阶矩,$g_t$是当前参数的梯度,$β1$为一阶矩估计的指数衰减率,$β2$是二阶矩估计的指数衰减率,前者控制一阶矩估计,后者控制二阶矩估计。

$\hat{v}_t=max(\hat{v}_{t-1},v_t)$

上式求过去最大的平方梯度$v^t$,参数的更新公式如下:

$\theta_{t+1}=\theta_t-\dfrac{\eta}{\sqrt{\hat{v}_t}+\epsilon}m_t$

从上面的公式可以看出,参数更新公式与Adam没有啥区别,但是求$v^t$有区别。AMSGRAD不增加步长,避免了ADAM和RMSPROP算法的缺陷。

AdaBound算法训练速度比肩Adam,性能媲美SGD。SGD现在后期调优时还是经常使用到,但SGD的问题是前期收敛速度慢。SGD前期收敛慢的原因:SGD在更新参数时对各个维度上梯度的放缩是一致的,并且在训练数据分布极不均很时训练效果很差。而因为收敛慢的问题应运而生的自适应优化算法Adam、AdaGrad、RMSprop等,但这些自适应的优化算法虽然可以在训练早期展现出快速的收敛速度,但其在测试集上的表现却会很快陷入停滞,并最终被SGD超过。

L2正则化是减少过拟合的经典方法,它会向损失函数添加由模型所有权重的平方和组成的惩罚项,并乘上特定的超参数以控制惩罚力度。加入L2正则以后,损失函数就变为:

从上面的公式可以看出,AdamW本质上就是在损失函数里面加入了L2正则项,然后计算梯度和更新参数的时候都需要考虑这个正则项。AdamW使用在huggingface版的transformer中,BERT,XLNET,ELECTRA等主流的NLP模型,都是用了AdamW优化器

RAdam(RectifiedAdam)是Adam优化器的一个变体,它引入了一项来纠正自适应学习率的方差,试图解决Adam的收敛性差的问题。

Lookahead是一种梯度下降优化器,它迭代的更新两个权重集合,”fast”和”slow”。直观地说,该算法通过向前看由另一个优化器生成的快速权值序列来选择搜索方向。梯度下降的时候,走几步会退回来检查是否方向正确。避免突然掉入局部最低点。

Lookahead的算法描述如下:

它是由内循环优化器(inner-loop)生成的k次序列权重;这里的优化器就是原有的优化器,如SGD,Adam等均可;其优化方法与原优化器并没有区别,例如给定优化器A,目标函数L,当前训练mini-batch样本d,这里会将该轮循环的k次权重,用序列都保存下来。

在每轮内循环结束后,根据本轮的k次权重,计算等到SlowWeights;这里采用的是指数移动平均(exponentialmovingaverage,EMA)算法来计算,最终模型使用的参数也是慢更新(SlowWeights)那一套,因此快更新(FastWeights)相当于做了一系列实验,然后慢更新再根据实验结果选一个比较好的方向,这有点类似NesterovMomentum的思想。

THE END
1.法律规范作用的例子.docx篇一:法律规范作用的例子具体说来,法的规范作用包括:指引作用评价作用预测作用强制作用教育作用等。法的社会作用包括:经济作用政治作篇用二文化:作用法律社会规公共范事务作作用用等。的具体例.子2017联系方式:篇三:法律规范作用的例子考点名称:https://m.renrendoc.com/paper/293939613.html
2.3.Shell位置变量和参数用法详解,位置参数变量作用,$,#,*,$1,$2等详Shell位置变量和参数用法详解,位置参数变量作用,$,#,*,$1,$2等详解和例子友情链接MySQL性能优化_原理_实战1、MySQL在金融互联网行业的企业级安装部署目录章节 版本说明 版本说明 安装MySQL规范 1 安装方式2 安装用户3 目录规范 MySQL 5.7 安装部署 1 操作系统配置2 创建用户3 创建目录4 安装5 配置文件6 安装https://blog.csdn.net/wangzhicheng987/article/details/122428715
3.什么叫举例子说明方法举例子说明方法的作用什么叫举例子说明方法 举例子说明方法的作用 举例子说明方法:举例子又叫举例说明法,即举出实际事例来说明事物,使所要说明的事物具体化,以便读者理解。举例子是通过列举有代表性的、恰当的事例来说明事物特征的说明方法,为了说明事物的情况或事理。从道理上讲,人们不太理解,这就需要举些既通俗易懂又有代表性的例子http://www.chusan.com/zhongkao/259325.html
4.高中英语,现在分词和过去分词考查的重点及解题方法现在分词会考它的一般式、否定式(not/never+现在分词)、完成式(having done)、被动式(being done)和完成被动式(having been done)。举几个例子给同学们体会一下: 过去分词会考它的一般式(done)和将来式(to be done),它仅仅表示被动或完成的意思。例如: http://www.360doc.com/content/20/0922/12/61030737_937013120.shtml
5.反例在数学教学中的作用研究相对于具体的数学命题来说,数学中的反例是其实就是为了说明某个数学命题不成立而举出来的例子,它的作用就是可以有效且快速地对假命题进行否定。早在1970年就有心理学家表明:“反例携带了最适于辨别的关键信息”。美国教育心理学家布鲁纳也认为:“反例能预防做出‘仓促的判断’”。因此,反例在我们学习数学和研究数学https://www.fx361.com/page/2021/1118/9348675.shtml
6.吡啶衍生物其制备方法和用途的制作方法B环表示的吡啶环上取代基的优选例子包括(从作用的观点看)(1)卤素,(2)氰基,(3)氨基,(4)C1-10-酰基或1,3-二氧戊环-2-基,(5)羧基、氨甲酰基或低碳烷氧羰基,(6)低碳烷氧基,(7)低碳烷硫基,(8)低碳烃基,烃基非强制性被羟基、羟亚胺基、卤素或低碳烷氧基取代,(9)OR2基,R2代表H或羟基保护基。 这https://www.xjishu.com/zhuanli/26/94105244.html
7.举例子的作用是什么有哪些好处举出实际事例来说明事物,使所要说明的事物具体化,以便读者理解,这种说明方法叫举例子。 运用举事例的说明方法说明事物或事理,一要注意例子的代表性,二要注意例子的适量性。作用:使文章表达的意思更明确,读者更能理解,具体地说明了说明对象的特点。 1举例子的作用有哪些 http://m.gaosan.com/gaokao/819916.html