2019-09-11 15:04:46 LEILEI18A 阅读数 58
  • 玩转深度学习实战教程

    玩转深度学习视频培训课程,详细讲解深度学习的原理和利用深度学习框架TensorFlow进行项目实战。课程通过Kaggle竞赛平台的Titanic问题讲解TensorFlow的基本用法以及问题处理的常用技巧,讲解深度学习图像领域的卷积神经网络CNN和多个经典的网络架构、CNN的应用,讲解自然语言处理领域的RNN、LSTM以及它们的多种变种结构,构建语言模型和对话机器人,介绍损失函数和优化深度学习算法在TensorFlow中的实现。

    3188 人正在学习 去看看 王而川

                                       如何改进和优化深度学习方法?

1. 学术上

 

2. 工程上

    在训练集训练,再和训练集一起划分的测试集上测试,效果很好,但是实际测试效果很差,需要从多方面进行分析,然后才能改进。

    从 数据集情况/数据预处理方式/网络结构/损失函数/后处理等方面进行分析。

首先,分析数据集应用场景是否接近;是否数据集数量太少,导致过拟合;

然后,分析训练集是否足够多,包含更多的情况(颜色、视角、图片分辨率、图片质量等),包含情况越多,泛化性一般越好些;

然后,逐一分析一些典型图片,对比原始图片,标签对应图片,预测类别对应的图片,从颜色/视角/光亮度等对三者进行分析;

         判断是否为数据集的问题,无论是与不是,都要进一步分析数据预处理方式,要怎么预处理增加一些“情况”,增加亮度等。

 

其次,分析网络结构问题(后续更新这一步骤);

其次,分析后处理问题。

 

 

2018-03-15 17:24:29 u013498583 阅读数 286
  • 玩转深度学习实战教程

    玩转深度学习视频培训课程,详细讲解深度学习的原理和利用深度学习框架TensorFlow进行项目实战。课程通过Kaggle竞赛平台的Titanic问题讲解TensorFlow的基本用法以及问题处理的常用技巧,讲解深度学习图像领域的卷积神经网络CNN和多个经典的网络架构、CNN的应用,讲解自然语言处理领域的RNN、LSTM以及它们的多种变种结构,构建语言模型和对话机器人,介绍损失函数和优化深度学习算法在TensorFlow中的实现。

    3188 人正在学习 去看看 王而川

深度学习最全优化方法总结比较(SGD,Adagrad,Adadelta,Adam,Adamax,Nadam)

转载自:https://zhuanlan.zhihu.com/p/22252270

SGD
此处的SGD指mini-batch gradient descent,关于batch gradient descent, stochastic gradient descent, 以及 mini-batch gradient descent的具体区别就不细说了。现在的SGD一般都指mini-batch gradient descent。

SGD就是每一次迭代计算mini-batch的梯度,然后对参数进行更新,是最常见的优化方法了。即:

gt=θt1f(θt1)

Δθt=ηgt

其中,η是学习率,gt是梯度

SGD完全依赖于当前batch的梯度,所以\eta可理解为允许当前batch的梯度多大程度影响参数更新

缺点:(正因为有这些缺点才让这么多大神发展出了后续的各种算法)

选择合适的learning rate比较困难
- 对所有的参数更新使用同样的learning rate。对于稀疏数据或者特征,有时我们可能想更新快一些对于不经常出现的特征,对于常出现的特征更新慢一些,这时候SGD就不太能满足要求了

SGD容易收敛到局部最优,并且在某些情况下可能被困在鞍点【原来写的是“容易困于鞍点”,经查阅论文发现,其实在合适的初始化和step size的情况下,鞍点的影响并没这么大。感谢@冰橙的指正】

Momentum
momentum是模拟物理里动量的概念,积累之前的动量来替代真正的梯度。公式如下:

mt=μmt1+gt

Δθt=ηmt

其中,μ是动量因子

特点:

下降初期时,使用上一次参数更新,下降方向一致,乘上较大的μ能够进行很好的加速
下降中后期时,在局部最小值来回震荡的时候,gradient0μ使得更新幅度增大,跳出陷阱
在梯度改变方向的时候,μ能够减少更新

总而言之,momentum项能够在相关方向加速SGD,抑制振荡,从而加快收敛

Nesterov
nesterov项在梯度更新时做一个校正,避免前进太快,同时提高灵敏度。
将上一节中的公式展开可得:

Δθt=ημmt1ηgt

可以看出,mt1
并没有直接改变当前梯度gt,所以Nesterov的改进就是让之前的动量直接影响当前的动量。即:

gt=θt1f(θt1ημmt1)

mt=μmt1+gt

Δθt=ηmt

所以,加上nesterov项后,梯度在大的跳跃后,进行计算对当前梯度进行校正。如下图:

这里写图片描述

momentum首先计算一个梯度(短的蓝色向量),然后在加速更新梯度的方向进行一个大的跳跃(长的蓝色向量),nesterov项首先在之前加速的梯度方向进行一个大的跳跃(棕色向量),计算梯度然后进行校正(绿色梯向量)

其实,momentum项和nesterov项都是为了使梯度更新更加灵活,对不同情况有针对性。但是,人工设置一些学习率总还是有些生硬,接下来介绍几种自适应学习率的方法

Adagrad
Adagrad其实是对学习率进行了一个约束。即:

nt=nt1+gt2

Δθt=ηnt+ϵgt

此处,对gt从1到t进行一个递推形成一个约束项regularizer1r=1t(gr)2+ϵϵ用来保证分母非0

特点:

前期gt较小的时候, regularizer较大,能够放大梯度
后期gt较大的时候,regularizer较小,能够约束梯度
适合处理稀疏梯度

缺点:
由公式可以看出,仍依赖于人工设置一个全局学习率
η设置过大的话,会使regularizer过于敏感,对梯度的调节太大
中后期,分母上梯度平方的累加将会越来越大,使gradient\to0,使得训练提前结束

Adadelta
Adadelta是对Adagrad的扩展,最初方案依然是对学习率进行自适应约束,但是进行了计算上的简化。
Adagrad会累加之前所有的梯度平方,而Adadelta只累加固定大小的项,并且也不直接存储这些项,仅仅是近似计算对应的平均值。即:

nt=νnt1+(1ν)gt2

Δθt=ηnt+ϵgt

在此处Adadelta其实还是依赖于全局学习率的,但是作者做了一定处理,经过近似牛顿迭代法之后:

E|g2|t=ρE|g2|t1+(1ρ)gt2

Δxt=r=1t1ΔxrE|g2|t+ϵ

其中,E代表求期望。

此时,可以看出Adadelta已经不用依赖于全局学习率了。

特点:

训练初中期,加速效果不错,很快
训练后期,反复在局部最小值附近抖动

RMSprop
RMSprop可以算作Adadelta的一个特例:

ρ=0.5时,E|g2|t=ρE|g2|t1+(1ρ)gt2就变为了求梯度平方和的平均数。

如果再求根的话,就变成了RMS(均方根):

RMS|g|t=E|g2|t+ϵ
此时,这个RMS就可以作为学习率\eta的一个约束:

Δxt=ηRMS|g|tgt
特点:

其实RMSprop依然依赖于全局学习率
RMSprop算是Adagrad的一种发展,和Adadelta的变体,效果趋于二者之间
适合处理非平稳目标
- 对于RNN效果很好

Adam
Adam(Adaptive Moment Estimation)本质上是带有动量项的RMSprop,它利用梯度的一阶矩估计和二阶矩估计动态调整每个参数的学习率。Adam的优点主要在于经过偏置校正后,每一次迭代学习率都有个确定范围,使得参数比较平稳。公式如下:

mt=μmt1+(1μ)gt

nt=νnt1+(1ν)gt2

mt^=mt1μt

nt^=nt1νt

Δθt=mt^nt^+ϵη

其中,mtnt分别是对梯度的一阶矩估计和二阶矩估计,可以看作对期望E|gt|E|gt2|的估计;mt^nt^是对mtnt的校正,这样可以近似为对期望的无偏估计。
可以看出,直接对梯度的矩估计对内存没有额外的要求,而且可以根据梯度进行动态调整,而mt^nt^+ϵ对学习率形成一个动态约束,而且有明确的范围。

特点:

结合了Adagrad善于处理稀疏梯度和RMSprop善于处理非平稳目标的优点
对内存需求较小
为不同的参数计算不同的自适应学习率
也适用于大多非凸优化
- 适用于大数据集和高维空间

Adamax
Adamax是Adam的一种变体,此方法对学习率的上限提供了一个更简单的范围。公式上的变化如下:

nt=max(νnt1,|gt|)

Δx=mt^nt+ϵη

可以看出,Adamax学习率的边界范围更简单

Nadam
Nadam类似于带有Nesterov动量项的Adam。公式如下:

gt^=gt1Πi=1tμi

mt=μtmt1+(1μt)gt

mt^=mt1Πi=1t+1μi

nt=νnt1+(1ν)gt2

nt^=nt1νtmt¯=(1μt)gt^+μt+1mt^

Δθt=ηmt¯nt^+ϵ

可以看出,Nadam对学习率有了更强的约束,同时对梯度的更新也有更直接的影响。一般而言,在想使用带动量的RMSprop,或者Adam的地方,大多可以使用Nadam取得更好的效果。

经验之谈
对于稀疏数据,尽量使用学习率可自适应的优化方法,不用手动调节,而且最好采用默认值
SGD通常训练时间更长,但是在好的初始化和学习率调度方案的情况下,结果更可靠
如果在意更快的收敛,并且需要训练较深较复杂的网络时,推荐使用学习率自适应的优化方法。
Adadelta,RMSprop,Adam是比较相近的算法,在相似的情况下表现差不多。
在想使用带动量的RMSprop,或者Adam的地方,大多可以使用Nadam取得更好的效果

2017-01-03 12:51:43 yas12345678 阅读数 2338
  • 玩转深度学习实战教程

    玩转深度学习视频培训课程,详细讲解深度学习的原理和利用深度学习框架TensorFlow进行项目实战。课程通过Kaggle竞赛平台的Titanic问题讲解TensorFlow的基本用法以及问题处理的常用技巧,讲解深度学习图像领域的卷积神经网络CNN和多个经典的网络架构、CNN的应用,讲解自然语言处理领域的RNN、LSTM以及它们的多种变种结构,构建语言模型和对话机器人,介绍损失函数和优化深度学习算法在TensorFlow中的实现。

    3188 人正在学习 去看看 王而川

最近在看Google的Deep Learning一书,看到优化方法那一部分,正巧之前用tensorflow也是对那些优化方法一知半解的,所以看完后就整理了下放上来,主要是一阶的梯度法,包括SGD, Momentum, Nesterov Momentum, AdaGrad, RMSProp, Adam。 其中SGD,Momentum,Nesterov Momentum是手动指定学习速率的,而后面的AdaGrad, RMSProp, Adam,就能够自动调节学习速率. 
二阶的方法目前我水平太差,看不懂….就不放上来了。


BGD

即batch gradient descent. 在训练中,每一步迭代都使用训练集的所有内容. 也就是说,利用现有参数对训练集中的每一个输入生成一个估计输出yi^,然后跟实际输出yi比较,统计所有误差,求平均以后得到平均误差,以此来作为更新参数的依据.

具体实现: 
需要:学习速率 ϵ, 初始参数 θ 
每步迭代过程: 
1. 提取训练集中的所有内容{x1,,xn},以及相关的输出yi 
2. 计算梯度和误差并更新参数: 

g^+1nθiL(f(xi;θ),yi)θθϵg^

优点: 
由于每一步都利用了训练集中的所有数据,因此当损失函数达到最小值以后,能够保证此时计算出的梯度为0,换句话说,就是能够收敛.因此,使用BGD时不需要逐渐减小学习速率ϵk

缺点: 
由于每一步都要使用所有数据,因此随着数据集的增大,运行速度会越来越慢.


SGD

SGD全名 stochastic gradient descent, 即随机梯度下降。不过这里的SGD其实跟MBGD(minibatch gradient descent)是一个意思,即随机抽取一批样本,以此为根据来更新参数.

具体实现: 
需要:学习速率 ϵ, 初始参数 θ 
每步迭代过程: 
1. 从训练集中的随机抽取一批容量为m的样本{x1,,xm},以及相关的输出yi 
2. 计算梯度和误差并更新参数: 

g^+1mθiL(f(xi;θ),yi)θθϵg^

优点: 
训练速度快,对于很大的数据集,也能够以较快的速度收敛.

缺点: 
由于是抽取,因此不可避免的,得到的梯度肯定有误差.因此学习速率需要逐渐减小.否则模型无法收敛 
因为误差,所以每一次迭代的梯度受抽样的影响比较大,也就是说梯度含有比较大的噪声,不能很好的反映真实梯度.

学习速率该如何调整: 
那么这样一来,ϵ如何衰减就成了问题.如果要保证SGD收敛,应该满足如下两个要求: 

k=1ϵk=k=1ϵ2k<

而在实际操作中,一般是进行线性衰减: 
ϵk=(1α)ϵ0+αϵτα=kτ

其中ϵ0是初始学习率, ϵτ是最后一次迭代的学习率. τ自然代表迭代次数.一般来说,ϵτ 设为ϵ0的1%比较合适.而τ一般设为让训练集中的每个数据都输入模型上百次比较合适.那么初始学习率ϵ0怎么设置呢?书上说,你先用固定的学习速率迭代100次,找出效果最好的学习速率,然后ϵ0设为比它大一点就可以了.


Momentum

上面的SGD有个问题,就是每次迭代计算的梯度含有比较大的噪音. 而Momentum方法可以比较好的缓解这个问题,尤其是在面对小而连续的梯度但是含有很多噪声的时候,可以很好的加速学习.Momentum借用了物理中的动量概念,即前几次的梯度也会参与运算.为了表示动量,引入了一个新的变量v(velocity).v是之前的梯度的累加,但是每回合都有一定的衰减.

具体实现: 
需要:学习速率 ϵ, 初始参数 θ, 初始速率v, 动量衰减参数α 
每步迭代过程: 
1. 从训练集中的随机抽取一批容量为m的样本{x1,,xm},以及相关的输出yi 
2. 计算梯度和误差,并更新速度v和参数θ

g^+1mθiL(f(xi;θ),yi)vαvϵg^θθ+v

其中参数α表示每回合速率v的衰减程度.同时也可以推断得到,如果每次迭代得到的梯度都是g,那么最后得到的v的稳定值为 

ϵg1α

也就是说,Momentum最好情况下能够将学习速率加速11α倍.一般α的取值有0.5,0.9,0.99这几种.当然,也可以让α的值随着时间而变化,一开始小点,后来再加大.不过这样一来,又会引进新的参数.

特点: 
前后梯度方向一致时,能够加速学习 
前后梯度方向不一致时,能够抑制震荡


Nesterov Momentum

这是对之前的Momentum的一种改进,大概思路就是,先对参数进行估计,然后使用估计后的参数来计算误差

具体实现: 
需要:学习速率 ϵ, 初始参数 θ, 初始速率v, 动量衰减参数α 
每步迭代过程: 
1. 从训练集中的随机抽取一批容量为m的样本{x1,,xm},以及相关的输出yi 
2. 计算梯度和误差,并更新速度v和参数θ

g^+1mθiL(f(xi;θ+αv),yi)vαvϵg^θθ+v

注意在估算g^的时候,参数变成了θ+αv而不是之前的θ


AdaGrad

AdaGrad可以自动变更学习速率,只是需要设定一个全局的学习速率ϵ,但是这并非是实际学习速率,实际的速率是与以往参数的模之和的开方成反比的.也许说起来有点绕口,不过用公式来表示就直白的多: 

ϵn=ϵδ+n1i=1gigi

其中δ是一个很小的常亮,大概在107,防止出现除以0的情况.

具体实现: 
需要:全局学习速率 ϵ, 初始参数 θ, 数值稳定量δ 
中间变量: 梯度累计量r(初始化为0) 
每步迭代过程: 
1. 从训练集中的随机抽取一批容量为m的样本{x1,,xm},以及相关的输出yi 
2. 计算梯度和误差,更新r,再根据r和梯度计算参数更新量 

g^+1mθiL(f(xi;θ),yi)rr+g^g^θ=ϵδ+rg^θθ+θ

优点: 
能够实现学习率的自动更改。如果这次梯度大,那么学习速率衰减的就快一些;如果这次梯度小,那么学习速率衰减的就满一些。

缺点: 
任然要设置一个变量ϵ 
经验表明,在普通算法中也许效果不错,但在深度学习中,深度过深时会造成训练提前结束。


RMSProp

RMSProp通过引入一个衰减系数,让r每回合都衰减一定比例,类似于Momentum中的做法。

具体实现: 
需要:全局学习速率 ϵ, 初始参数 θ, 数值稳定量δ,衰减速率ρ 
中间变量: 梯度累计量r(初始化为0) 
每步迭代过程: 
1. 从训练集中的随机抽取一批容量为m的样本{x1,,xm},以及相关的输出yi 
2. 计算梯度和误差,更新r,再根据r和梯度计算参数更新量 

g^+1mθiL(f(xi;θ),yi)rρr+(1ρ)g^g^θ=ϵδ+rg^θθ+θ

优点: 
相比于AdaGrad,这种方法很好的解决了深度学习中过早结束的问题 
适合处理非平稳目标,对于RNN效果很好

缺点: 
又引入了新的超参,衰减系数ρ 
依然依赖于全局学习速率


RMSProp with Nesterov Momentum

当然,也有将RMSProp和Nesterov Momentum结合起来的

具体实现: 
需要:全局学习速率 ϵ, 初始参数 θ, 初始速率v,动量衰减系数α, 梯度累计量衰减速率ρ 
中间变量: 梯度累计量r(初始化为0) 
每步迭代过程: 
1. 从训练集中的随机抽取一批容量为m的样本{x1,,xm},以及相关的输出yi 
2. 计算梯度和误差,更新r,再根据r和梯度计算参数更新量 

θ~θ+αvg^+1mθ~iL(f(xi;θ~),yi)rρr+(1ρ)g^g^vαvϵrg^θθ+v


Adam

Adam(Adaptive Moment Estimation)本质上是带有动量项的RMSprop,它利用梯度的一阶矩估计和二阶矩估计动态调整每个参数的学习率。Adam的优点主要在于经过偏置校正后,每一次迭代学习率都有个确定范围,使得参数比较平稳。

具体实现: 
需要:步进值 ϵ, 初始参数 θ, 数值稳定量δ,一阶动量衰减系数ρ1, 二阶动量衰减系数ρ2 
其中几个取值一般为:δ=108,ρ1=0.9,ρ2=0.999 
中间变量:一阶动量s,二阶动量r,都初始化为0 
每步迭代过程: 
1. 从训练集中的随机抽取一批容量为m的样本{x1,,xm},以及相关的输出yi 
2. 计算梯度和误差,更新r和s,再根据r和s以及梯度计算参数更新量 

g+1mθiL(f(xi;θ),yi)sρ1s+(1ρ1)grρ2r+(1ρ2)ggs^s1ρ1r^r1ρ2θ=ϵs^r^+δθθ+θ
2020-02-23 13:16:33 l_yiyu 阅读数 263
  • 玩转深度学习实战教程

    玩转深度学习视频培训课程,详细讲解深度学习的原理和利用深度学习框架TensorFlow进行项目实战。课程通过Kaggle竞赛平台的Titanic问题讲解TensorFlow的基本用法以及问题处理的常用技巧,讲解深度学习图像领域的卷积神经网络CNN和多个经典的网络架构、CNN的应用,讲解自然语言处理领域的RNN、LSTM以及它们的多种变种结构,构建语言模型和对话机器人,介绍损失函数和优化深度学习算法在TensorFlow中的实现。

    3188 人正在学习 去看看 王而川

优化与深度学习

1.优化与估计

尽管优化方法可以最小化深度学习中的损失函数值,但本质上优化方法达到的目标与深度学习的目标并不相同。

  • 优化方法目标:训练集损失函数值
  • 深度学习目标:测试集损失函数值(泛化性)

 

2.优化在深度学习中的挑战

  1. 局部最小值
  2. 鞍点
  3. 梯度消失

2.1局部最小值

对于目标函数f(x),如果f(x)在x上的值比在x邻近的其他点更小,那么f(x)可能是一个局部最小值。

如果f(x)在x上的值是目标函数在整个定义域上的最小值,那么f(x)是全局最小值。

举例:

我们可以⼤致找出该函数的局部最小值和全局最小值的位置。需要注意的是,图中箭头所指⽰的 只是⼤致位置。 

深度学习模型的⽬标函数可能有若⼲局部最优值。当⼀个优化问题的数值解在局部最优解附近 时,由于⽬标函数有关解的梯度接近或变成零,最终迭代求得的数值解可能只令⽬标函数局部最 小化而⾮全局最小化。 

2.2 鞍点

刚刚我们提到,梯度接近或变成零可能是由于当前解在局部最优解附近所造成的。事实上,另⼀ 种可能性是当前解在鞍点(saddlepoint)附近。

举个例⼦:

我们可以找出该函数的鞍点位置。 

再举个定义在⼆维空间的函数的例⼦,例如 :

我们可以找出该函数的鞍点位置。也许你已经发现了,该函数看起来像⼀个⻢鞍,而鞍点恰好是 ⻢鞍上可坐区域的中⼼。 

在上图的鞍点位置,⽬标函数在x轴⽅向上是局部最小值,而在y轴⽅向上是局部最⼤值。

假设⼀个函数的输⼊为k维向量,输出为标量,那么它的⿊塞矩阵(Hessianmatrix)有k个特 征值(参⻅“数学基础”⼀节)。该函数在梯度为零的位置上可能是局部最小值、局部最⼤值或者 鞍点:

• 当函数的⿊塞矩阵在梯度为零的位置上的特征值全为正时,该函数得到局部最小值。

• 当函数的⿊塞矩阵在梯度为零的位置上的特征值全为负时,该函数得到局部最⼤值。

• 当函数的⿊塞矩阵在梯度为零的位置上的特征值有正有负时,该函数得到鞍点。

随机矩阵理论告诉我们,对于⼀个⼤的⾼斯随机矩阵来说,任⼀特征值是正或者是负的概率都是 0.5[1]。那么,以上第⼀种情况的概率为0.5k。由于深度学习模型参数通常都是⾼维的(k很⼤), ⽬标函数的鞍点通常⽐局部最小值更常⻅。

深度学习中,虽然找到⽬标函数的全局最优解很难,但这并⾮必要。我们将在本章接下来的小节 中逐⼀介绍深度学习中常⽤的优化算法,它们在很多实际问题中都训练出了⼗分有效的深度学习 模型。 

小结:

• 由于优化算法的⽬标函数通常是⼀个基于训练数据集的损失函数,优化的⽬标在于降低训 练误差。

• 由于深度学习模型参数通常都是⾼维的,⽬标函数的鞍点通常⽐局部最小值更常⻅。
 

2019-07-23 22:07:22 weixin_39853245 阅读数 76
  • 玩转深度学习实战教程

    玩转深度学习视频培训课程,详细讲解深度学习的原理和利用深度学习框架TensorFlow进行项目实战。课程通过Kaggle竞赛平台的Titanic问题讲解TensorFlow的基本用法以及问题处理的常用技巧,讲解深度学习图像领域的卷积神经网络CNN和多个经典的网络架构、CNN的应用,讲解自然语言处理领域的RNN、LSTM以及它们的多种变种结构,构建语言模型和对话机器人,介绍损失函数和优化深度学习算法在TensorFlow中的实现。

    3188 人正在学习 去看看 王而川

随机梯度下降SGD:

梯度下降算法(Gradient Descent Optimization)是神经网络模型训练最常用的优化算法:
在这里插入图片描述
缺点:

  • 选择合适的learning rate比较困难:如果数据是稀疏的,我们会想对出现频率低的特征进行快一点的更新,而高频的进行慢一点的更新,这时候SGD就不太能满足要求了
  • SGD容易收敛到局部最优,并且极容易被困在鞍点上,在这种点所有反向上的梯度值都为0(如果设置合适的初始化和step size,鞍点的影响会减少很多)

Momentum:

Momentum是模拟物理里动量的概念,即,前几次的梯度也会参与到运算中,因此:
它可以有效的解决模型陷入鞍点的问题
而且它在前后梯度方向一致时,能够加速学习;在前后方向不一致时,能够抑制震荡
在这里插入图片描述

Nesterov Accelerated Gradient

Nesterov Accelerated Gradient是动量梯度下降算法的改进版本,其速度更快
其可以解释为往标准动量方法中添加了一个校正因子:
在这里插入图片描述

AdaGrad

在训练模型时,我们会想对出现频率低的特征进行快一点的更新,而高频的进行慢一点的更新,而上述方法所有参数的学习率都是统一的,并不能满足我们的要求。因此,自适应学习率算法AdaGrad提出了
在这里插入图片描述
在训练迭代的过程中,其学习速率是逐渐衰减的,经常更新的参数其学习速率衰减更快,因此非常易于稀疏数据的训练

缺点:在深度学习中,深度过深时或者某次迭代时梯度过大会使r的值变的非常大,会造成训练的提前结束

RMSProp

RMSprop是对Adagrad算法的改进,其实思路很简单,引入一个衰减系数,让梯度平方的累计量r 每回合都衰减一定比例。该方法主要是解决训练提前结束的问题,适合处理非平稳目标,对RNN的效果特别好。
在这里插入图片描述

Adam

自适应矩估计(Adaptive moment estimation,Adam)本质上是带有动量项的RMSprop,其结合了Momentum和RMSprop算法的思想。它利用梯度的一阶矩估计 和 二阶矩估计 动态调整每个参数的学习率:
在这里插入图片描述
其中ρ1,ρ2的建议值分别为0.9和0.999。

各种梯度下降算法的比较

在这里插入图片描述
左边: 在MNIST上训练多层神经网络
右边: 在CIFAR10上训练多层卷积网络

总结:

  • 对于稀疏数据,优先选择学习速率自适应的算法如RMSprop和Adam算法,而且最好采用默认值,大部分情况下其效果是较好的
  • 论文中通常采用不用momentum的SGD。SGD通常训练时间更长,容易陷入鞍点,但是在好的初始化和学习率调度方案的情况下,结果更可靠。
  • 在国际顶尖期刊的优化方法中:SGD和momentum的更新方法常用于CNN之类的网络结构;而自适应学习率算法的优化方法常用于RNN之类的网络结构。
  • Adadelta,RMSprop,Adam是比较相近的算法,通常Adam是最好的选择。
没有更多推荐了,返回首页