优化器 optimizer

2023-05-16

优化器 optimizer

optimizer 优化器,用来根据参数的梯度进行沿梯度下降方向进行调整模型参数,使得模型loss不断降低,达到全局最低,通过不断微调模型参数,使得模型从训练数据中学习进行特征提取的能力。目前常用的优化器有SGD,Adam,AdamW等。

SGD

随机梯度下降

从训练样本中随机选取一个进行计算梯度,然后×学习率进行调整模型参数。

优点:训练速度快,对非凸函数效果好

缺点:局部最优点或鞍点是,梯度为0,无法继续更新参数,沿平缓进展慢,而沿陡峭方向震荡,难以快速收敛
w t + 1 = w t − α ∗ g t w_{t+1}=w_t-α*g_t wt+1=wtαgt
其中α为学习率,g_t为当前参数的梯度

SGD-M

SGD-with Momentum 在SGD的基础上引入一阶动量。
m t = β 1 ∗ m t − 1 + ( 1 − β ) ∗ g t m_t=β_1*m_{t-1}+(1-β)*g_t mt=β1mt1+(1β)gt
加入动量因素,但并未完全解决震荡幅度过大和持续更新问题,当局部沟壑较深,依然会困在局部最优点内震荡

SGD with Nesterov Acceleration

NAG全称为Nesterov Accelerated Gradient 当前通过向累积动量方向前进后,计算当时的下降方向,然后根据累积动量和下一点的梯度方向,计算当前累积动量

AdaGrad

自适应学习率算法,为了模型某个参数度量历史更新频率,使得更新频率高的参数学习率自适应降低,而更新频率低的参数自适应学习率增加,则引入了二阶动量,记录到目前为止所有梯度值的平方和
V t = ∑ r = 1 t g r 2 V_t=\sum{^t_{r=1}}g^2_r Vt=r=1tgr2
缺点:由于V_t单调递增,学习率不断降低,后面数据无法学习到有用信息,而且二阶向量智能表示整个学习过程全部累积,不能仅表示近期的更新频率。

AdaDelta/RMSProp

将二阶动量计算方式修改为过去一段时间的下降梯度,与SGD一阶动量计算相同,指数移动平均值大约过去一段时间平均值:
V t = β 2 ∗ V t − 1 + ( 1 − β 2 ) g t 2 V_t=β_2*V_{t-1}+(1-β_2)g^2_t Vt=β2Vt1+(1β2)gt2

Adam

将SGD的一阶动量和AdaDelta中的二阶动量结合,得到Adam,通过一阶动量和二阶动量,有效控制学习率步长和梯度方向,防止梯度振荡和静止。

调整:为了使学习率单调递减,二阶动量需要进行调整
V t = m a x ( β 2 ∗ V t − 1 + ( 1 − β 2 ) g t 2 , V t − 1 ) V_t=max(β_2*V_{t-1}+(1-β_2)g^2_t,V_{t-1}) Vt=max(β2Vt1+(1β2)gt2,Vt1)
由于后期学习率还是低,所以可能会影响有效收敛。

Nadam

在Adam的基础上,加入了SGD with Nesterov Acceleration的策略,计算一阶动量时,先求下一步下降方向,然后回过头进行累积动量计算。

AdamW

Adam中的权重衰减weight_decay ,由于自适应学习率改变,导致不正确,AdamW

通过将权重衰减与梯度更新进行解耦,来达到更高效的权重衰减,提高优化器的表现。


Scheduler

制定一个合适的学习率衰减策略**。**可以使用定期衰减策略,比如每过多少个epoch就衰减一次;或者利用精度或者AUC等性能指标来监控,当测试集上的指标不变或者下跌时,就降低学习率。Scheduler,则是根据一定策略,多个steps或epoch后进行学习率调整。

  • LambdaLR

​ 通过设置自定义函数,进行学习率调整

  • StepLR
    n e w l r = i n i t i a l l r ∗ γ e p o c h / / s i z e new_{lr}=initial_{lr}*γ^{epoch//size} newlr=initiallrγepoch//size
    γ是超参数(0-1),size为几个epoch数目进行更新学习率

  • MultiStepLR

n e w l r = i n i t i a l l r ∗ γ b i s e c t − r i g h t ( m i l e s t o n e , e p o c h ) new_{lr}=initial_{lr}*γ^{bisect-right(milestone,epoch)} newlr=initiallrγbisectright(milestone,epoch)

​ 将StepLR中固定的size进行更新学习率,修改为递增list_size,进行调整学习率。

  • ExponentialLR
    n e w l r = i n i t i a l l r ∗ γ e p o c h new_{lr}=initial_{lr}*γ^{epoch} newlr=initiallrγepoch
    单纯的指数学习率调整,每个epoch一更新

  • LinearLR

    线性学习率调整,给定起始和最终的学习率,给定更新总步长,更新步长内线性下降,超出部分保存最低学习率不变。、

  • CyclicLR

    呈曲线不断上升和下降,设置谷底和峰值学习率和振幅轮次

  • CosineAnnealingLR

    余弦退火学习率,设置T_max 周期的一半,最小学习率eta_min

  • SequentialLR

    串联多个学习率schedulers

  • ConstantLR

    常数学习率,再total_iters轮内乘以factor,以外恢复原学习率

warmup

由于刚开始训练时,模型的权重(weights)是随机初始化的,此时若选择一个较大的学习率,可能带来模型的不稳定(振荡),选择Warmup预热学习率的方式,可以使得开始训练的几个epoches或者一些steps内学习率较小,在预热的小学习率下,模型可以慢慢趋于稳定,等模型相对稳定后再选择预先设置的学习率进行训练,使得模型收敛速度变得更快,模型效果更佳。


idea

这里优化器都是只根据一次loss,向一个方向走一步,如果加入一些存储空间,让loss在一次下降,向不同方向走几个step之后进行比较两者loss,再选择loss低的点进行重复,可以一个梯度下降,一个随机修改。

由于Adam类的优化器学习率都会递减,那么训练数据输入顺序不同会对模型结果产生一定影响吧,可能这就是随机种子产生影响中的一个因素,为了使高质量,多样性的训练数据靠前,需要进行简单调整,可能最后模型效果会更好些。

总结

Adam和Adamw,在权重衰减哪里的数学公式有点没看明白,以后回顾的时候再努力思考一下。

参考

  • 优化器(Optimizer) - 知乎 (zhihu.com)
  • AdamW优化器(自适应梯度方法)_星光里的博客-CSDN博客_adamw优化器
  • 训练时的学习率调整:optimizer和scheduler - 知乎 (zhihu.com)
  • 史上最全学习率调整策略lr_scheduler - 知乎 (zhihu.com)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

优化器 optimizer 的相关文章

  • PHP的多文件上传类

    提交表单的页面 upload php lt doctype html gt lt html lang 61 34 en 34 gt lt head gt lt meta charset 61 34 UTF 8 34 gt lt title
  • Nginx负载均衡配置实例详解

    转载自 xff1a http www php100 com html program nginx 2013 0905 5525 html 负载均衡是我们大流量网站要做的一个东西 xff0c 下面我来给大家介绍在Nginx服务器上进行负载均衡
  • 基于Bootstrap使用jQuery实现简单可编辑表格

    editTable js 提供编辑表格当前行 添加一行 删除当前行的操作 xff0c 其中可以设置参数 xff0c 如 xff1a operatePos 用于设置放置操作的列 xff0c 从0开始 xff0c 1表示以最后一列作为放置操作的
  • ThinkPHP 大D方法思想下的JDBC操作数据库D类

    这里我封装出来的D 类 xff0c 是根据 ThinkPHP 中的 D 方法中做出来的 xff0c 其中有些出入的地方 xff0c 我进行了一些个性化的修正 xff0c 如 xff1a ThinkPHP 中操作数据库时 xff0c 需要在配
  • 基于MVC设计模式实现简单PHP框架(雏形)-初期

    xff08 记住 xff1a 这里只是提供思考的过程 xff09 其实这里只是一个我们课的Web实验 课程设计题目统计系统 xff0c 在做实验的过程中起初只是想往MVC靠拢而已 xff0c 却不知不觉地 实现 了基于MVC的简单框架的雏形
  • Rocketmq入门介绍

    目录 一 Rocketmq优势 二 Rocketmq与其他MQ对比 三 MQ基本概念 四 RocketMQ的4个组件 五 集群部署结构 工作流程 xff1a 模块功能特性 xff1a Nameserver Broker 生产者 Produc
  • 我的简单PHP框架——LabPHP

    就我上次提到的 基于MVC设计模式实现简单PHP框架 xff08 雏形 xff09 初期 这次列出我实现的LabPHP简易框架 xff0c 该框架中没有使用任何的模板引擎 xff0c 所以说要在模板中使用到php变量的话 xff0c 仍然需
  • 我的LabPHP框架的Demo应用——课程设计题目统计系统

    1 界面制作 xff08 为了方便起见 xff0c 这里我采用了Bootstrap 框架制作界面 xff09 xff1b 2 数据库设计 xff0c 正确创建students 表 xff1b admin表 xff1a 3 项目目录结构如下

随机推荐

  • 基于Bootstrap使用jQuery实现输入框组input-group的添加与删除

    注意这里要求使用到Bootstrap框架的输入框组 xff0c 如 xff1a lt div class 61 34 row 34 gt lt div class 61 34 col lg 6 34 gt lt div class 61 3
  • 网页中时光轴的简单实现

    时光轴效果如下 xff1a 鼠标滑过当前项时 xff0c 左侧图标大小变大 xff1a index html lt DOCTYPE html gt lt html lang 61 34 en 34 gt lt head gt lt meta
  • 伸缩自如的时光轴实现

    上回说到简单时间轴的实现 xff0c 这一次针对上回的实现的时光轴 xff0c 增加时光轴收起的功能 为了方便重用 xff0c 我分离css样式和js 使用过程中主要注意一下尽量使用css定义的时光轴样式即可 时光轴收起功能的实现过程可以查
  • 伸缩自如的时光轴实现——改进版

    上回讲到的是时光轴 伸缩自如 的实现 xff0c 如果基于响应式制作的话 xff0c 可能存在着许多潜在的BUG 如 xff1a 窗口变化时 xff0c 时光轴的 收起 和 展开 xff0c 都发生了一些变形 为此 xff0c 对原来的 t
  • 伸缩自如的时光轴实现_样式改版

    针对前几篇文章中实现的 伸缩自如 的时光轴 xff0c 对时光轴的样式进行又一次修改 xff0c 效果如下 xff1a 点击 收起 后 xff1a 修改后的 timeline css xff0c 如下 xff1a vertical time
  • ThinkPHP中的create方法与自动令牌验证

    转载自 xff1a Thinkphp中Create方法深入探究 ThinkPHP中的create方法与自动令牌验证实例教程 Thinkphp中Create方法深入探究 由于工作原因在thinkPHP的create 方法上遇到了问题 xff0
  • web安全之token和CSRF攻击

    上文我转载了两篇关于ThinkPHP令牌验证的文章 xff08 ThinkPHP中的create方法与自动令牌验证 xff09 其中提及到了 token xff0c 这里针对 token 的作用 xff0c 转载了另外两篇文章 xff08
  • java中的==、equals和hashCode以及hashCode生成

    转载自 xff1a xff08 点击打开链接 xff09 前言 java中 61 61 equals hashCode 都和对象的比较有关 xff0c 在java中这三者各有什么用处呢 xff0c 即java中为什么需要设计这三种对象的比较
  • javascript调用微信或QQ扫一扫

    项目里为了体验做的好点 xff0c 想直接通过js调用手机的扫一扫 xff1a 服务的用户主要是通过 xff1a 微信或QQ 之前使用过 微信或QQ的分享 腾讯移动WEB开发平台的 39 对外分享组件接口文档 39 http open mo
  • Java中的反射机制

    获取类的类类型的3种方式 xff0c 以及如何通过类的类类型创建实例对象 xff1f ClassDemo1 java package com reflect public class ClassDemo1 public static voi
  • Java中的自定义注解

    自定义注解 Description java xff08 这里自定义Description注解 xff09 package com ann test import java lang annotation Documented import
  • Java中自定义注解的应用

    来自 慕课网 的学习 我们可以使用自定义注解 xff0c 实现ORM xff0c 即对象 关系的映射 通过自定义注解 xff0c 定义对象对应数据表的属性 xff0c 如表名 xff0c 表字段等 Table java xff08 Tabl
  • Intellij IDEA下的第一个Hibernate项目

    参考 xff1a intellij配置hibernate自动生成hbm xml文件 从零开始用Intellij idea14创建hibernate项目 下面我要讲的创建方式 xff0c 可能更加原生态 xff0c 更加类似于Eclipse下
  • Intellij IDEA使用注解创建Hibernate项目中的OR映射类

    上回说到 xff1a Intellij IDEA下的第一个Hibernate项目 我们需要创建 对象到关系的映射配置文件 xff0c 如 entity hbm xml xff08 其中 entity 是我们将要创建的实体 xff09 下面讲
  • Hibernate中Blob对象类型的使用

    使用Intellij IDEA创建Hibernate项目 xff0c 目录结构如下 xff1a 其中 assets app png 为将要存储的照片 xff0c src hibernate cfg xml 为Hibernate的配置文件 x
  • Hibernate组件映射

    转载自 xff1a 点击打开链接 在Hibernate中 component 是某个实体的逻辑组成部分 xff0c 它与实体的根本区别是没有oid xff08 对象标识符 xff09 xff0c component是一个被包含的对象 它作为
  • Hibernate中的单向一对多关联

    源自 imooc 中的学习 Hibernate中的单向一对多关联 xff0c 这里举例 班级对学生 的单向一对多关联 xff0c 即一个班级可以有多个学生 那么在Hibernate中实体对象间如何体现出单向一对多的关联关系呢 xff1f 如
  • Hibernate中的单向多对一关联

    继上回讲到 Hibernate中的单向一对多关联 xff0c 这次来实现一下Hibernate中的单向多对一关联 对原来的项目修改如下 xff1a Hibernate中的单向多对一关联 xff0c 需要我们在多方增加一个一方的属性 xff0
  • Hibernate中的双向多对一关联以及 inverse属性、cascade属性的用法

    上回 说了 Hibernate中的单向一对多关联 和 Hibernate中的单向多对一关联 这次针对这两个 单向 进行整合即可实现双向的多对一关联 如 xff1a 学生与班级的关系 在Grade类中需要添加 Set集合保存Student对象
  • 优化器 optimizer

    优化器 optimizer optimizer 优化器 xff0c 用来根据参数的梯度进行沿梯度下降方向进行调整模型参数 xff0c 使得模型loss不断降低 xff0c 达到全局最低 xff0c 通过不断微调模型参数 xff0c 使得模型