欢迎关注微信公众号“智能算法” – 原文链接(阅读体验更佳):
深度学习算法(第5期)----深度学习中的优化器选择

上一期,我们一起学习了TensorFlow在训练深度网络的时候怎么解决梯度消失或梯度爆炸的问题,以及怎么尽可能的减少训练时间。
深度学习算法(第4期)---- TF训练DNN之进阶
这期我们继续学习训练深度网络时的一大神器----优化器。学习的路上,我们多多交流,共同进步。本期主要内容如下:

  • Momentum optimization
  • Nesterov Accelerated Gradient
  • AdaGrad
  • RMSProp
  • Adam Optimization

1. 回顾

我们知道在训练一个比较大的深度神经网络的时候,速度上一般都是比较慢的。通过上期的学习,我们已经知道有4中方法可以加速我们的训练过程,如下:

a. 选择一个合适的权重初始化策略
b. 用一个合适的激活函数
c. 运用Batch Normalization策略
d. 复用之前的网络模型

但是今天我们要学习的是另外一个加速神器–优化器,它要比一般的梯度下降算法快很多。我们这里主要介绍几种常见的优化器,其中包括:Momentum optimization,Nesterov Accelerated Gradient,AdaGrad,RMSProp,Adam Optimization。

2. Momentum optimization

2.1 原理

momentum optimization可以翻译为动量优化器,该优化器背后的思想很简单: 假设一个圆球从一个斜坡上滚下去,一开始速度会很慢,但是随着时间的增加,速度会越来越快,考虑到摩擦力和空气阻力,最终会达到一个恒定的速度(空气阻力跟速度的平方成正比)。这就是momentum optimization 背后的思想。跟一般的梯度下降法相比,显然动量优化速度更快。
我们再回顾下一般梯度下降权重的更新是用权重直接减去学习率乘以梯度:

θ←θ−η∇θJ(θ)\theta\leftarrow\theta-\eta{\nabla_\theta}J(\theta)θ←θ−η∇θ​J(θ)

这种更新权重的方式,并不关心之前的梯度,只根据当前梯度值进行更新。如果当前梯度比较小的话,那么寻优的过程就比较费时。
动力优化根据这一缺点对一般的梯度下降法进行了改进。动力优化更多的考虑了之前的梯度信息,在每一次的迭代中,都会把当前梯度信息加到动力向量mmm中,最终根据减去动力向量来更新权重,如下公式:

1.m←βm+η∇θJ(θ)1.\quad m \leftarrow \beta m+ \eta{\nabla_\theta}J(\theta)1.m←βm+η∇θ​J(θ)
2.θ←θ−m2.\quad \theta \leftarrow \theta - m2.θ←θ−m

换句话说,这里把梯度当做是加速度而并不是速度,为了模拟一些摩擦力和阻力来防止速度变得过大,该算法增加了一个超参数β\betaβ,该值的取值范围为0~1,当β=0\beta=0β=0时表示较高的阻力,此时梯度的更新等同于一般的梯度优化。当β=1\beta=1β=1的时候表示没有阻力,此时梯度更新最快,一般情况下该值设置为0.9.
从上面公式可以看出,假如梯度恒定为∇\nabla∇的话,权重更新的最终速度为11−βη∇\frac 1 {1- \beta} \eta{\nabla}1−β1​η∇。假如β=0.9\beta=0.9β=0.9的话,那么momentum optimization的最终优化速度是一般梯度下降的10倍左右。这就使的动力优化比一般梯度优化能够更快的逃离平坦区域。
由于动力加速度的存在,所以在寻优的时候可能会超过最优点一点,然后返回,再超过,再返回最终稳定在最优点。这就是为什么要在算法中加入超参数β\betaβ的一个原因,它能够减少震荡加速收敛。

2.2 实现

在TensorFlow中实现Momentum Optimization比较简单,如下:

optimizer = tf.train.MomentumOptimizer(learning_rate=learning_rate,momentum=0.9)

动力优化的一个缺点就是多了一个超参数β\betaβ去调节。然而,这个超参数一般情况下设置为0.9就能够很好的工作,并不需要经常去调节。

3. Nesterov Accelerated Gradient

3.1 原理

Nesterov Accelerated Gradient(NAG)算法,其实是对Momentum Optimization的一个小小的改进,在动力优化中,更新动力变量mmm是在当前(θ\thetaθ)的梯度上进行更新的,而在NAG算法中,对动力变量的更新在动力方向上稍微提前了一些(θ+βm\theta + \beta mθ+βm),如下:

1.m←βm+η∇θJ(θ+βm)1.\quad m \leftarrow \beta m+ \eta{\nabla_\theta}J(\theta + \beta m)1.m←βm+η∇θ​J(θ+βm)
2.θ←θ−m2.\quad \theta \leftarrow \theta - m2.θ←θ−m

上面的改进是可行的原因就在于,Momentum Optimization中的动力向量$m$的方向是指向最优点的,因此用更前一点的梯度来代替当前的梯度去更新动力向量更为精确。如下图:
上图中,∇1\nabla_1∇1​代表损失函数在起始点θ\thetaθ的梯度,而∇2\nabla_2∇2​代表损失函数在点θ+βm\theta + \beta mθ+βm的梯度值,可以看到NAG更接近最优点,随着时间的累积,NAG会比动力优化器明显的更快一些。此外我们还可以看到,当动力向量推动权重接近最优值的时候,∇1\nabla_1∇1​会继续加速推动,使得远离最优值,而∇2\nabla_2∇2​则已经开始往回拉了,这就减少了震荡进而使得更快收敛。

3.2 实现

在training深度网络的时候,NAG通常会比Momentum Optimization更快收敛,用起来也比较简单只需要将动力优化器中设置参数use_nesterov=Trueuse\_nesterov=Trueuse_nesterov=True即可,如下:

optimizer = tf.train.MomentumOptimizer(learning_rate=learning_rate,momentum=0.9, use_nesterov=True)

4. AdaGrad

4.1 原理

考虑到之前介绍的细长碗的最优化这个问题,一般的梯度优化会在陡峭的区域快速下降,而在平坦区域慢慢走向最优值。如果算法能够提前监测到这种情况就会更好,就可以在陡峭的地方慢慢下降(防止错过最优点),在平坦区域快速通过,这样就能更快的找到最优点。AdaGrad算法就是通过衰减学习率来进行达到这个目的的。公式原理如下:

1.s←s+∇θJ(θ)⊗∇θJ(θ)1.\quad s \leftarrow s + {\nabla_\theta}J(\theta) \otimes {\nabla_\theta}J(\theta)1.s←s+∇θ​J(θ)⊗∇θ​J(θ)
2.θ←θ−η∇θJ(θ)⊘s+ε2.\quad \theta \leftarrow \theta - \eta {\nabla_\theta}J(\theta) \oslash {\sqrt{s+\varepsilon}}2.θ←θ−η∇θ​J(θ)⊘s+ε​

上面公式1中在sss中累加了梯度的平方,(⊗\otimes⊗表示矩阵中对应元素相乘),而在公式2中和之前的梯度下降比较类似,唯一不同的是对梯度向量进行了衰减或者说是对学习率η\etaη做了衰减(⊘\oslash⊘表示矩阵中对应元素相除,而ε\varepsilonε则是防止除数为0,通常设置为10−1010^{-10}10−10)。
换句话说就是AdaGrad算法对学习率进行了自适应化,当梯度比较大的时候,学习率就比较小,而当梯度比较小的时候,学习率就比较大。如下图,该算法能够更明显的向最优点逼近。

然而事实证明,AdaGrad算法在一些简单的二项式问题上表现优异,但是在training深度网络的时候,由于学习率衰减过多,常常会过早停止寻优。因此,尽管TensorFlow中有提供该方法AdaGradOptimizerAdaGradOptimizerAdaGradOptimizer,但是不建议用该优化器去训练深度网络。因此这里就不写出实现代码了。

5. RMSProp

5.1 原理

尽管AdaGrad算法衰减过快而导致无法收敛到最优点的问题,RMSProp算法通过修改AdaGrad算法第一步的梯度累加方式,改累加所有的梯度为对累加的梯度乘以一个衰减系数,如下公式:

1.s←βs+(1−β)∇θJ(θ)⊗∇θJ(θ)1.\quad s \leftarrow \beta s + (1 - \beta){\nabla_\theta}J(\theta) \otimes {\nabla_\theta}J(\theta)1.s←βs+(1−β)∇θ​J(θ)⊗∇θ​J(θ)
2.θ←θ−η∇θJ(θ)⊘s+ε2.\quad \theta \leftarrow \theta - \eta {\nabla_\theta}J(\theta) \oslash \sqrt{s+\varepsilon}2.θ←θ−η∇θ​J(θ)⊘s+ε​

可知,该方法又多了一个超参数衰减率β\betaβ,一般设置为β=0.9\beta=0.9β=0.9。理解了AdaGrad算法,这里就不再过多解释了。

5.2 实现

当然,TensorFlow对该算法也是有提供的,如下:

optimizer = tf.train.RMSPropOptimizer(learning_rate=learning_rate,momentum=0.9, decay=0.9, epsilon=1e-10)

这个方法的表现还是不错的,在简单问题上表现优于AdaGrad算法,一般情况下性能也优于Momentum Optimization和NAG方法。事实上,在Adam算法出现之前,这个方法是一般训练网络时候的最优选则。

6. Adam Optimization

6.1 原理

Adam代表adaptive moment estimation,结合了Momentum Optimization和RMSProp的思想。运用了动力优化方法中的利用历史梯度信息,和RMSProp中利用历史历史梯度的平方的相关信息,公式如下:

1.m←β1m+(1−β1)∇θJ(θ)1.\quad m \leftarrow \beta_1 m+ (1 - \beta_1){\nabla_\theta}J(\theta)1.m←β1​m+(1−β1​)∇θ​J(θ)
2.s←β2s+(1−β2)∇θJ(θ)⊗∇θJ(θ)2.\quad s \leftarrow \beta_2 s + (1 - \beta_2){\nabla_\theta}J(\theta) \otimes {\nabla_\theta}J(\theta)2.s←β2​s+(1−β2​)∇θ​J(θ)⊗∇θ​J(θ)
3.m←m1−β1T3.\quad m \leftarrow \frac {\bm m} {1 - {\beta_1}^T}3.m←1−β1​Tm​
4.s←s1−β2T4.\quad s \leftarrow \frac {\bm s} {1 - {\beta_2}^T}4.s←1−β2​Ts​
5.θ←θ−ηm⊘s+ε5.\quad \theta \leftarrow \theta - \eta m \oslash \sqrt{s+\varepsilon}5.θ←θ−ηm⊘s+ε​

从上面1,2,5公式可以看出,该算法跟Momentum Optimization和RMSProp特别像,唯一不同的是在公式1中运用了历史梯度指数衰减的均值而不是历史梯度指数衰减的和。公式3,4其实是一个小技巧点,因为一般m\bm mm和s\bm ss会被初始化为0,所以在training开始的时候回一直偏向0,公式3,4能够在training初期快速提高这两个变量值。
上公式中多了3个超参数β1,β2,ε\beta_1, \beta_2, \varepsilonβ1​,β2​,ε,这三个参数一般设置为0.9,0.99和10−810^{-8}10−8.

6.2 实现

在Tensorflow中用法都是很简单,所有参数都为默认值的情况下如下:

optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate)

其实Adam算法是一个自动调节学习率的算法,一般可以将学习率设置为0.001.事实证明该算法在一般深度网络中是优选择。

7. 小结

我们从一般梯度下降出发,一起学习了最近比较常见的优化器,包括Momentum Optimization, Nesterov Accelerated Gradient, AdaGrad, RMSProp和Adam Optimization。其中Adam算法是目前在training深度网络中的优选。


(如需更好的了解相关知识,欢迎加入智能算法社区,在“智能算法”公众号发送“社区”,即可加入算法微信群和QQ群)

深度学习算法(第5期)----深度学习中的优化器选择相关推荐

  1. 深度学习三人行(第5期)----深度学习中的优化器选择

    上一期,我们一起学习了TensorFlow在训练深度网络的时候怎么解决梯度消失或梯度爆炸的问题,以及怎么尽可能的减少训练时间. 深度学习三人行(第4期)---- TF训练DNN之进阶 这期我们继续学习 ...

  2. 深度学习算法(第37期)----如何用强化学习玩游戏?

    上期我们一起学习了强化学习中的时间差分学习和近似Q学习的相关知识, 今天我们一起用毕生所学来训练一个玩游戏的AI智能体. 由于我们将使用 Atari 环境,我们必须首先安装 OpenAI gym 的 ...

  3. 万字长文解读深度学习算法在自动驾驶规控中的应用

    交流群 | 进"传感器群/滑板底盘群"请加微信号:xsh041388 交流群 | 进"汽车基础软件群"请加微信号:ckc1087 备注信息:群名称 + 真实姓名 ...

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

    深度学习各类优化器 借用古代炼丹的一些名词,我们可以把训练模型中的数据比做炼丹药材,模型比做炼丹炉,火候比做优化器.那么我们知道,同样的药材同样的炼丹炉,但是火候不一样的话,炼出来的丹药千差万别,同样 ...

  5. 媒智科技--深度学习算法Python后台开发--热招中~

    点击我爱计算机视觉标星,更快获取CVML新技术 公司简介 媒智科技源起于上海交通大学,核心团队由上海交大.清华.斯坦福.乔治亚理工等顶尖高校的人工智能教授,以及来自雅虎.腾讯等科技精英组成,聚焦计算机 ...

  6. 深度学习中常用优化器算法Optimizer详解(BGD、SGD、MBGD、Momentum、NAG、Adagrad、Adadelta、RMSprop、Adam)

    本文转载自:https://www.cnblogs.com/guoyaohua/p/8542554.html 在机器学习.深度学习中使用的优化算法除了常见的梯度下降,还有 Adadelta,Adagr ...

  7. 两种深度强化学习算法在网络调度上的应用与优化(DQN A3C)

    首先给出论文地址和代码, Reinforcement Learning Based Scheduling Algorithm for Optimizing Age of Information in ...

  8. 手撕深度学习中的优化器

    深度学习中的优化算法采用的原理是梯度下降法,选取适当的初值params,不断迭代,进行目标函数的极小化,直到收敛.由于负梯度方向时使函数值下降最快的方向,在迭代的每一步,以负梯度方向更新params的 ...

  9. 【Pytorch学习笔记三】Pytorch神经网络包nn和优化器optm(一个简单的卷积神经网络模型的搭建)

    文章目录 一, 神经网络包nn 1.1定义一个网络 1.2 损失函数 二.优化器 nn构建于 Autograd之上,可用来定义和运行神经网络, PyTorch Autograd 让我们定义计算图和计算 ...

最新文章

  1. 1.3亿突触、数万神经元,谷歌、哈佛发布史上最强三维人脑地图
  2. 如何在Android Studio中查看方法信息?
  3. Struts2中 Result类型配置详解
  4. pandas基本数据处理
  5. php实战 案例教程,php实战案例
  6. javascript知识点总结----Function定义
  7. 联想微型计算机功率,解锁全部潜力,联想这款笔记本可以将CPU功耗提升至24W
  8. java怎么求两组整数的或集_Java面试题(判断集合中是否有两个数的和等于某个给定整数)...
  9. java+线程安全的hash,多线程下HashMap安全问题-ConcurrentHashMap解析
  10. c++之二维数组参数传递
  11. java-web乱码问题解决
  12. android贪吃蛇设计报告,贪吃蛇游戏报告毕业设计android
  13. 聚合影视源码搭建教程
  14. 2020云课堂智慧职教答案计算机,2020云课堂智慧职教答案英语,云智慧职教题库,智慧职教测试答案...
  15. Openssl win8 用法
  16. 烧毁DC/DC电路问题
  17. mybatis-plus异常, org.apache.ibatis.builder.BuilderException: Error evaluating expression AND
  18. javascript(String, Array, Math, Date, Object)方法整理
  19. win进程崩溃弹出Microsoft Visual C++ Runtime Library的解决办法
  20. Python科学计算:读取txt,csv,mat文件

热门文章

  1. STM32F427 CAN总线配置
  2. Win10/Win11日历提醒与手机日历同步互联+自带邮件收发配置
  3. 【树】你真的会二叉树了嘛? --二叉树LeetCode专题Ⅱ
  4. 美服疯狂坦克辅助瞄准外挂C#版开发(二)全局鼠标键盘HOOK
  5. 802.11信道划分
  6. python翻译translators
  7. java毕业生设计薪酬福利管理信息系统计算机源码+系统+mysql+调试部署+lw
  8. 车辆ACC控制,在未检测到前车的情况下自车处于定速巡航状态,当有前车切入时,则切换为自适应巡航模式
  9. SpringBoot-指标监控
  10. 项目管理实战-第四章 项目整合管理