深度学习优化器 optimizer 的选择
在很多机器学习和深度学习的应用中,我们发现用的最多的优化器是 Adam,为什么呢?
下面是 TensorFlow 中的优化器,
https://www.tensorflow.org/api_guides/python/train
在 keras 中也有 SGD,RMSprop,Adagrad,Adadelta,Adam 等:
https://keras.io/optimizers/
我们可以发现除了常见的梯度下降,还有 Adadelta,Adagrad,RMSProp 等几种优化器,都是什么呢,又该怎么选择呢?
在 Sebastian Ruder 的这篇论文中给出了常用优化器的比较,今天来学习一下:
https://arxiv.org/pdf/1609.04747.pdf
本文将梳理:
- 每个算法的梯度更新规则和缺点
- 为了应对这个不足而提出的下一个算法
- 超参数的一般设定值
- 几种算法的效果比较
- 选择哪种算法
优化器算法简述?
首先来看一下梯度下降最常见的三种变形 BGD,SGD,MBGD,
这三种形式的区别就是取决于我们用多少数据来计算目标函数的梯度,
这样的话自然就涉及到一个 trade-off,即参数更新的准确率和运行时间。
1. Batch gradient descent
- 1
- 2
梯度更新规则:
BGD 采用整个训练集的数据来计算 cost function 对参数的梯度:
缺点:
由于这种方法是在一次更新中,就对整个数据集计算梯度,所以计算起来非常慢,遇到很大量的数据集也会非常棘手,而且不能投入新数据实时更新模型
我们会事先定义一个迭代次数 epoch,首先计算梯度向量 params_grad,然后沿着梯度的方向更新参数 params,learning rate 决定了我们每一步迈多大。
Batch gradient descent 对于凸函数可以收敛到全局极小值,对于非凸函数可以收敛到局部极小值。
2. Stochastic gradient descent
- 1
- 2
梯度更新规则:
和 BGD 的一次用所有数据计算梯度相比,SGD 每次更新时对每个样本进行梯度更新, 对于很大的数据集来说,可能会有相似的样本,这样 BGD 在计算梯度时会出现冗余, 而 SGD 一次只进行一次更新,就没有冗余,而且比较快,并且可以新增样本。
缺点:
SGD 因为更新比较频繁,会造成 cost function 有严重的震荡,此外SGD对噪声比较敏感。
BGD 可以收敛到局部极小值,当然 SGD 的震荡可能会跳到更好的局部极小值处。
当我们稍微减小 learning rate,SGD 和 BGD 的收敛性是一样的。
3. Mini-batch gradient descent
- 1
- 2
梯度更新规则:
MBGD 每一次利用一小批样本,即 n 个样本进行计算, 这样它可以降低参数更新时的方差,收敛更稳定, 另一方面可以充分地利用深度学习库中高度优化的矩阵操作来进行更有效的梯度计算。
和 SGD 的区别是每一次循环不是作用于每个样本,而是具有 n 个样本的Batch。
超参数设定值:
n 一般取值在 50~200
缺点:
Mini-batch gradient descent 不能保证很好的收敛性,
①learning rate 如果选择的太小,收敛速度会很慢,如果太大,loss function 就会在极小值处不停地震荡甚至偏离。
②有一种措施是先设定大一点的学习率,当两次迭代之间的变化低于某个阈值后,就减小 learning rate,不过这个阈值的设定需要提前写好,这样的话就不能够适应数据集的特点。此外,这种方法是对所有参数更新时应用同样的 learning rate,如果我们的数据是稀疏的,我们更希望对出现频率低的特征进行大一点的更新。
③另外,对于非凸函数,还要避免陷于局部极小值处,或者鞍点处,因为鞍点周围的error 是一样的,所有维度的梯度都接近于0,SGD 很容易被困在这里。
鞍点:一个光滑函数的鞍点邻域的曲线,曲面,或超曲面,都位于这点的切线的不同边。
例如这个二维图形,像个马鞍:在x-轴方向往上曲,在y-轴方向往下曲,鞍点就是(0,0)
为了应对上面的三点挑战就有了下面这些算法。
[应对挑战 1]
4. Momentum(动量法)
- 1
- 2
SGD 在 ravinesravines 的情况下容易被困住, ravinesravines就是曲面的一个方向比另一个方向更陡,这时 SGD 会发生震荡而迟迟不能接近极小值:
梯度更新规则:
Momentum 通过加入 γvt−1γvt−1 ,可以加速 SGD, 并且抑制震荡
当我们将一个小球从山上滚下来时,没有阻力的话,它的动量会越来越大,但是如果遇到了阻力,速度就会变小。
加入的这一项,可以使得梯度方向不变的维度上速度变快,梯度方向有所改变的维度上的更新速度变慢,这样就可以加快收敛并减小震荡。
超参数设定值:
一般 γγ取值 0.9 左右。
缺点:
这种情况相当于小球从山上滚下来时是在盲目地沿着坡滚,如果它能具备一些先知,例如快要上坡时,就知道需要减速了的话,适应性会更好。
5. Nesterov accelerated gradient(NAG)
- 1
- 2
梯度更新规则:
用 θ−γvt−1θ−γvt−1来近似当做参数下一步会变成的值,则在计算梯度时,不是在当前位置,而是未来的位置上
超参数设定值:
γγ 仍然取值 0.9 左右。
效果比较:
蓝色是 Momentum 的过程,会先计算当前的梯度,然后在更新后的累积梯度后会有一个大的跳跃。
而 NAG 会先在前一步的累积梯度上(brown vector)有一个大的跳跃,然后衡量一下梯度做一下修正(red vector),这种预期的更新可以避免我们走的太快。
NAG 可以使 RNN 在很多任务上有更好的表现。
目前为止,我们可以做到,在更新梯度时顺应 loss function 的梯度来调整速度,并且对 SGD 进行加速。
我们还希望可以根据参数的重要性而对不同的参数进行不同程度的更新。
[应对挑战 2]
6. Adagrad
- 1
- 2
这个算法就可以对低频的参数做较大的更新,对高频的做较小的更新,也因此,对于稀疏的数据它的表现很好,很好地提高了 SGD 的鲁棒性,例如识别 Youtube 视频里面的猫,训练 GloVe word embeddings,因为它们都是需要在低频的特征上有更大的更新。
梯度更新规则:
其中gt,igt,i为:t 时刻参数 θiθi的梯度;GtGt是个对角矩阵, (i,i) 元素就是 t 时刻参数 θiθi 的梯度gt,igt,i的平方和。
Adagrad 的优点是减少了学习率的手动调节
超参数设定值:
一般 η 就取 0.01。
缺点:
它的缺点是分母会不断积累,这样学习率就会收缩并最终会变得非常小。
7. Adadelta
- 1
- 2
这个算法是对 Adagrad 的改进,
和 Adagrad 相比,就是分母的 GG 换成了过去的梯度平方 E[g2]tE[g2]t 的衰减平均值。
这个分母相当于梯度的均方根 root mean squared (RMS) ,所以可以用 RMS 简写:
其中 E 的计算公式如下,t 时刻的依赖于前一时刻的平均和当前的梯度:
梯度更新规则:
此外,还将学习率 αα换成了 RMS[Δθ]RMS[Δθ],这样的话,我们甚至都不需要提前设定学习率了:
超参数设定值:
γ 一般设定为 0.9,
7. RMSprop
- 1
- 2
RMSprop 是 Geoff Hinton 提出的一种自适应学习率方法。
RMSprop 和 Adadelta 都是为了解决 Adagrad 学习率急剧下降问题的。
梯度更新规则:
RMSprop 与 Adadelta 的第一种形式相同:
超参数设定值:
Hinton 建议设定 γγ为 0.9, 学习率 αα为 0.001。
8. Adam
- 1
- 2
这个算法是另一种计算每个参数的自适应学习率的方法。目前在DL领域,是最常见的优化器。
除了像 Adadelta 和 RMSprop 一样存储了过去梯度的平方 vtvt 的指数衰减平均值 ,也像 momentum 一样保持了过去梯度 mtmt的指数衰减平均值:
如果 mtmt和 vtvt 被初始化为 0 向量,那它们就会向 0 偏置,所以做了偏差校正,
通过计算偏差校正后的 mt 和 vt 来抵消这些偏差:
梯度更新规则:
超参数设定值:
建议 β1 = 0.9,β2 = 0.999,ϵ = 10e−8
实践表明,Adam 比其他适应性学习方法效果要好。
效果比较?
下面看一下几种算法在鞍点和等高线上的表现:
上面两种情况都可以看出,Adagrad, Adadelta, RMSprop 几乎很快就找到了正确的方向并前进,收敛速度也相当快,而其它方法要么很慢,要么走了很多弯路才找到。
由图可知自适应学习率方法即 Adagrad, Adadelta, RMSprop, Adam 在这种情景下会更合适而且收敛性更好。
如何选择?
如果数据是稀疏的,就用自适应方法,即 Adagrad, Adadelta, RMSprop, Adam。
RMSprop, Adadelta, Adam 在很多情况下的效果是相似的。
Adam 就是在 RMSprop 的基础上加了 bias-correction 和 momentum。
随着梯度变的稀疏,Adam 比 RMSprop 效果会好。
整体来讲,Adam 是最好的选择。
很多论文里都会用 SGD,没有 momentum 等。SGD 虽然能达到极小值,但是比其它算法用的时间长,而且可能会被困在鞍点。
如果需要更快的收敛,或者是训练更深更复杂的神经网络,需要用一种自适应的算法。
参考:
http://sebastianruder.com/optimizing-gradient-descent/index.html#fn:24
http://www.redcedartech.com/pdfs/Select_Optimization_Method.pdf
https://stats.stackexchange.com/questions/55247/how-to-choose-the-right-optimization-algorithm
深度学习优化器 optimizer 的选择相关推荐
- 深度学习优化器Optimizer详解(BGD、SGD、MBGD、Momentum、NAG、Adagrad、Adadelta、RMSprop、Adam)
在机器学习.深度学习中使用的优化算法除了常见的梯度下降,还有 Adadelta,Adagrad,RMSProp 等几种优化器,都是什么呢,又该怎么选择呢? 在 Sebastian Ruder 的这篇论 ...
- adam优化_认识 AdaMod: 一个新的有记忆的深度学习优化器
Meet AdaMod: a new deep learning optimizer with memory by Less Wright https://medium.com/@lessw/meet ...
- 深度学习优化器演化史
<深度学习优化器演化史> 不同深度学习的优化器有时候对于训练模型来说可能会有很大的差异,有时候选对了优化器就能够有事半功倍的效果,那么如果选择各种优化器呢,本文来简单剖析一下深度学习优 ...
- 基于语言模型的少样本学习 / 深度学习优化器基准测试 | 本周值得读
在碎片化阅读充斥眼球的时代,越来越少的人会去关注每篇论文背后的探索和思考.在这个栏目里,你会快速 get 每篇精选论文的亮点和痛点,时刻紧跟 AI 前沿成果.如果你也希望让自己的科研成果被更多人看到, ...
- 使用什么优化器_新的深度学习优化器Ranger:RAdam + LookAhead强强结合
[导读]给大家介绍一个新的深度学习优化器,Ranger,同时具备RAdam和LookAhead的优点,一行代码提升你的模型能力. Ranger 优化器结合了两个非常新的发展(RAdam + Looka ...
- 深度学习优化器中的变形金刚:Ranger21
论文题目:RANGER21: A SYNERGISTIC DEEP LEARNING OPTIMIZER 论文链接:https://arxiv.org/pdf/2106.13731.pdf 1 Ran ...
- 【深度学习】新的深度学习优化器探索(协同优化)
[深度学习]新的深度学习优化器探索(协同优化) 文章目录 1 RAdam VS Adam 2 自适应优化 3 LookAhead3.1 "侵入式"优化器3.2 LookAhead ...
- 新的深度学习优化器Ranger: RAdam + LookAhead的协同组合,两者兼得。
Rectified Adam(RAdam) 新的state of the art优化器:Rectified Adam(RAdam),相比adam,可以稳定提高准确率,关键是,真的有用. Liu, Ji ...
- USC提出拟牛顿法深度学习优化器Apollo,效果比肩SGD和Adam
©作者 | Xuezhe Ma 单位 | USC助理教授 研究方向 |NLP.机器学习 摘要 本文介绍了 Apollo,一种针对非凸随机优化的拟牛顿方法.它通过对角矩阵逼近 Hessian,动态地将损 ...
最新文章
- 2018年中国高被引学者榜单发布,清华入榜学者数位列高校第一
- 放置奇兵 算法 月度活动 破碎时空记录 第四关 双树精(大树)(格鲁)
- lr监控虚拟服务器,lr监控服务器 教程
- java中 queryparam_java – 何时使用@QueryParam和@PathParam
- 表字段顺序有何影响_「品味保定」炸烹虾段乾隆赞 百年保定柔雅香
- android反射开启通知_作为Android开发者 你真的知道app从启动到主页显示的过程吗?...
- 95-140-040-源码-transform-简介
- Android Studio配置Gradle(包括signingConfigs、buildTypes和productFlavors等)
- python快速求EXCEL数据权重
- tensorflow画损失函数的代码_使用TensorFlow编写您的第一个神经网络
- IS-IS详解(一)——IS-IS基础
- c语言编程1 3 5 7 9的阶乘和,阶乘怎么写程序
- 超实用超全 || ZBrush笔刷大合集
- 利用canvas画钟表
- Java ServiceLoader使用和解析
- 网页设计图片向上浮动_网页设计与制作(网页设计、制作与美化)
- VUzzer: Application-aware Evolutionary Fuzzing
- 集团化企业的电子印章管理模式
- 2021年全球天然橡胶行业供需现状分析:需求量迎来恢复性增长,中国市场需求量占比超40%[图]
- 丝滑!CVPR 2021 视频插帧论文+开源代码汇总
热门文章
- MySQL服务MySQL+MHA高可用服务集群搭建
- pythonalert弹窗_python+selenium八:Alert弹窗
- crm系统是什么很棒ec实力_搭建CRM系统要明确几个步骤?什么样的CRM是真正有用的系统?...
- python中变量不需要事先声明_python 变量搜寻顺序法则LEGB之E注意事项
- python绘制三维曲线图_Python基于matplotlib实现绘制三维图形功能示例
- uniapp对象怎么获取值_第65p,关于:生成器、迭代器与迭代对象(上)
- instanceof用法_「JS很简单」JavaScript 基础之 instanceof操作符
- python定义一个字典、存储雇员号和姓名_【一点资讯】python后端开发工程师考证试题...
- 云计算机室局域网时通时断,为什么网上邻居时通时断?
- python找出文本的位置和替换_python查找文本文档中特定间隔位置的字符并替换