本文介绍常见的一阶数值优化算法,这些方法在现代神经网络框架(tensorflow, caffe, torch)中已经是标准配置。

问题

设系统参数为ω。对于样本i,其代价函数为Qi(ω)。在n个样本组成的训练集上,其整体代价函数为:

Q(ω)=∑i=1nQi(ω)

要求ω使得上式最小,由于没有闭式解,需要通过近似迭代逐步逼近。

基础一阶优化

GD

GD(Gradient Descent)以η为学习率,在每次迭代中用一阶泰勒展开近似:

ωt+1=ωt?η?Q(ω)

将求和与梯度互换。GD方法的增量来源于对所有样本同时求梯度之和:

ωt+1=ωt?ηi=1n?Qi(ω)

ω的维度为D,代价函数Q是个标量,减号后的梯度也是一个D维向量。

SGD

SGD(Stochastic Gradient Descent)在每次迭代中,顺次使用每个样本的梯度,更新参数:

for i=1 to n

ωt+1=ωt?η?Qi(ω)

一种折衷的方法是,把m个样本组成一个mini-batch,使用mini-batch的总梯度更新参数:

for i=1 to n/m

ωt+1=ωt?ηj=1m?Qij(ω)

其中Qij(ω)为第i个minibatch中第j个样本的代价。

为书写简便,以下说明中不再出现样本序号i。?Q(ω)可以指一个样本、一个mini-batch或者全部样本的梯度只和。

更快的一阶优化

这些方法都以GD为基础,但收敛速度更快,换句话说?t更小。 
关于收敛速度的意义,请参看这篇博客。

ASGD

ASGD(Average Stochastic Gradient Descent)选择一个迭代的时间点(代数)t0,在这个时间点之前,和SGD一样:

ωˉt=ωt

在这个时间点之后,使用t0到当前时刻t的平均值:

ωˉt=1t?t0+1∑τ=t0tωτ

AdaGrad

AdaGrad1(Adaptive Gradient)方法对参数的每一维进行归一化,使用的分母是之前步骤中该维度的平方和:

ωdt+1=ωdt?η1∑t?1τ=1[?Q(ωt)d]2??????????????√?Q(ωt)

相当于 为每一维参数设定了不同的学习率 :压制常常变化的参数,突出稀缺的更新。能够更有效地利用少量有意义样本。

AdaDelta

AdaDelta2(Adaptive Delta)和AdaGrad一样为每一维参数设定不同学习率,但是不用再设定基础学习率η

首先维护一个期望D,描述之前迭代中的参数变化情况,同样是个D维向量:

Dt=γDt?1+(1?γω2t

另一个期望G,描述之前迭代中的梯度的平方:

Gt=γGt?1+(1?γ)?Q(ω)2t

使用D和G的比值作为权重,分别归一化每一维参数:

ωdt+1=ωdt?DdtGdt+1?Q(ω)

减号后的归一化参数决定了:单位梯度变化对应多少参数变化。

Adam

Adam3(Adaptive Moment Estimation)的思路和AdaGrad相似,都使用梯度平方根归一化学习率。

注意:为书写简便,后续的矩阵相乘相除都逐元素进行,更新也对参数每一维单独进行。

维护一个一阶momentum,等价于梯度:

mt=α?mt?1+(1?α)??Q(ω)

另一个二阶momentum,等价于梯度平方:

vt=β?vt?1+(1?β)??Q(ω)2

由于m,v都初始化为0,使用t次幂让其在头几次迭代中更大一些:

m^t=mt1?αt,v^t=vt1?βt

使用梯度平方v归一化学习率,更新幅度为梯度m:

ωt+1=ωt?η1v^t???√m^t

Rprop

RProp4(Resilient Propagation)比较本次梯度?Q(ω)dt+1和上次梯度?Q(ω)dt符号变化来为参数d的变化加权。

如果两次梯度符号相反,则抑制参数变化(η?<1):

ωdt+1=ωdt?η???Q(ω)

如果两次符号相同,则增强参数变化(η+>1):

ωdt+1=ωdt?η+??Q(ω)

RMSprop

RMSprop5(Root Mean Square Propagation)类似于简化版的AdaDelta,但是是独立发展而来的。

维护期望G,描述之前迭代中的梯度的平方:

Gt=γGt?1+(1?γ)?Q(ω)2t

用G修正学习率:

ωdt+1=ωdt?ηGdt+1?Q(ω)

NAG

NAG6(Nesterov’s Accelerated Gradient),发明者是毛国数学家Yurii Nesterov。

参数变化由γ控制:

mt=γ?mt?1+η??Q(ω?γ?mt?1)

导数的计算点不再是当前参数ω,而是从当前参数根据前次变化前进一小步。

mt更新参数:

ωt+1=ωt?mt

总结

提速可以归纳为以下几个方面: 
- 使用momentum来保持前进方向(velocity); 
- 为每一维参数设定不同的学习率:在梯度连续性强的方向上加速前进; 
- 用历史迭代的平均值归一化学习率:突出稀有的梯度;

辨:其他优化方法

共轭梯度法(Conjugate Gradient)也是一阶方法,针对特殊形式的代价函数:

Q(ω)=12ωTAω?ωTb

常见的各种牛顿法, L-BFGS核心都是二阶优化方法,利用了代价函数的Hessian矩阵:

xt+1=xt?η?H[Q(ω)]?1?Q(ω)

换句话说,牛顿法用线性函数拟合代价函数的导数,而不是代价函数本身。

具体的一阶优化方法:

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的稳定值为

ϵ∥g∥1−α

也就是说,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=ϵδ+∑n−1i=1gi⊙gi−−−−−−−−−−√

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

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

g^←+1m∇θ∑iL(f(xi;θ),yi)r←r+g^⊙g^△θ=−ϵδ+r√⊙g^θ←θ+△θ

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

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


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^△θ=−ϵδ+r√⊙g^θ←θ+△θ

优点: 
相比于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−ϵr√⊙g^θ←θ+v

Adam

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

具体实现: 
需要:步进值 ϵ, 初始参数 θ, 数值稳定量δ,一阶动量衰减系数ρ1, 二阶动量衰减系数ρ2 
其中几个取值一般为:δ=10−8,ρ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)g⊙gs^←s1−ρ1r^←r1−ρ2△θ=−ϵs^r^√+δθ←θ+△

优化方法总结(BGD,SGD,Momentum,AdaGrad,RMSProp,Adam)相关推荐

  1. 深度学习笔记:优化方法总结(BGD,SGD,Momentum,AdaGrad,RMSProp,Adam)

    深度学习笔记(一):logistic分类  深度学习笔记(二):简单神经网络,后向传播算法及实现  深度学习笔记(三):激活函数和损失函数  深度学习笔记:优化方法总结  深度学习笔记(四):循环神经 ...

  2. 深度学习入门-ANN神经网络参数最优化问题(SGD,Momentum,AdaGrad,RMSprop,Adam)

    这里写目录标题 1. 参数优化 1.1 随机梯度下降法(SGD) 1.2 Momentum 动量法 1.3 AdaGrad 1.4 RMSprop 1.5 Adam 1. 参数优化 本文总结一下ANN ...

  3. 深度学习中常用的优化算法(SGD, Nesterov,Adagrad,RMSProp,Adam)总结

    深度学习中常用的优化算法(SGD, Nesterov,Adagrad,RMSProp,Adam)总结 1. 引言 在深度学习中我们定义了损失函数以后,会采取各种各样的方法来降低损失函数的数值,从而使模 ...

  4. 梯度优化方法:BGD,SGD,mini_batch, Momentum,AdaGrad,RMSProp,Adam

    文章目录 目标函数 三种梯度下降优化框架 1.BGD.SGD.mini_batch 2.**优缺点对比:** 3.**问题与挑战:** 优化梯度下降法 1.动量梯度下降法(Momentum) 2.Ne ...

  5. NN学习技巧之参数最优化的四种方法对比(SGD, Momentum, AdaGrad, Adam),基于MNIST数据集

    前面几篇博文分析了每一种参数优化方案,现在做一个对比,代码参考斋藤的红鱼书第六章. 实验对mnist数据集的6万张图片训练,使用5层全连接神经网络(4个隐藏层,每个隐藏层有100个神经元),共迭代20 ...

  6. 花书+吴恩达深度学习(七)优化方法之基本算法(Momentum, Nesterov, AdaGrad, RMSProp, Adam)

    目录 0. 前言 1. 指数加权平均(exponentially weighted averages) 2. Momentum 动量 3. Nesterov 动量 4. AdaGrad 5. RMSP ...

  7. DL之DNN优化技术:DNN优化器的参数优化—更新参数的四种最优化方法(SGD/Momentum/AdaGrad/Adam)的案例理解、图表可视化比较

    DL之DNN优化技术:DNN优化器的参数优化-更新参数的四种最优化方法(SGD/Momentum/AdaGrad/Adam)的案例理解.图表可视化比较 目录 四种最优化方法简介 优化器案例理解 输出结 ...

  8. 各种优化器SGD,AdaGrad,Adam,LBFGS都做了什么?

    文章目录 各种优化器SGD,AdaGrad,Adam,LBFGS都做了什么? 1. SGD: 2. SGD+Momentum: 3. NAG(Nesterov Accelerated Gradient ...

  9. DL之DNN:自定义MultiLayerNet(5*100+ReLU+SGD/Momentum/AdaGrad/Adam四种最优化)对MNIST数据集训练进而比较不同方法的性能

    DL之DNN:自定义MultiLayerNet(5*100+ReLU+SGD/Momentum/AdaGrad/Adam四种最优化)对MNIST数据集训练进而比较不同方法的性能 目录 输出结果 设计思 ...

最新文章

  1. php localcompare,GetDriveName 方法
  2. 三张图读懂机器学习 :基本概念、五大流派与九种常见算法
  3. Python---已知Person类,继承Person类生成Teacher类(增加参数:科目)和Student类(增加参数:专业)。
  4. 查看某个github commit属于哪一个github pull request
  5. NOIP2018提高组模拟题(六)
  6. 看完就懂webpack打包原理
  7. poj3159 Candies
  8. 在信号处理函数中调用longjmp
  9. redis面试常问--缓存穿透
  10. [Asp.Net web api]基于自定义Filter的安全认证
  11. android 3gpp 播放,Android Market:MoboPlayer 最強悍的免費影片播放程式
  12. IT认证之架构师认证
  13. asp获取用户坐标,通过微信公众号的js-sdk功能实现获取用户地址坐标
  14. xmarks不能同步和访问之解决办法
  15. 职场必备:Excel2016,官方推荐使用技巧
  16. 香港常见问题扫盲贴(港币兑换/签注直飞/刷卡/酒店押金/关税/香港上网)
  17. Html5 用什么软件开发好?
  18. 根据离散傅里叶变换对ECG信号进行频谱分析
  19. cad页面布局快捷键_CAD页面设置管理器快捷键命令(如何设置页面布局)
  20. 精通CFD工程仿真与案例实战

热门文章

  1. LaTeX公式符号总结(Markdown适用)
  2. PAT 乙级 1068  万绿丛中一点红
  3. 低分辨率人脸识别(LRFR)相关文章整理——(待更)
  4. 使用bootstrap时下拉菜单失效问题解决
  5. 计算机网络cidr是啥,计算机网络(4.11)网络层- 无分类编址CIDR
  6. Qt使用 QProcess来检测 ip 设备是否在线(Ping)
  7. js实现上下左右移动小方块
  8. java语言笔记io
  9. 搞了一天存储过程,现在又说历史数据不用处理了。。。
  10. mongodb知识点汇总