Loading [MathJax]/jax/output/CommonHTML/fonts/TeX/AMS-Regular.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >【深度学习】一文搞定面试中的优化算法

【深度学习】一文搞定面试中的优化算法

作者头像
黄博的机器学习圈子
发布于 2021-07-07 07:24:54
发布于 2021-07-07 07:24:54
38700
代码可运行
举报
运行总次数:0
代码可运行

深度学习各类优化器

借用古代炼丹的一些名词,我们可以把训练模型中的数据比做炼丹药材,模型比做炼丹炉,火候比做优化器。那么我们知道,同样的药材同样的炼丹炉,但是火候不一样的话,炼出来的丹药千差万别,同样的对于深度学习中训练模型而言,有时候模型性能不好,也许不是数据或者模型本身的原因,而是优化器的原因。由此可见优化器对于深度学习来说是多么重要了,那么今天小编就带大家了解一些常见的优化器。

优化算法设计原理

深度学习中的优化算法采用的原理是梯度下降法,即最小化目标函数

,最优化的求解过程,首先求解目标函数的梯度

,然后将参数

向负梯度方向更新,

为学习率,表明梯度更新的步伐的大小,最优化的过程依赖的算法称为优化器,可以看出深度学习优化器的两个核心是梯度与学习率,前者决定参数更新的方向,后者决定参数的更新程度。

我们定义

为待优化的参数,

为目标函数,初始学习率为

。再进行一次梯度下降过程中优化算法的执行框架如下:

1、计算目标函数关于当前参数的梯度:

2、根据需要计算历史梯度的一阶和二阶动量:

3、计算当前时刻的下降梯度:

4、进行梯度下降更新

对于各种优化器而言,步骤

和步骤

都是一样的,主要差别是体现在步骤

和步骤

,下面我们就来具体讲解这些优化器的设计思路。

非自适应优化器

在优化过程中,学习率全程不变,或者按照一定的

随时间变化,称之为非自适应优化器,这类包括最常见的

(随机梯度下降法),带

、带

等。

1、

(

)

其梯度更新公式为:

在每次更新梯度的时候,采用整个训练集的数据来计算

对参数的梯度,所以计算起来非常慢,遇到很大量的数据集也会非常棘手,而且不能投入新数据实时更新模型。

2、

随机梯度下降法(

)

其梯度更新公式和

类似。

的梯度下降过程,类似于一个小球从山坡上滚下,它的前进方向只于当前山坡的最大倾斜方向一致(最大负梯度方向),每一个时刻的初速度为 0。梯度更新规则为: 每次更新时对一个

内每个样本进行梯度更新,这样使得网络更新参数速度很快。但是其缺点也很明显,因为

更新梯度非常频繁,会造成

会有严重的震荡,有可能在全局最小值处来回震荡跳出全局最优值。

3、

(

)

其实我们更多时候把

称之为

,其梯度更新公式和

类似。梯度更新规则为:

每一次利用一个

样本,即

个样本进行计算,这样它可以降低参数更新时的方差,收敛更稳定,另一方面可以充分地利用深度学习库中高度优化的矩阵操作来进行更有效的梯度计算。和

的区别是每一次循环梯度更新的时候不是使用每个样本,而是一个

内的

个样本。在下面文章中提到的

就指代这里的

更新时的梯度变化

优点:

1、虽然看起来在更新过程中

MSGD

cost
function

波动非常大,会走很多弯路,但是对梯度的要求很低(计算梯度快),而且对于引入噪声,大量的理论和实践工作证明,只要噪声不是特别大,

MSGD

都能很好地收敛。

2、应用大型数据集时,训练速度很快。比如每次从百万数据样本中,取几百个数据点,算一个

MSGD

梯度,更新一下模型参数。相比于标准梯度下降法的遍历全部样本,每输入一个样本更新一次参数,要快得多。

缺点:

1、不能保证很好的收敛性;

mini

-

batch

每次仅使用数据集中的一部分进行梯度下降,所以每次下降并不是严格按照朝最小方向下降,只是总体下降趋势是朝着最小方向,极度容易陷于局部最小值。

2、

lr

如果太小,收敛速度会很慢,如果太大,

loss
function

就会在极小值处不停地震荡甚至偏离。(有一种措施是先设定大一点的学习率,当两次迭代之间的变化低于某个阈值后,就减小

learning
rate

,不过这个阈值的设定需要提前写好,但这样的话就不能够适应数据集的特点)。

3、对于非凸函数,还要避免陷于局部极小值处,或者鞍点处,因为鞍点周围的梯度都接近于

0

MSGD

很容易被困在这里。在这里解释一下鞍点就是:一个光滑函数的鞍点邻域的曲线,曲面,或超曲面,都位于这点的切线的不同边。如下图

2

所示。

2

鞍点示意图

4、
SGDM

(带有

Momentum

动量的

SGD

)

为了解决在上面的优化算法中容易出现的问题,

SGDM

应用而生,在原有的

SGD

上加入了一阶动量,从直观理解就是加入了一个惯性,在坡度比较陡的地方,会有较大的惯性,下降的就会比较快;坡度平缓的地方,惯性较小,下降的会比较慢。

其梯度更新公式为:

vt=γvt1+ηθJ(θ)
θ=θvt
SGDM

通过加入

γvt1

,将其定义为动量,

γ

常用的值为

0.9

。使用动量后在梯度下降过程中可以使得梯度方向不变的方向上下降速度变快,梯度方向有所改变的方向上的下降速度变慢。在这里我们举一个比较贴近的例子:在原本的梯度下降中一直朝着一个方向去下降,而当遇到山沟的时候(也就是一个拐点),越过山沟此时就在另一边山坡,这个时候梯度方向是跟之前相反的,此时由于之前梯度大小的累加,在两个山坡间的变化就会被互相抵消掉,也就不会一直在两个山坡振荡,容易朝山沟向下走,也就是会减少震荡。

SGDM

的梯度更新时的状态如下图

3

所示,和图

1

相比,震荡明显减少。

3
SGDM

更新时的梯度变化

5、
NAG

(

Nesterov
accelerated
gradient

)

上面介绍的

SGDM

的每下降一步都是由前面下降方向的一个累积和当前点的梯度方向组合而成,但当刚好下降到拐点附近时,如果这个时候继续以这样的方式更新参数,我们会有一个较大的幅度越过拐点,即:模型遇到拐点不会自动减弱更新的幅度。NAG 针对上述问题对动量方法进行了改进,其表达式如下:

vt=γvt1+ηθJ(θγvt1)
θ=θvt
NAG

利用当前位置处先前的梯度值先做一个参数更新,然后在更新后的位置再求梯度,将此部分梯度跟之前累积下来的梯度值矢量相加,简单的说就是先根据之前累积的梯度方向模拟下一步参数更新后的值,然后将模拟后的位置处梯度替换动量方法中的当前位置梯度。那么这种方式为什么解决了之前说的那个问题呢?因为

NAG

有一个预测后一步位置梯度的步骤,所以当下降到拐点附近时,

NAG

预测到会跨过拐点,该项梯度就会对之前梯度有个修正,相当于阻止了其跨度太大。

4

如上图

4

所示,我们举个例子来简单示意一下

NAG

的更新原理,其中蓝色线表示

SGDM

方法,蓝色短线表示当前位置梯度更新,蓝色长线表示之前累积的梯度;第一个红色线表示用

NAG

算法预测下一步位置的梯度更新,第一条棕色线表示先前累积的梯度,其矢量相加结果(绿色线)就是参数更新的方向。

NAG

在更新梯度时的状态图如下图

5

所示,从图中可以看出,相对于

SGDM

SGD

NAG

表现出来的性能更好。

5
NAGM

更新时的梯度变化

自适应优化器

在优化过程中,学习率随着梯度自适应的变化,并尽可能去消除给定的全局学习率的影响,叫做自适应优化器,常见的包括

Adagrad

Adadelta

RMSprop

Adam

等。

1、
Adagrad
Adagrad

其实是对学习率进行了一个约束,对于经常更新的参数,我们已经积累了大量关于它的知识,不希望被单个样本影响太大,希望学习速率慢一些;对于偶尔更新的参数,我们了解的信息太少,希望能从每个偶然出现的样本身上多学一些,即学习速率大一些。而该方法中开始使用二阶动量,意味着“自适应学习率”优化算法时代的到来。

在这里我们说明一下二阶动量

Vt

的定义:它是用来度量参数历史更新频率的,二阶动量是迄今为止所有梯度值的平方和。

Adagrad

的表达式为:

mt=gt
Vt=ti=1gt2
θt+1=θtηmtVt

其中

gt

t

时刻参数梯度,下面来讲解为什么

adagrad

可以实现不同频率特征对其参数学习率改变。首先,我们看到二阶动量

Vt

,它是梯度平方累加和,对于训练数据少的特征,自然对应的参数更新就缓慢,也就是说他们的梯度变化平方累加和就会比较小,所以对应于上面参数更新方程中的学习速率就会变大,因而对于某个特征数据集少,相应参数更新速度就快。为了防止上述分母为

0

,所以往往添加一个平滑项参数

ϵ

,参数更新方程也就变成:

θt+1=θtηmtVt+ϵ

但是

adagrad

同样也有问题,就是其分母随着训练数增加,也会跟着增加,这样会导致学习速率越来越小,最终无限接近于

0

,从而无法有效更新参数。

2、
Adadelta

针对于

Adagrad

的缺点,

Adadelta

对二阶动量

Vt

进行了改进,和

Adagrad

相比,就是分母换成了过去的梯度平方的衰减平均值,这个分母相当于梯度的均方根值

RMS

(

root
mean
squared

)。其表达式如下:

mt=gt
Vg,t=γVg,t1+(1γ)gt2
VΔθ,t=γVΔθ,t1+(1γ)Δθt2
RMS[g]t=Vg,t+ϵ
RMS[Δθ]t=VΔθ,t+ϵ
θt+1=θtRMS[Δθ]t1RMS[g]tmt

其中对梯度的二阶动量变化为

RMS[g]t

;对变量的变化量的二阶动量为

RMS[Δθ]t

,并使用其将其替换学习率。通过

adadelta

优化算法,我们甚至可以不需要设置一个默认的学习率,因为在新的规则中已经移除了这项。

3、
RMSprop
RMSprop

Adadelta

都是为了解决

Adagrad

学习率急剧下降问题而被提出来的。

RMSprop

Adadelta

的计算公式非常相似,只不过在相同的时间内被独立的提出,其表达式为:

mt=gt
Vt=γVt1+(1γ)gt2
θt+1=θtηmtVt+ϵ

由此可以看出,

RMSprop

还需要自己手动设置一个初始的学习率

η

。作者建议将

ϵ

设置为 0.9,学习率

η

设置为 0.001。

4、
Adam

(

Adaptive
Moment
Estimation

)

Adam

算法是另一种计算每个参数的自适应学习率的方法。它是一种将动量

Momentum

RMSprop

结合起来的办法方法,同时引入了两个参数

β1

β2

,其表达式为:

其中

默认值为

默认值为

,

集合了动量和

两者的优点,从经验中表明

在实际中表现很好,同时与其他自适应学习算法相比,更有优势。

总结

我们来看一下上面几种优化算法在鞍点和等高线上的表现:

各个优化算法在鞍点处表现

各个优化算法在等高线表现

从图 6 和图 7 都可以看出,

几乎很快就找到了正确的方向并前进,收敛速度也相当快,而其它方法要么很慢,要么走了很多弯路才找到。

关于优化器如何选择的问题上,小编也综合网上的办法给出以下建议:

1、首先,各大算法孰优孰劣并无定论。如果是刚入门,优先考虑

+

或者

2、

等自适应学习率算法对于稀疏数据具有优势,且收敛速度很快;但精调参数的

往往能够取得更好的最终结果。

3、根据你的需求来选择——在模型设计实验过程中,要快速验证新模型的效果,可以先用

进行快速实验优化;在模型上线或者结果发布前,可以用精调的

系列优化算法进行模型的极致优化。

4、考虑不同算法的组合。先用

进行快速下降,而后再换到

系列优化算法进行充分的调优。

引用

  • https://www.jianshu.com/p/a63858bcf455
  • https://www.cnblogs.com/guoyaohua/p/8542554.html
  • https://blog.csdn.net/u013385018/article/details/92377371
  • https://blog.csdn.net/qq_42109740/article/details/105401197
  • https://blog.csdn.net/tsyccnh/article/details/76673073
代码语言:javascript
代码运行次数:0
运行
复制
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-07-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 机器学习初学者 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
深度学习中的优化算法总结
    深度学习中的优化问题通常指的是:寻找神经网络上的一组参数θ,它能显著地降低代价函数J(θ)。针对此类问题,研究人员提出了多种优化算法,Sebastian Ruder 在《An overview of gradient descent optimizationalgorithms》(链接:https://arxiv.org/pdf/1609.04747.pdf )这篇论文中列出了常用优化算法的比较。主要优化算法有:GD、SGD、Momentum、Adagrad、Adadelta、RMSProp、Adam。
用户1432189
2019/08/20
1K0
深度学习中的优化算法总结
【机器学习基础】 | 各种梯度下降优化算法回顾和总结
论文标题:An overview of gradient descent optimization algorithms 原文链接:https://arxiv.org/pdf/1609.04747.pdf Github:NLP相关Paper笔记和代码复现(https://github.com/DengBoCong/nlp-paper) 说明:阅读论文时进行相关思想、结构、优缺点,内容进行提炼和记录,论文和相关引用会标明出处,引用之处如有侵权,烦请告知删除。
统计学家
2021/10/11
1.6K0
深度学习基础入门篇[三]:优化策略梯度下降算法:SGD、MBGD、Momentum、Adam、AdamW
如果我们定义了一个机器学习模型,比如一个三层的神经网络,那么就需要使得这个模型能够尽可能拟合所提供的训练数据。但是我们如何评价模型对于数据的拟合是否足够呢?那就需要使用相应的指标来评价它的拟合程度,所使用到的函数就称为损失函数(Loss Function),当损失函数值下降,我们就认为模型在拟合的路上又前进了一步。最终模型对训练数据集拟合的最好的情况是在损失函数值最小的时候,在指定数据集上时,为损失函数的平均值最小的时候。
汀丶人工智能
2023/04/06
2K0
深度学习基础入门篇[三]:优化策略梯度下降算法:SGD、MBGD、Momentum、Adam、AdamW
[机器学习基础二] 深度学习优化器一览
Hello大家好,本期将和大家一起分享和讨论一下深度学习中的一个基础组件:Optimizer,也就是优化器。这是一个在炼丹过程中容易被忽视,但其实又非常重要的组件。接下来几分钟里,让我们重温优化器的发展和应用,希望对大家有所帮助。本期是机器学习基础三篇中的第二篇,希望大家多多支持~
朴素人工智能
2021/01/12
8440
[机器学习基础二] 深度学习优化器一览
梯度下降优化算法概述
感谢阅读「美图数据技术团队」的第 11 篇原创文章,关注我们持续获取美图最新数据技术动态。
美图数据技术团队
2018/09/18
8170
梯度下降优化算法概述
一文概览神经网络优化算法
机器学习的优化(目标),简单来说是:搜索模型的一组参数 w,它能显著地降低代价函数 J(w),该代价函数通常包括整个训练集上的性能评估(经验风险)和额外的正则化(结构风险)。与传统优化不同,它不是简单地根据数据的求解最优解,在大多数机器学习问题中,我们关注的是测试集(未知数据)上性能度量P的优化。
算法进阶
2022/06/02
1.1K0
一文概览神经网络优化算法
详述深度学习中优化算法的演变
深度学习典型代表是以神经网络为主的联结式算法,在深度学习问题中,通常会预先定义一个损失函数,并通过相应手段(即一些优化算法)使其损失最小化,以不断更新权值和偏移量,最后训练出一个泛化能力良好的模型。
用户7506105
2021/08/06
9340
机器学习-12:MachineLN之优化算法
其实很多时候应该审视一下自己,知道自己的不足和长处,然后静下来去做一些事情,只有真正静下来才能深下去,只有深下去了才能有所突破,不要被别人的脚步带跑,无论什么时候专而精更重要,同时我也知自己的不足,有点狂、有点浮躁、坚持自己观点喜欢争论、说话有时候伤人等等,但是我的优点也正在此(下面是05年9月份写的《自己-社会-机器学习》的一篇文章,虽然有点浮躁,但是值得我再去回顾):感觉自己成长了不少,不再抱怨,不再发脾气,不再那么要强,不再看重别人的眼光,更加注重自己的评价,开始接受一些事情,棱角开始慢慢圆滑,但是我了解自己,是绝不会消失,有些东西决不能随波逐流,社会锻炼了我们,最终也会将越来越好的自己放到社会中实践,这是一个无限循环的事情,最后的结果就是社会和我们都将越来越好,这也是一个漫长的过程,也需要充足的空间给我们释放,这就要看你的程序的时间复杂度和空间复杂度,这个好了,过程就会快一点,其实想一下,很多时候,我们就是在找一个最优解,但是社会的进步估计我们永远找到的也只能是局部最优了吧,也就是说在某个时间段我们尽最大可能想到的最好决策,至于全局最优解,这个问题还真是个无人能解的问题吧,马克思列宁提的共产主义可能就是我们最想要的那个损失函数的最小值,但是怎么能找到那个最适合的权重呢,来达到全局最优,值得思考?我们可能要像梯度下降那样了,慢慢的来调节权重,达到某阶段的最优,当然大神们都有自己的方法,这点不能否认,但是弯路是要走的,不如把眼光放长远,让我们一起期待。
MachineLP
2022/05/09
4280
机器学习-12:MachineLN之优化算法
机器学习中的最优化算法(全面总结)
对于几乎所有机器学习算法,无论是有监督学习、无监督学习,还是强化学习,最后一般都归结为求解最优化问题。因此,最优化方法在机器学习算法的推导与实现中占据中心地位。在这篇文章中,小编将对机器学习中所使用的优化算法做一个全面的总结,并理清它们直接的脉络关系,帮你从全局的高度来理解这一部分知识。
算法进阶
2023/08/28
6810
机器学习中的最优化算法(全面总结)
【收藏版】深度学习中的各种优化算法
说到优化算法,入门级必从SGD学起,老司机则会告诉你更好的还有AdaGrad / AdaDelta,或者直接无脑用Adam。可是看看学术界的最新paper,却发现一众大神还在用着入门级的SGD,最多加个Moment或者Nesterov ,还经常会黑一下Adam。比如 UC Berkeley的一篇论文就在Conclusion中写道:
zenRRan
2018/07/25
6790
【收藏版】深度学习中的各种优化算法
机器学习中的最优化算法总结
对于几乎所有机器学习算法,无论是有监督学习、无监督学习,还是强化学习,最后一般都归结为求解最优化问题。因此,最优化方法在机器学习算法的推导与实现中占据中心地位。在这篇文章中,SIGAI将对机器学习中所使用的优化算法做一个全面的总结,并理清它们直接的脉络关系,帮你从全局的高度来理解这一部分知识。
SIGAI学习与实践平台
2018/08/24
6.5K0
机器学习中的最优化算法总结
一文看懂各种神经网络优化算法:从梯度下降到Adam方法
王小新 编译自 Medium 量子位 出品 | 公众号 QbitAI 在调整模型更新权重和偏差参数的方式时,你是否考虑过哪种优化算法能使模型产生更好且更快的效果?应该用梯度下降,随机梯度下降,还是Adam方法? 这篇文章介绍了不同优化算法之间的主要区别,以及如何选择最佳的优化方法。 什么是优化算法? 优化算法的功能,是通过改善训练方式,来最小化(或最大化)损失函数E(x)。 模型内部有些参数,是用来计算测试集中目标值Y的真实值和预测值的偏差程度的,基于这些参数,就形成了损失函数E(x)。 比如说,权重(W)
量子位
2018/03/29
5.5K0
一文看懂各种神经网络优化算法:从梯度下降到Adam方法
深度学习三十问!一位算法工程师经历30+场CV面试后总结的常见问题合集(含答案)
作者灯会为21届中部985研究生,凭借自己整理的面经,去年在腾讯优图暑期实习,七月份将入职百度cv算法工程师。在去年灰飞烟灭的算法求职季中,经过30+场不同公司以及不同部门的面试中积累出了CV总复习系列,此为深度学习上篇。
昱良
2021/07/01
8880
深度学习三十问!一位算法工程师经历30+场CV面试后总结的常见问题合集(含答案)
梯度下降优化算法综述
本文翻译自Sebastian Ruder的“An overview of gradient descent optimization algoritms”,作者首先在其博客中发表了这篇文章,其博客地址为:An overview of gradient descent optimization algoritms,之后,作者将其整理完放在了arxiv中,其地址为:An overview of gradient descent optimization algoritms,在翻译的过程中以作者发布在Arxiv
felixzhao
2018/03/14
1.4K1
梯度下降优化算法综述
最全的机器学习中的优化算法介绍
在机器学习中,有很多的问题并没有解析形式的解,或者有解析形式的解但是计算量很大(譬如,超定问题的最小二乘解),对于此类问题,通常我们会选择采用一种迭代的优化方式进行求解。
大数据技术与机器学习
2021/04/01
1.1K0
最全的机器学习中的优化算法介绍
梯度下降法及优化算法
1 梯度下降法(Gradient Descent)1.1 批量梯度下降法(Batch Gradient Descent)1.2 随机梯度下降法(Stochastic Gradient Descent)1.3 mini-batch 梯度下降法(Mini-Batch Gradient Descent)1.4 存在的问题2 梯度下降优化算法2.1 Momentun动量梯度下降法2.2 Nesterov accelerated gradient(NAG)2.3 自适应学习率算法(Adagrad)2.4 均方根传递算法(Root Mean Square prop,RMSprop)2.5 自适应增量算法(Adadelta)2.6 适应性矩估计算法(Adam)
Minerva
2020/05/24
1.4K0
机器学习中的最优化算法总结
对于几乎所有机器学习算法,无论是有监督学习、无监督学习,还是强化学习,最后一般都归结为求解最优化问题。因此,最优化方法在机器学习算法的推导与实现中占据中心地位。在这篇文章中,SIGAI将对机器学习中所使用的优化算法做一个全面的总结,并理清它们直接的脉络关系,帮你从全局的高度来理解这一部分知识。
SIGAI学习与实践平台
2018/09/29
3.1K0
机器学习中的最优化算法总结
深度学习优化器总结
每次更新我们需要计算整个数据集的梯度,因此使用批量梯度下降进行优化时,计算速度很慢,而且对于不适合内存计算的数据将会非常棘手。批量梯度下降算法不允许我们实时更新模型。
用户1332428
2018/07/26
1.3K0
深度学习优化器总结
深度学习中的优化问题以及常用优化算法
在深度模型中我们通常需要设计一个模型的代价函数(或损失函数)来约束我们的训练过程,训练不是无目的的训练,而是朝着最小化代价函数的方向去训练的。本文主要讨论的就是这类特定的优化问题:寻找神经网络上一组参
YingJoy_
2018/03/21
1.6K0
深度学习中的优化问题以及常用优化算法
梯度下降法与优化算法
在机器学习和深度学习中,优化算法是训练模型的核心组成部分。优化算法用于调整模型的参数,以最小化损失函数,从而提高模型的预测准确性。梯度下降法(Gradient Descent)是最基本也是最常用的优化方法,但随着技术的发展,许多改进的优化算法应运而生,其中包括SGD(Stochastic Gradient Descent)、Adam等。本文将详细介绍梯度下降法及其变种,帮助你理解如何通过优化算法提升模型性能。
LucianaiB
2025/01/21
2140
推荐阅读
相关推荐
深度学习中的优化算法总结
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文