当前位置: 首页 > news >正文

神经网络深度学习(三)优化器

目录

一、优化器分类

二、优化器详解

三、优化器常见面试题


 

一、优化器分类

基本梯度下降法:包括标准梯度下降法(GD, Gradient Descent),随机梯度下降法(SGD, Stochastic Gradient Descent)及批量梯度下降法(BGD, Batch Gradient Descent);

动量优化法:包括标准动量优化方法(MomentumOptimizer)、牛顿加速梯度动量优化方法(NAG, Nesterov accelerated gradient)等;

                    Momentum(历史梯度乘以一个权重)-> Nesterov(向前看一步梯度)

自适应学习率优化法:包括Adagrad(Adaptive gradient algorithm)算法,RMSProp(root mean square prop)算法,Adam算法等;

                   Adagrad(首次引入二阶动量) -> adadelta (只关注过去一段时间)->RMSProp(修改AdaGrad的梯度积累为一阶指数加权的移动平均)

融合优化法:

                   adam:    adagrad + momentum
                   nadam:Adam+Nesterov

二、优化器详解

优化器

基本原理

优点

缺点

适用场景

pytorch函数参数(参数含义见pytorch优化器函数)

SGD

SGD更新公式:Wt+1​=Wt​−ηt​gt​其中ηt​表示学习率,gt​表示单个样本的梯度,训练时只从训练样本集中随机选取一个样本进行梯度下降;而标准梯度下降法GD是每次使用所有样本更新梯度;批量梯度下降法BGD是介于GD和SGD之间,每次通过一小批样本更新梯度。

1.每次只选择一个样本进行求导,当训练样本集很大时,计算速度比GD快很多,内存开销小很多;

2.具有随机性,能够跳出一些比较差的局部最优点;

1.每步接受信息量有限,对梯度估计容易产生偏差,在山谷和鞍点处梯度下降速度很慢;

2.单样本梯度更新时会引入许多噪声;

SGD在比如SSD或者faster-rcnn等目标检测模型,每个样本都有大量候选框参与训练,这时使用随机梯度下降法能够加快梯度的计算。通常我们采用得更多的是BGD。

class torch.optim.SGD(params, lr=, momentum=0, dampening=0, weight_decay=0, nesterov=False)

e)

MomentumOptimizer

 

标准动量优化方法,核心思想就是,使当前训练数据的梯度受到之前训练数据的梯度的影响,对之前的梯度乘以一个权重项成为了动量项。能够减少梯度的波动,加快收敛。

1.通过动量更新,参数向量会在有持续梯度的方向上增加速度;

2.使梯度下降时的折返情况减轻,从而加快训练速度;

如果数据集分类复杂,会导致 Vt-1 和 t时刻梯度 向量方向相差较大;在进行向量求和时,得到的 Vt 会非常小,反而使训练速度大大下降甚至模型难以收敛。

适合用于改进在随机梯度下降和批量梯度下降等方法中梯度出现折返等情况,以加速收敛。

通过在torch.optim.SGD()函数中设置参数momentum和dampening以实现。

NAG

(Nesterov)

 

牛顿加速梯度动量优化方法,和标准动量优化方法不同的点在于会超前一个动量单位,相当于对于Momentum多了一个本次梯度相对上次梯度的变化量,以“向前看”看到的梯度而不是当前位置梯度去更新。

1.如果多次梯度累计方向大致相同,标准动量优化方法中会导致最终下降步幅过大;而NAG可以有效利用损失函数的近似二阶导,从而加快收敛速度。

不能根据参数的重要性而对不同的参数进行不同程度的更新。

是对标准Momentum方法对改进,可以使得RNN在很多任务上有更好的表现。

通过在torch.optim.SGD()函数中设置参数nesterov以实现。

LBFGS

L-BFGS算法, 较少使用。

torch.optim.LBFGS(params, lr=1, max_iter=20, max_eval=None, tolerance_grad=1e-05, tolerance_change=1e-09, history_size=100, line_search_fn=None)

ASGD

 

实现平均随机梯度下降算法。在第k步迭代的时候,考虑这一步和前面n-1个梯度的平均值,当前权重减去步长乘以最近n个梯度的平均值。n是自己设置的,当n=1的时候,就是普通的sgd。

1.和SGD相当,收敛速度快了很多,计算成本小于BGD。

1.和Momentum的原理比较接近,但实现上不如后者简单高效,因此应用也较少。

能够加速SGD的收敛

torch.optim.ASGD(params, lr=0.01, lambd=0.0001, alpha=0.75, t0=1000000.0, weight_decay=0)

Adamax

Adam的一种基于无穷范数的变种,可参考Adamax优化器

torch.optim.Adamax(params, lr=0.002, betas=(0.9, 0.999), eps=1e-08, weight_decay=0)

Adagrad

 

AdaGrad的核心思想是,缩放每个参数反比于其所有梯度历史平均值总和的平方根。具有代价函数最大梯度的参数相应地有较大的学习率,而具有小梯度的参数有较小的学习率。式中,i表示第i个分类,t表示第t迭代同时也表示分类i累计出现的次数。η0表示初始的学习率取值(一般为0.01)。

1.AdaGrad算法能够随着训练过程自动减小学习率;

2.对于分布稀疏或者不均衡的数据集,AdaGrad算法在学习率上有很好的适应性;

1.仍依赖于人工设置一个全局学习率;

2.随着迭代次数增多,分母上梯度平方的累加将会越来越大,学习率会越来越小,最终会趋近于0,使得训练提前结束。

能够根据参数的重要性而对不同的参数进行不同程度的更新的问题。适合处理稀疏梯度。

torch.optim.Adagrad(params, lr=0.01, lr_decay=0, weight_decay=0)

RMSprop

RMSProp算法修改了AdaGrad的梯度积累为一阶指数加权的移动平均。

1.解决Adagrad分母会不断积累,这样学习率就会收缩并最终会变得非常小的问题。

1.RMSprop依然依赖于全局学习率;

RMSprop算是Adagrad的发展和Adadelta的变体,效果趋于二者之间。适合处理非平稳目标,对于RNN效果很好

torch.optim.RMSprop(params, lr=0.01, alpha=0.99, eps=1e-08, weight_decay=0, momentum=0, centered=False)

Rprop

Rprop和RMSprop

和RMSprop比较类似,RMSprop是对Rprop的改进,较少使用

torch.optim.Rprop(params, lr=0.01, etas=(0.5, 1.2), step_sizes=(1e-06, 50))

AdaDelta

1.AdaDelta算法额外维护一个状态变量Delta(x),并使用状态变量的均方根代替 RMSprop 中的学习率参数,使AdaDelta优化器不需要指定超参数。

1.训练后期容易反复在局部极小值震荡。

相比于RMSprop算法,可以不用指定全局学习率超参数。

torch.optim.Adadelta(params, lr=1.0, rho=0.9, eps=1e-06, weight_decay=0)

这里的lr=1.0表示在delta被应用到参数更新之前对它缩放的系数。

Adam

Adma吸收了Adagrad(自适应学习率的梯度下降算法)和动量梯度下降算法Momentum的优点,既能适应稀疏梯度(即自然语言和计算机视觉问题),又能缓解梯度震荡的问题。

1.计算高效;

2.梯度平滑、稳定的过渡,可以适应不稳定的目标函数;

3.调参相对简单,默认参数就可以处理绝大部分的问题。

4.能自然地实现步长退火过程(自动调整学习率)

5.超参数具有很好的解释性,且通常无需调整或仅需很少的微调

1.可能不收敛;

2.可能错过全局最优解。

很适合应用于大规模的数据及参数的场景;

适用于不稳定目标函数;

适用于梯度稀疏或梯度存在很大噪声的问题;

torch.optim.Adam(params, lr=0.001, betas=(0.9, 0.999), eps=1e-08, weight_decay=0)

NAdam

Adam+Nesterov

 

2.学习率的选取

学习率控制了每次更新模型参数需要用到多少误差,学习率过大过小都不合适,会有如下优缺点:

学习率 大

学习率 小

学习速度

使用时间点

刚开始训练时

一定轮次过后

缺点

  1. 造成梯度爆炸

  2. 损失值来回振荡

  1. 收敛速度慢

  2. 容易过拟合,容易陷入局部最优

三、优化器常见面试题

2 Adam vs Adagrad    adam vs rmsprop

1 Adam vs Adagrad    adam vs rmsprop

2 adam 改进

相关文章:

  • Altium Dsigner 20 工艺参数设置修改
  • 2022“杭电杯” 中国大学生算法设计超级联赛(10)1 4题解
  • ssh免密登陆
  • 神经网络深度学习(二)激活函数
  • Java_Servlet处理请求流程
  • cadence SPB17.4 - allegro - modify shape
  • AJAX详细教程
  • 关于 在国产麒麟系统上使用QProcess配合管道命令执行shell命令获取预期结果输出失败 的解决方法
  • docker进阶——docker网络简解
  • 2022/09/01 day01:Git概述
  • 2022/09/02 day02:连接远程仓库,推送、克隆
  • 第18章linux系统-备份与恢复
  • 2022/09/03 day03:搭建私有git服务器与IDEA中使用Git
  • VScode+esp-idf:例程(esp32-web-camera)保存图片到sd卡
  • 读书笔记<高速上手C11 14 17>
  • 9月CHINA-PUB-OPENDAY技术沙龙——IPHONE
  • [分享]iOS开发 - 实现UITableView Plain SectionView和table不停留一起滑动
  • 2019年如何成为全栈工程师?
  • android 一些 utils
  • C++11: atomic 头文件
  • CSS 提示工具(Tooltip)
  • docker容器内的网络抓包
  • Druid 在有赞的实践
  • JavaScript类型识别
  • JAVA多线程机制解析-volatilesynchronized
  • vuex 学习笔记 01
  • webpack项目中使用grunt监听文件变动自动打包编译
  • 等保2.0 | 几维安全发布等保检测、等保加固专版 加速企业等保合规
  • 飞驰在Mesos的涡轮引擎上
  • 关于 Linux 进程的 UID、EUID、GID 和 EGID
  • 解析 Webpack中import、require、按需加载的执行过程
  • 理解在java “”i=i++;”所发生的事情
  • 如何正确配置 Ubuntu 14.04 服务器?
  • 世界上最简单的无等待算法(getAndIncrement)
  • 思否第一天
  • 小程序滚动组件,左边导航栏与右边内容联动效果实现
  • 异常机制详解
  • ​什么是bug?bug的源头在哪里?
  • # 飞书APP集成平台-数字化落地
  • # 执行时间 统计mysql_一文说尽 MySQL 优化原理
  • #QT(TCP网络编程-服务端)
  • #我与Java虚拟机的故事#连载05:Java虚拟机的修炼之道
  • (01)ORB-SLAM2源码无死角解析-(66) BA优化(g2o)→闭环线程:Optimizer::GlobalBundleAdjustemnt→全局优化
  • (c语言版)滑动窗口 给定一个字符串,只包含字母和数字,按要求找出字符串中的最长(连续)子串的长度
  • (Demo分享)利用原生JavaScript-随机数-实现做一个烟花案例
  • (Java实习生)每日10道面试题打卡——JavaWeb篇
  • (附源码)计算机毕业设计SSM疫情居家隔离服务系统
  • (强烈推荐)移动端音视频从零到上手(上)
  • (十八)三元表达式和列表解析
  • (转)全文检索技术学习(三)——Lucene支持中文分词
  • .gitignore文件—git忽略文件
  • .Net CoreRabbitMQ消息存储可靠机制
  • .Net 访问电子邮箱-LumiSoft.Net,好用
  • .net 托管代码与非托管代码
  • .NET 中的轻量级线程安全