梯度下降算法是机器学习中使用非常广泛的优化算法,也是众多机器学习算法中最常用的优化方法。

机器学习最常用优化之一——梯度下降优化算法总述(常见的梯度优化算法)  Python 内存 技巧 第1张

梯度下降算法是机器学习中运用十分广泛的优化算法,也是许多机器学习算法中最常用的优化办法。简直当时每一个先进的(state-of-the-art)机器学习库或许深度学习库都会包括梯度下降算法的不同变种完成。可是,它们就像一个黑盒优化器,很难得到它们优缺陷的实践解说。这篇文章旨在供给梯度下降算法中的不同变种的介绍,协助运用者依据具体需求进行运用。

这篇文章首要介绍梯度下降算法的三种结构,然后介绍它们所存在的问题与应战,接着介绍一些怎么进行改善来处理这些问题,随后,介绍怎么在并行环境中或许散布式环境中运用梯度下降算法。***,指出一些有利于梯度下降的战略。

目录

三种梯度下降优化结构

批量梯度下降

随机梯度下降

小批量梯度下降

问题与应战

梯度下降优化算法

Momentum

Nesterov accelerated gradient

Adagrad

Adadelta

RMSprop

Adam

算法的可视化

挑选哪种优化算法?

并行与散布式SDG

Hogwild!

Downpour SGD

Delay-tolerant Algorithms for SGD

TensorFlow

Elastic Averaging SGD

更多的SDG优化战略

练习集随机洗牌与课程学习

批规范化

Early Stopping

Gradient noise

总结

引证

三种梯度下降优化结构

梯度下降算法是经过沿着方针函数J(θ)参数θ∈R的梯度(一阶导数)相反方向−∇θJ(θ)来不断更新模型参数来抵达方针函数的极小值点(收敛),更新步长为η。

有三种梯度下降算法结构,它们不同之处在于每次学习(更新模型参数)运用的样本个数,每次更新运用不同的样本会导致每次学习的准确性和学习时刻不同。

批量梯度下降(Batch gradient descent)

每次运用全量的练习集样原本更新模型参数,即: θ=θ−η⋅∇θJ(θ)

其代码如下:

机器学习最常用优化之一——梯度下降优化算法总述(常见的梯度优化算法)  Python 内存 技巧 第2张

epochs 是用户输入的***迭代次数。经过上诉代码能够看出,每次运用悉数练习集样本核算丢失函数 loss_function 的梯度 params_grad,然后运用学习速率 learning_rate 朝着梯度相反方向去更新模型的每个参数params。一般各现有的一些机器学习库都供给了梯度核算api。假如想自己亲手写代码核算,那么需求在程序调试进程中验证梯度核算是否正确。

批量梯度下降每次学习都运用整个练习集,因而其长处在于每次更新都会朝着正确的方向进行,***能够确保收敛于极值点(凸函数收敛于大局极值点,非凸函数或许会收敛于部分极值点),可是其缺陷在于每次学习时刻过长,而且假如练习集很大以至于需求耗费许多的内存,而且全量梯度下降不能进行在线模型参数更新。

随机梯度下降(Stochastic gradient descent)

随机梯度下降算法每次从练习会集随机挑选一个样原本进行学习,即: θ=θ−η⋅∇θJ(θ;xi;yi)

批量梯度下降算法每次都会运用悉数练习样本,因而这些核算是冗余的,由于每次都运用完全相同的样本集。而随机梯度下降算法每次只随机挑选一个样原本更新模型参数,因而每次的学习是十分快速的,而且能够进行在线更新。

其代码如下:

机器学习最常用优化之一——梯度下降优化算法总述(常见的梯度优化算法)  Python 内存 技巧 第3张

随机梯度下降***的缺陷在于每次更新或许并不会依照正确的方向进行,因而能够带来优化动摇(扰动),如下图:

机器学习最常用优化之一——梯度下降优化算法总述(常见的梯度优化算法)  Python 内存 技巧 第4张

图1 SGD扰动

不过从另一个方面来看,随机梯度下降所带来的动摇有个优点就是,关于相似盆区域域(即许多部分极小值点)那么这个动摇的特色或许会使得优化的方向从当时的部分极小值点跳到另一个更好的部分极小值点,这样便或许关于非凸函数,终究收敛于一个较好的部分极值点,乃至大局极值点。

由于动摇,因而会使得迭代次数(学习次数)增多,即收敛速度变慢。不过终究其会和全量梯度下降算法相同,具有相同的收敛性,即凸函数收敛于大局极值点,非凸丢失函数收敛于部分极值点。

小批量梯度下降(Mini-batch gradient descent)

Mini-batch 梯度下降归纳了 batch 梯度下降与 stochastic 梯度下降,在每次更新速度与更新次数中心获得一个平衡,其每次更新从练习会集随机挑选 m,m

  1. θ=θ−η⋅∇θJ(θ;xi:i+m;yi:i+m)

其代码如下:

机器学习最常用优化之一——梯度下降优化算法总述(常见的梯度优化算法)  Python 内存 技巧 第5张

相关于随机梯度下降,Mini-batch梯度下降下降了收敛动摇性,即下降了参数更新的方差,使得更新愈加安稳。相关于全量梯度下降,其进步了每次学习的速度。而且其不必忧虑内存瓶颈然后能够运用矩阵运算进行高效核算。一般来说每次更新随机挑选[50,256]个样本进行学习,可是也要依据具体问题而挑选,实践中能够进行屡次实验,挑选一个更新速度与更次次数都较合适的样本数。mini-batch梯度下降能够确保收敛性,常用于神经网络中。

问题与应战

尽管梯度下降算法作用很好,而且广泛运用,但一同其也存在一些应战与问题需求处理:

挑选一个合理的学习速率很难。假如学习速率过小,则会导致收敛速度很慢。假如学习速率过大,那么其会阻挠收敛,即在极值点邻近会振动。

学习速率调整(又称学习速率调度,Learning rate schedules)[11]企图在每次更新进程中,改动学习速率,如退火。一般运用某种事前设定的战略或许在每次迭代中衰减一个较小的阈值。不管哪种调整办法,都需求事前进行固定设置,这边便无法自适应每次学习的数据集特色[10]。

模型一切的参数每次更新都是运用相同的学习速率。假如数据特征是稀少的或许每个特征有着不同的取值核算特征与空间,那么便不能在每次更新中每个参数运用相同的学习速率,那些很少呈现的特征应该运用一个相对较大的学习速率。

关于非凸方针函数,简略堕入那些次优的部分极值点中,如在神经网路中。那么怎么避免呢。Dauphin[19]指出更严峻的问题不是部分极值点,而是鞍点。

梯度下降优化算法

下面将评论一些在深度学习社区中常常运用用来处理上诉问题的一些梯度优化办法,不过并不包括在高维数据中不可行的算法,如牛顿法。

Momentum

假如在峡谷区域(某些方向较另一些方向上峻峭得多,常见于部分极值点)[1],SGD会在这些当地邻近振动,然后导致收敛速度慢。这种情况下,动量(Momentum)便能够处理[2]。

动量在参数更新项中加上一次更新量(即动量项),即: νt=γνt−1+η ∇θJ(θ),θ=θ−νt

其间动量项超参数γ<1一般是小于等于0.9。

其作用如下图所示:

机器学习最常用优化之一——梯度下降优化算法总述(常见的梯度优化算法)  Python 内存 技巧 第6张

图2 没有动量
机器学习最常用优化之一——梯度下降优化算法总述(常见的梯度优化算法)  Python 内存 技巧 第7张

图3 加上动量

加上动量项就像从山顶滚下一个球,求往下滚的时分累积了前面的动量(动量不断添加),因而速度变得越来越快,直到抵达结尾。同理,在更新模型参数时,关于那些当时的梯度方向与上一次梯度方向相同的参数,那么进行加强,即这些方向上更快了;关于那些当时的梯度方向与上一次梯度方向不同的参数,那么进行削减,即这些方向上减慢了。因而能够获得更快的收敛速度与削减振动。

  1. Nesterovacceleratedgradient(NAG)

从山顶往下滚的球会盲目地挑选斜坡。更好的办法应该是在遇到歪斜向上之前应该减慢速度。

Nesterov accelerated gradient(NAG,涅斯捷罗夫梯度加快)不只添加了动量项,而且在核算参数的梯度时,在丢失函数中减去了动量项,即核算∇θJ(θ−γνt−1),这种办法预估了下一次参数地点的方位。即:

  1. νt=γνt−1+η⋅∇θJ(θ−γνt−1),θ=θ−νt

如下图所示:

机器学习最常用优化之一——梯度下降优化算法总述(常见的梯度优化算法)  Python 内存 技巧 第8张

图4 NAG更新

具体介绍能够拜见Ilya Sutskever的PhD论文[9]。假定动量因子参数γ=0.9,首要核算当时梯度项,如上图小蓝色向量,然后加上动量项,这样便得到了大的跳动,如上图大蓝色的向量。这就是只包括动量项的更新。而NAG首要来一个大的跳动(动量项),然后加上一个小的运用了动量核算的当时梯度(上图赤色向量)进行批改得到上图绿色的向量。这样能够阻挠过快更新来进步呼应性,如在RNNs中[8]。

经过上面的两种办法,能够做到每次学习进程中能够依据丢失函数的斜率做到自适应更新来加快SGD的收敛。下一步便需求对每个参数依据参数的重要性进行各自自适应更新。

Adagrad

Adagrad[3]也是一种依据梯度的优化算法,它能够对每个参数自适应不同的学习速率,对稀少特征,得到大的学习更新,对非稀少特征,得到较小的学习更新,因而该优化算法合适处理稀少特征数据。Dean等[4]发现Adagrad能够很好的进步SGD的鲁棒性,google便用起来练习大规模神经网络(看片识猫:recognize cats in Youtube videos)。Pennington等[5]在GloVe中便运用Adagrad来练习得到词向量(Word Embeddings), 频频呈现的单词赋予较小的更新,不常常呈现的单词则赋予较大的更新。

Adagrad首要优势在于它能够为每个参数自适应不同的学习速率,而一般的人工都是设定为0.01。一同其缺陷在于需求核算参数梯度序列平方和,而且学习速率趋势是不断衰减终究到达一个十分小的值。下文中的Adadelta就是用来处理该问题的。

Adam

Adaptive Moment Estimation (Adam) 也是一种不同参数自适应不同学习速率办法,与Adadelta与RMSprop差异在于,它核算前史梯度衰减办法不同,不运用前史平方衰减,其衰减办法相似动量,如下:

  1. mt=β1mt−1+(1−β1)gt
  2. vt=β2vt−1+(1−beta2)g2t

mt与vt分别是梯度的带权均匀和带权有偏方差,初始为0向量,Adam的作者发现他们倾向于0向量(挨近于0向量),特别是在衰减因子(衰减率)β1,β2挨近于1时。为了改善这个问题,

对mt与vt进行差错批改(bias-corrected):

  1. mt^=mt1−betat1
  2. vt^=vt1−betat2

终究,Adam的更新方程为:

  1. θt+1=θt−ηvt^−−√+ϵmt^

论文中主张默认值:β1=0.9,β2=0.999,ϵ=10−8。论文中将Adam与其它的几个自适应学习速率进行了比较,作用均要好。

算法的可视化

下面两幅图可视化形象地比较上述各优化办法,如图:

机器学习最常用优化之一——梯度下降优化算法总述(常见的梯度优化算法)  Python 内存 技巧 第9张

图5 SGD各优化办法在丢失曲面上的体现

从上图能够看出, Adagrad、Adadelta与RMSprop在丢失曲面上能够当即搬运到正确的移动方向上到达快速的收敛。而Momentum 与NAG会导致违背(off-track)。一同NAG能够在违背之后快速批改其道路,由于其依据梯度批改来进步呼应性。

机器学习最常用优化之一——梯度下降优化算法总述(常见的梯度优化算法)  Python 内存 技巧 第10张

图6 SGD各优化办法在丢失曲面鞍点处上的体现

从上图能够看出,在鞍点(saddle points)处(即某些维度上梯度为零,某些维度上梯度不为零),SGD、Momentum与NAG一直在鞍点梯度为零的方向上振动,很难打破鞍点方位的对称性;Adagrad、RMSprop与Adadelta能够很快地向梯度不为零的方向上搬运。

从上面两幅图能够看出,自适应学习速率办法(Adagrad、Adadelta、RMSprop与Adam)在这些场景下具有更好的收敛速度与收敛性。

怎么挑选SGD优化器

假如你的数据特征是稀少的,那么你***运用自适应学习速率SGD优化办法(Adagrad、Adadelta、RMSprop与Adam),由于你不需求在迭代进程中对学习速率进行人工调整。

RMSprop是Adagrad的一种扩展,与Adadelta相似,可是改善版的Adadelta运用RMS去自动更新学习速率,而且不需求设置初始学习速率。而Adam是在RMSprop基础上运用动量与差错批改。RMSprop、Adadelta与Adam在相似的景象下的体现差不多。Kingma[15]指出收益于差错批改,Adam略优于RMSprop,由于其在挨近收敛时梯度变得愈加稀少。因而,Adam或许是现在***的SGD优化办法。

风趣的是,最近许多论文都是运用原始的SGD梯度下降算法,而且运用简略的学习速率退火调整(无动量项)。现有的现已标明:SGD能够收敛于最小值点,可是相关于其他的SGD,它或许花费的时刻更长,而且依赖于鲁棒的初始值以及学习速率退火调整战略,而且简略堕入部分极小值点,乃至鞍点。因而,假如你介意收敛速度或许练习一个深度或许杂乱的网络,你应该挑选一个自适应学习速率的SGD优化办法。

并行与散布式SGD

假如你处理的数据集十分大,而且有机器集群能够运用,那么并行或散布式SGD是一个十分好的挑选,由于能够大大地进步速度。SGD算法的实质决议其是串行的(step-by-step)。因而怎么进行异步处理就是一个问题。尽管串行能够确保收敛,可是假如练习集大,速度就是一个瓶颈。假如进行异步更新,那么或许会导致不收敛。下面将评论怎么进行并行或散布式SGD,并行一般是指在同一机器上进行多核并行,散布式是指集群处理。

Hogwild

Niu[23]提出了被称为Hogwild的并行SGD办法。该办法在多个CPU时刻进行并行。处理器经过同享内存来访问参数,而且这些参数不进行加锁。它为每一个cpu分配不堆叠的一部分参数(分配互斥),每个cpu只更新其担任的参数。该办法只合适处理数据特征是稀少的。该办法简直能够到达一个***的收敛速度,由于cpu之间不会进行相同信息重写。

Downpour SGD

Downpour SGD是Dean[4]提出的在DistBelief(Google TensorFlow的前身)运用的SGD的一个异步变种。它在练习子集上练习一同多个模型副本。这些副本将各自的更新发送到参数服务器(PS,parameter server),每个参数服务器只更新互斥的一部分参数,副本之间不会进行通讯。因而或许会导致参数发散而不利于收敛。

Delay-tolerant Algorithms for SGD

McMahan与Streeter[12]扩展AdaGrad,经过开发推迟忍受算法(delay-tolerant algorithms),该算法不只自适应曩昔梯度,而且会更新推迟。该办法现已在实践中标明是有用的。

TensorFlow

TensorFlow[13]是Google开源的一个大规模机器学习库,它的前身是DistBelief。它现已在许多移动设备上或许大规模散布式集群中运用了,现现已过了实践查验。其散布式完成是依据图核算,它将图分割成多个子图,每个核算实体作为图中的一个核算节点,他们经过Rend/Receive来进行通讯。

  1. ElasticAveragingSGD

Zhang等[14]提出Elastic Averaging SGD(EASGD),它经过一个elastic force(存储参数的参数服务器中心)来衔接每个work来进行参数异步更新。

更多的SGD优化战略

接下来介绍更多的SGD优化战略来进一步进步SGD的功能。别的还有许多其它的优化战略,能够拜见[22]。

  1. ShufflingandCurriculumLearning

为了使得学习进程愈加无偏,应该在每次迭代中随机打乱练习会集的样本。

另一方面,在许多情况下,咱们是逐渐处理问题的,而将练习集依照某个有意义的顺序摆放会进步模型的功能和SGD的收敛性,怎么将练习集树立一个有意义的摆放被称为Curriculum Learning[16]。

Zaremba与Sutskever[17]在运用Curriculum Learning来练习LSTMs以处理一些简略的问题中,标明一个相结合的战略或许混合战略比对练习集依照依照练习难度进行递加排序要好。(表明不明白,衰)

  1. Batchnormalization

为了便利练习,咱们一般会对参数依照0均值1方差进行初始化,跟着不断练习,参数得到不同程度的更新,这样这些参数会失掉0均值1方差的散布特点,这样会下降练习速度和扩大参数改变跟着网络结构的加深。

Batch normalization[18]在每次mini-batch反向传达之后从头对参数进行0均值1方差标准化。这样能够运用更大的学习速率,以及花费更少的精力在参数初始化点上。Batch normalization充当着正则化、削减乃至消除去Dropout的必要性。

  1. Earlystopping

在验证集上假如接连的屡次迭代进程中丢失函数不再显著地下降,那么应该提前结束练习,具体拜见NIPS 2015 Tutorial slides,或许拜见避免过拟合的一些办法。

  1. Nesterovacceleratedgradient(NAG)
0

高斯差错的方差需求进行退火:

  1. Nesterovacceleratedgradient(NAG)
1

对梯度添加随机差错会添加模型的鲁棒性,即便初始参数值挑选地欠好,并合适对特别深层次的担任的网络进行练习。其原因在于添加随机噪声会有更多的或许性越过部分极值点并去寻觅一个更好的部分极值点,这种或许性在深层次的网络中更常见。

总结

在上文中,对梯度下降算法的三种结构进行了介绍,而且mini-batch梯度下降是运用最广泛的。随后,咱们要点介绍了SGD的一些优化办法:Momentum、NAG、Adagrad、Adadelta、RMSprop与Adam,以及一些异步SGD办法。***,介绍了一些进步SGD功能的其它优化主张,如:练习集随机洗牌与课程学习(shuffling and curriculum learning)、batch normalization、early stopping 与 Gradient noise。

期望这篇文章能给你供给一些关于怎么运用不同的梯度优化算法方面的辅导。假如还有更多的优化主张或办法还望我们提出来?或许你运用什么技巧和办法来更好地练习SGD能够一同沟通?Thanks。

转载请说明出处
知优网 » 机器学习最常用优化之一——梯度下降优化算法总述(常见的梯度优化算法)

发表评论

您需要后才能发表评论