深度学习基础入门篇[三]:优化策略梯度下降算法: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.自适应学习率算法:智能调整学习步伐传统的梯度下降法通常采用固定的学习率,但这在实际应用中往往会遇到一些问题。例如,学习率过大可能导致模型震荡,无法收敛到最优解;而学习率过小则会导致收敛速度过慢,训练时间过长。为了解决这些问题,研究人员提出了自适应学习率算法,它能够根据训练过程中的信息动态调整学习率,从而提高模型的训练效率和性能。 https://download.csdn.net/blog/column/12592623/138250357
2.什么是自适应学习自适应学习简介自适应学习(adaptive learning)是一种基于学习者的个体差异和学习需求,为每个学习者提供定制化的学习内容和学习路径的学习方式。自适应学习通常使用人工智能、机器学习、数据挖掘等技术,通过对学习者的学习行为和反馈数据的分析,为学习者提供个性化的学习内容和学习路径,以提高学习效果和学习满意度。 https://cloud.tencent.com/developer/techpedia/1763
3.自适应学习率算法(六)自适应学习率算法51CTO博客Delta-bar-delta算法是一个早期的在训练时适应模型参数各自学习率的启发方式。该方法基于一个很简单的想法,如果损失对于某个给定模型参数的偏导数保持相同的符号,那么学习率应该增加。如果对于该参数的偏导变化了符号,那么学习率应该更小。最近,提出了一些增量(或者基于小批量)的算法来自适应模型参数的学习率。 https://blog.51cto.com/u_13977270/3398969
4.深度学习常用优化器——自适应学习率算法上一篇说了一下改进梯度的最优化算法,下面说一下自适应学习率算法,以及两者的结合。自适应学习率算法主要是相对不同参数和训练的不同阶段有不同的学习率。 1.自适应学习率算法 —— AdaGrad AdaGrad应该是Adaptive Gradient的缩写,是怎么个适应法呢,就是每个参数都有自己的学习率,这里的学习率是和每个参数的梯度相https://www.jianshu.com/p/dfeba2ac6559
5.自适应算法在网络学习系统的应用研究AET摘要: 随着现代信息技术与教育产业的深度融合,建设远程开放式的网络学习平台已成为构建智慧校园网的核心;同时也为构建学习型社会,实现终身教育提供了环境支撑和技术保障。主要着手于自适应算法研究,以网络学习者为对象,针对网络学习平台中存在的问题,设想将自适应算法引入到网络学习平台中,设计一个包含自适应网络学习模型http://www.chinaaet.com/article/3000015389
6.基于自适应LASSO先验的稀疏贝叶斯学习算法其中,∥·∥1表示?1范数.凸优化问题 (3)可以通过LASSO 算法进行求解,但是LASSO 算法不能一定保证收敛,为提高算法性能,Zou 在文献[20]中对LASSO 算法进行了改进,提出了自适应LASSO算法,并对该算法的Oracle 特性进行了证明1Oracle 特性具体包括模型选择相和性和参数估计渐进正态性.其含义为,在一些变量不是提前已https://www.fx361.com/page/2022/0618/14396851.shtml
7.工业过程故障检测自适应流形学习算法研究及应用针对这些问题,基于现有研究基础,本文提出一种自适应流形学习算法用于工业过程故障检测领域,并进行实例仿真来验证该方法的有效性和可行性。(1)介绍了本文研究背景和意义,对工业过程故障检测领域的主要研究内容和现状进行描述。根据实际工业过程中变量数据存在的特性,剖析了现有故障检测方法的局限性,阐述了流形学习方法在故障https://cdmd.cnki.com.cn/Article/CDMD-10673-1018250920.htm
8.[多智能体强化学习笔记]CM3:合作式多目标多阶段多智能体强化学习为了应对这两个挑战,我们将问题重组为一个新的两阶段问题,在学习多智能体合作之前先学习单智能体目标的实现,并推导出一个新的多目标多智能体策略梯度,该梯度具有局部信用分配的信用函数。 完整的体系结构称为CM3,在三个具有挑战性的多目标多智能体问题上,其学习速度明显快于现有算法的直接适应:困难编队中的合作导航https://zhuanlan.zhihu.com/p/451200587
9.检测区域自适应调整的TLD多目标跟踪算法1 DKF检测区域自适应调整检测算法 TLD算法的运行速度虽然优于一般在线学习方法, 但其检测器要对每一帧的整幅图像的所有子窗口进行检索, 由于子窗口过多, 而绝大部分子窗口并不包含真正的跟踪目标, 所以对这些子窗口内的图像块进行检测会浪费大量运算时间, 严重影响目标跟踪的实时性.因此, 提出一种检测区域可动态https://xuebao.neu.edu.cn/natural/article/html/2017-2-214.htm
10.自适应学习是「忽悠」还是「突破」?我们和专注其中的公司聊了聊极在国外,自适应学习并不是个新鲜概念,相反,其是在上世纪七十年代随着人工智能的概念逐渐为人熟知。难怪王枫说,自适应学习就是人工智能在教育里的深度应用。根据维基百科的解释,自适应学习,也称为自适应教育,是一种教育方法,它使用计算机算法来协调与学习者的交互,并提供定制的资源和学习活动,以满足每个学习者的个性化https://www.geekpark.net/news/232390
11.增强型DeepLab算法和自适应损失函数的高分辨率遥感影像分类注册 登录 English Version 论文 图片 资讯 高级检索 首页 关于本刊 期刊在线 特色资源 写作指南 投稿须知 下载中心 期刊征订 联系我们 遥感智能解译 | 浏览量 : 0 下载量: 737 CSCD: 4 更多指标 PDF 导出 分享 收藏 专辑 增强型DeepLab算法和自适应损失函数的高分辨率遥感影像分类 Classification of high-https://www.ygxb.ac.cn/zh/article/doi/10.11834/jrs.20209200/
12.学习报告:一种基于能量的领域适应的主动学习方法所有的方法都是基于 pytorch 实现的, 使用了 ResNet 模型在 ImageeNet 上进行训练。同时比较了主动学习算法、主动领域自适应算法和域自适应算法。 图2 1. 主要结果 VisDA-2017 在VisDA-2017上标注预算为5% 的不同方法的实验结果列于表1的第一栏,证明 EADA 优于所有的基线。随机选取样本的性能优于 ResNet,https://www.scholat.com/teamwork/teamwork/showPostMessage.html?id=10971
13.科学网—随机梯度下降算法研究进展图4学习率对优化过程的影响 本文对近年来随机梯度下降算法的研究进展及主要研究成果进行了综述.根据算法的更新策略,将几种具有代表性的随机梯度下降算法分为四类,包括基于动量的算法、基于方差缩减的算法、基于增量梯度的算法以及自适应学习率的算法.本文介绍了这些算法的原理、核心思想以及相互之间的区别与联系,并通过数https://blog.sciencenet.cn/blog-3291369-1348385.html