深度学习常用优化器总结,具详细(SGD,Momentum,AdaGrad,Rmsprop,Adam,Adamw)

学习需要,总结一些常用优化器。

目录

  • 前言
  • SGD:随机梯度下降
  • BGD:批量梯度下降
  • MBGD:小批量梯度下降
  • Momentum
  • AdaGrad
  • RMSprop
  • Adam: Adaptive Moment Estimation
  • AdamW
  • 参考文章

前言

优化器的本质是使用不同的策略进行参数更新。常用的方法就是梯度下降,那梯度下降是指在给定待优化的模型参数 θ ∈ R d \theta \in R^d θRd,和目标函数 J ( θ ) J(\theta) J(θ),算法通过沿梯度 ∇ J ( θ ) \nabla J(\theta) J(θ)的反方向更新权重 θ \theta θ,来最小化目标函数。
学习率 μ \mu μ决定了每一时刻的更新步长。对于每一个时刻 t ,我们可以用下述公式描述梯度下降的流程:
θ t + 1 = θ t − μ ∇ J ( θ ) \theta_{t+1} = \theta_{t} - \mu \nabla J(\theta) θt+1=θtμJ(θ)
梯度下降法目前主要分为三种方法,区别在于每次参数更新时计算的样本数据量不同:批量梯度下降法(BGD, Batch Gradient Descent),随机梯度下降法(SGD, Stochastic Gradient Descent)及小批量梯度下降法(Mini-batch Gradient Descent)。

SGD:随机梯度下降

随机梯度下降是指在一个批次的训练样本中,我随机挑选一个样本计算其关于目标函数的梯度,然后用此梯度进行梯度下降。
设选择的样本为 ( x i , y i ) (x^i,y^i) (xi,yi),首先计算其梯度 ∇ J ( θ , x i , y i ) \nabla J(\theta,x^i,y^i) J(θ,xi,yi),然后进行权值更新:
θ t + 1 = θ t − μ ∇ J ( θ , x i , y i ) \theta_{t+1} = \theta_{t} - \mu \nabla J(\theta,x^i,y^i) θt+1=θtμJ(θ,xi,yi)
SGD的优点是实现简单、效率高,缺点是收敛速度慢、容易陷入局部最小值;迭代次数多

BGD:批量梯度下降

与SGD对应的,BGD是对整个批次的训练样本都进行梯度计算。
设批样本为 { ( x 1 , y 1 ) , . . . , ( x n , y n ) } \{(x^1,y^1),..., (x^n,y^n)\} {(x1,y1),...,(xn,yn)},首先计算所有的样本梯度的平均值 1 n ∑ i = 1 n ∇ J ( θ , x i , y i ) \frac{1}{n} \sum _{i=1} ^{n} \nabla J(\theta,x^i,y^i) n1i=1nJ(θ,xi,yi),然后进行梯度更新:
θ t + 1 = θ t − μ 1 n ∑ i = 1 n ∇ J ( θ , x i , y i ) \theta_{t+1} = \theta_{t} - \mu \frac{1}{n} \sum _{i=1} ^{n} \nabla J(\theta,x^i,y^i) θt+1=θtμn1i=1nJ(θ,xi,yi)
BGD得到的是一个全局最优解,但是每迭代一步,都要用到训练集的所有数据,如果样本数巨大大,那上述公式迭代起来则非常耗时,模型训练速度很慢;迭代次数少

MBGD:小批量梯度下降

是BGD和SGD的折中,从训练样本中选取一小批样本进行梯度计算,然后更新梯度:
θ t + 1 = θ t − μ 1 b ∑ i = 1 b ∇ J ( θ , x i , y i ) \theta_{t+1} = \theta_{t} - \mu \frac{1}{b} \sum _{i=1} ^{b} \nabla J(\theta,x^i,y^i) θt+1=θtμb1i=1bJ(θ,xi,yi)

Momentum

指数加权移动平均是一种常用的序列数据处理方式,用于描述数值的变化趋势,本质上是一种近似求平均的方法。计算公式如下:
v t = β v t − 1 + ( 1 − β ) θ t ​​ v_t=βv _{t−1}+(1−β)θ_t​​ vt=βvt1+(1β)θt​​
v t v_t vt 表示第t个数的估计值, β \beta β为一个可调参数,能表示 v t − 1 v_{t-1} vt1 的权重, θ t \theta_t θt 表示第t个数的实际值

Momentum就是在普通的梯度下降法中引入指数加权移动平均,即定义一个动量,它是梯度的指数加权移动平均值,然后使用该值代替原来的梯度方向来更新。定义的动量为:
v t = β v t − 1 + ( 1 − β ) ∇ θ J ( θ t ) v_t=βv _{t−1}+(1−β)\nabla_{ \theta} J(\theta_t) vt=βvt1+(1β)θJ(θt)
因此梯度下降表达式为:
θ t + 1 = θ t − η v t \theta_{t+1}=\theta_{t} - η v_t θt+1=θtηvt
普通的随机梯度下降法中,由于无法计算损失函数的确切导数,嘈杂的数据会使下降过程并不朝着最佳方向前进,使用加权平均能对嘈杂数据进行一定的屏蔽,使前进方向更接近实际梯度。此外,随机梯度下降法在局部极小值极有可能被困住,但Momentum由于下降方向由最近的一些数共同决定,能在一定程度反应总体的最佳下降方向,所以被困在局部最优解的可能会减小。

AdaGrad

Adagrad是对学习率进行了一个约束,对于经常更新的参数,由于已经积累了大量关于它的知识,不希望被单个样本影响太大,所以希望学习速率慢一些;对于偶尔更新的参数,由于了解的信息太少,希望能从每个偶然出现的样本身上多学一些,即需要学习率大一些。
该方法开始使用二阶动量,才意味着“自适应学习率”优化算法时代的到来。二阶动量是用来度量历史更新频率的,即迄今为止所有梯度值的平方和。二阶动量越大,学习率就越小,这一方法在稀疏数据场景下表现非常好。
v t = ∑ i = 1 n g t 2 v_{t} = \sum _{i=1} ^{n} g^2_t vt=i=1ngt2
θ t + 1 = θ t − η v t + ϵ \theta_{t+1}=\theta_{t} - \frac{η}{\sqrt{v_t+ \epsilon}} θt+1=θtvt+ϵ η
缺点:
仍需要手工设置一个全局学习率 , 如果 设置过大的话,会使regularizer过于敏感,对梯度的调节太大
中后期,分母上梯度累加的平方和会越来越大,使得参数更新量趋近于0,使得训练提前结束,无法学习

RMSprop

RMSProp算法修改了AdaGrad的梯度平方和累加为指数加权的移动平均,还将学习速率除以平方梯度的指数衰减平均值,使得其在非凸设定下效果更好。设定参数:全局初始率η默认设为0.001,decay rate β \beta β,默认设置为0.9,一个极小的常量 ,通常为10e-6。E是取期望的意思。
E [ g 2 ] t = β E [ g 2 ] t + ( 1 − β 1 ) g t 2 E[g^2]_t = \beta E[g^2]_t+(1-\beta _{1})g^2_{t} E[g2]t=βE[g2]t+(1β1)gt2
θ t + 1 = θ t − η E [ g 2 ] t + ϵ g t \theta_{t+1}=\theta_{t} - \frac{η}{\sqrt{E[g^2]_t}+ \epsilon}g_t θt+1=θtE[g2]t +ϵηgt

Adam: Adaptive Moment Estimation

对AdaGrad的优化,一种通过计算模型参数的梯度以及梯度平方的加权平均值(一阶动量和二阶动量),来调整模型的参数。
g t = ∇ θ J ( θ t ) g_t = \nabla_{ \theta} J(\theta_t) gt=θJ(θt)
m t = β 1 m t − 1 + ( 1 − β 1 ) g t m_t = \beta _{ 1}m_{t-1} + (1-\beta _{1})g_{t} mt=β1mt1+(1β1)gt
v t = β 2 v t − 1 + ( 1 − β 2 ) g t 2 v_t = \beta _{2}v_{t-1} + (1-\beta _{2})g^2_{t} vt=β2vt1+(1β2)gt2
m t ^ = m t 1 − β 1 t \hat{m_t}=\frac{m_t}{1-\beta^t_{1}} mt^=1β1tmt
v t ^ = v t 1 − β 2 t \hat{v_t}=\frac{v_t}{1-\beta^t_{2}} vt^=1β2tvt
θ t + 1 = θ t − η v t ^ + ϵ m t ^ \theta_{t+1}=\theta_{t} - \frac{η}{\sqrt{\hat{v_t}}+ \epsilon}\hat{m_t} θt+1=θtvt^ +ϵηmt^
其中,各个变量含义如下:
g t g_t gt:模型参数在第t次迭代时的梯度,
m t 和 v t m_t和v_t mtvt:模型参数在第t次迭代时的一阶动量和二阶动量,
β 1 和 β 2 \beta _{1}和\beta _{2} β1β2:超参数(默认是0.9和0.999),
β 1 t 和 β 2 t \beta _{1}^{t}和\beta _{2}^{t} β1tβ2t β 1 \beta _{1} β1 β 2 \beta _{2} β2的t次方。
m t ^ \hat{m_t} mt^ v t ^ \hat{v_t} vt^ t是梯度的偏差纠正后的移动平均值
Adam优化器的主要优点是它能够自适应地调整每个参数的学习率,从而提高模型的收敛速度和泛化能力。

AdamW

Adam 虽然收敛速度快,但没能解决参数过拟合的问题。学术界讨论了诸多方案,其中包括在损失函数中引入参数的 L2 正则项。这样的方法在其他的优化器中或许有效,但会因为 Adam 中自适应学习率的存在而对使用 Adam 优化器的模型失效(因为正则项同时存在于adam的分子和分母,参考adam的公式,这样正则就抵消了)。AdamW就是在Adam+L2正则化的基础上进行改进的算法。
以往的L2正则是直接加在损失函数上,比如加入正则,损失函数变化如下:
L l 2 ( θ ) = L ( θ ) + 1 2 λ ∣ ∣ θ ∣ ∣ 2 L_{l_2}(\theta)=L(\theta) + \frac{1}{2}λ||\theta||^2 Ll2(θ)=L(θ)+21λ∣∣θ2
图片中红色是上述的Adam+L2 regularization的方式,绿色就是adamw即Adam + weight decay的方式。
在这里插入图片描述
为什么这么做?bert给出的解释是

参考文章

[1] 梯度下降优化算法Momentum
[2]多种梯度下降优化算法总结分析

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/7263.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C++】多态

一、多态的概念 多态,顾名思义就是多种状态。 多态概念:通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态。 举个例子:比如买票这个行为,当普通人买票时&#xff…

【PostgreSQL内核学习(八)—— 查询执行(查询执行策略)】

查询执行 查询执行概述查询执行策略可优化语句和数据定义语句四种执行策略策略选择实现Portal执行的过程 声明:本文的部分内容参考了他人的文章。在编写过程中,我们尊重他人的知识产权和学术成果,力求遵循合理使用原则,并在适用的…

基于LoRA微调部署Stable Diffusion【免费试用阿里云】

文章目录 Stable Diffusion介绍环境及资源准备过程注交互式建模(PAI-DSW)的试用在创建的工作空间中创建实例安装 Diffusers Stable Diffusion介绍 Stable Diffusion 是一种文本到图像的潜在扩散模型,由 Runway 和慕尼黑大学合作构建&#xf…

vue开发环境搭建指南

nodejs下载和安装 从nodejs官网下载nodejs安装版本(愿配置环境变量的可以下载zip版本,解压,添加path环境变量) 在命令行里运行 node -v显示如下版本,则安装成功 10.15.3 #vue-cli3安装 在命令行里运行 npm i -g @vue/cli查看版本号 vue -V显示如下版本,则安装成功 3…

微信小程序反编译

PC--微信小程序反编译 小程序反编译工具: 免责声明:不得将小程序反编译源码程序和反编译图片素材挪作商业或盈利用 使用教程地:https://www.kancloud.cn/ludeqi/xcxzs/2607637 最新版下载地址:https://xcx.siqingw.top/xcx.zip 小…

Python Flask构建微信小程序订餐系统 (十二)

🔥 创建切换商品分类状态的JS文件 🔥 ; var food_act_ops={init:function(){this.eventBind();},eventBind:function(){//表示作用域var that = this;$(".wrap_search select[name=status]").change(function(){$(".wrap_search").submit();});$(&qu…

海外网红营销合作指南:详解海外合同与协议要点

随着互联网的发展和社交媒体的普及,海外网红营销成为了品牌推广和营销的重要力量。然而,这种跨国合作需要谨慎考虑,签订合适的合同与协议显得尤为重要,以确保各方权益得到保障并促进合作的顺利进行。本文Nox聚星将详细介绍与海外网…

web前端设计师的主要职责说明(合集)

web前端设计师的主要职责说明1 职责: 1. 根据UI设计师提供的设计图,实现一流的Web界面,优化代码并保持在各浏览器下良好的兼容性; 2. Web前端表现层及与后端交互的架构设计和开发; 3. JavaScript程序模块开发,通用类库、框架编…

STM32 互补PWM 带死区 HAL

1、设置PWM波频率100KHz,占空比50%,死区时间1us 2、 while 循环之前启动PWM HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1); //启动TIM1_CH1 PWM输出 HAL_TIMEx_PWMN_Start(&htim1,TIM_CHANNEL_1);//启动TIM1_CH1N PWM输出 3、死区计算 DT_time…

每日一题——判断链表中是否有环

题目 判断给定的链表中是否有环。如果有环则返回true&#xff0c;否则返回false。 数据范围&#xff1a;链表长度 0≤n≤10000&#xff0c;链表中任意节点的值满足 ∣val∣<100000 要求&#xff1a;空间复杂度 O(1)&#xff0c;时间复杂度 O(n) 输入分为两部分&#xff0c…

优维低代码实践:添加构件

优维低代码技术专栏&#xff0c;是一个全新的、技术为主的专栏&#xff0c;由优维技术委员会成员执笔&#xff0c;基于优维7年低代码技术研发及运维成果&#xff0c;主要介绍低代码相关的技术原理及架构逻辑&#xff0c;目的是给广大运维人提供一个技术交流与学习的平台。 优维…

HCIA静态路由综合实验(eNSP)

实验题目及要求&#xff1a; 1、分析IP地址分配。 主干IP掩码均为30&#xff1b; 环回IP掩码为28&#xff0c;方便汇总掩码27&#xff1b; 然后预留部分IP地址。 如下图&#xff1a; 2、按如上图片要求连接设备&#xff0c;并标记好IP分配信息&#xff0c;便于命令配置时一…

Jenkins环境配置篇-邮件发送

作为持续集成的利器Jenkins已经得到了广泛地应用&#xff0c;仅仅作为一个工具&#xff0c;Jenkins已然有了自己的生态圈&#xff0c;支持其的plugin更是超过1300。在实际中如何使用以及如何更好地使用jenkins&#xff0c;一直是大家在实践并讨论的。本系列文章将会从如何使用j…

StableDiffusion 换脸实现

先看效果&#xff1a; 想要换的脸&#xff1a; 想要把脸放到的目标图片&#xff1a; 实现方案&#xff1a; StableDiffusionroop&#xff08;本次实验基于roopV0.02版本&#xff09; 1/安装SD&#xff0c;模型选择 DreamShaper,Sampler使用 Euler a 2/安装roop插件 roop插…

uniapp 微信小程序 uni.modal弹框+content内容自定义(内容换行)

效果图&#xff1a; 1、template <view click"showPriceDialog"></view>2、data data() {return {contentText:"",} },3、methods // 价格公示 showPriceDialog: function() {// 吨let minPriceTon 1900let maxPriceTon 3895// 袋let …

使用 Logstash 及 enrich processor 实现数据丰富自动化

在我之前的文章&#xff1a; Elasticsearch&#xff1a;enrich processor &#xff08;7.5发行版新功能&#xff09; Elasticsearch&#xff1a;使用 Elasticsearch ingest pipeline 丰富数据 通过上面的两篇文章的介绍&#xff0c;我们应该充分掌握了如何使用 enrich proce…

uniapp使用自定义导航栏和手机自带的状态栏重叠

【问题界面】&#xff1a; 【正常界面】&#xff1a; 【解决方法】&#xff1a; 在页面顶部添加代码<!-- #ifndef H5 --> <statusBar></statusBar> <!-- #endif --> 2.引入占位条并注册 import statusBar from "/uni_modules/uni-nav-bar/c…

IDEA使用lombok实体类加上@Data注解后无法找到get和set方法

文章目录 一、问题原因二、解决方法1.File→Settings2.Plugins→搜索"lombok"→Install3.Restart IDE&#xff08;重启IDEA&#xff09; 一、问题原因 IDEA没有安装lombok插件 二、解决方法 1.File→Settings 2.Plugins→搜索"lombok"→Install 3.Restart…

IDEA安装热部署插件JRebel详解

JRebel 简介 JRebel是一套JavaEE开发工具。JRebel允许开发团队在有限的时间内完成更多的任务修正更多的问题&#xff0c;发布更高质量的软件产品。 JRebel是收费软件&#xff0c;用户可以在JRebel官方站点下载30天的评估版本。 Jrebel 可快速实现热部署&#xff0c;节省了大量重…

STM32MX配置EEPROM(AT24C02)------保姆级教程

———————————————————————————————————— ⏩ 大家好哇&#xff01;我是小光&#xff0c;嵌入式爱好者&#xff0c;一个想要成为系统架构师的大三学生。 ⏩最近在开发一个STM32H723ZGT6的板子&#xff0c;使用STM32CUBEMX做了很多驱动&#x…