深度学习笔记之优化算法(五)AdaGrad算法的简单认识

news2024/12/23 0:54:35

机器学习笔记之优化算法——AdaGrad算法的简单认识

  • 引言
    • 回顾:动量法与Nesterov动量法
    • 优化学习率的合理性
    • AdaGrad算法的简单认识
    • AdaGrad的算法过程描述

引言

上一节对 Nesterov \text{Nesterov} Nesterov动量法进行了简单认识,本节将介绍 AdaGrad \text{AdaGrad} AdaGrad方法。

回顾:动量法与Nesterov动量法

关于动量法 ( Momentum ) (\text{Momentum}) (Momentum)迭代过程使用数学符号表示如下:
{ m t = β ⋅ m t − 1 + ( 1 − β ) ⋅ ∇ θ ; t − 1 J ( θ t − 1 ) θ t = θ t − 1 − η ⋅ m t \begin{cases} m_t = \beta \cdot m_{t-1} + (1 - \beta) \cdot \nabla_{\theta;t-1} \mathcal J(\theta_{t-1}) \\ \theta_t = \theta_{t-1} - \eta \cdot m_t \end{cases} {mt=βmt1+(1β)θ;t1J(θt1)θt=θt1ηmt

  • 其中 β \beta β表示动量因子,它可理解为权衡历史梯度信息 m t − 1 m_{t-1} mt1当前梯度信息 ∇ θ ; t − 1 J ( θ t − 1 ) \nabla_{\theta;t-1} \mathcal J(\theta_{t-1}) θ;t1J(θt1)之间比例的量,或者说:由于历史梯度信息参与当前迭代步骤的梯度贡献, β \beta β表示历史梯度信息的贡献衰减得有多快

  • η \eta η表示学习率,它描述是沿着梯度更新方向前进的步长大小。而动量法的核心思想在于:合理利用历史梯度信息,结合当前迭代步骤的梯度信息,共同优化当前迭代步骤的梯度更新方向

同理, Nesterov \text{Nesterov} Nesterov动量法的核心思想与动量法基本一致,只不过将当前迭代步骤的梯度信息替换为超前梯度信息
{ m t = β ⋅ m t − 1 + ( 1 − β ) ⋅ ∇ θ ; t − 1 J ( θ t − 1 + γ ⋅ m t − 1 ) θ t = θ t − 1 − η ⋅ m t \begin{cases} m_t = \beta \cdot m_{t-1} + (1 - \beta) \cdot \nabla_{\theta;t-1} \mathcal J(\theta_{t-1} + \gamma \cdot m_{t-1}) \\ \theta_t = \theta_{t-1} - \eta \cdot m_t \end{cases} {mt=βmt1+(1β)θ;t1J(θt1+γmt1)θt=θt1ηmt

可以看出:无论是动量法还是 Nesterov \text{Nesterov} Nesterov动量法,它们的底层逻辑都是针对梯度的更新方向,也就是 m t m_t mt自身;我们不否认,在 m t m_t mt优化过程中,也伴随着梯度大小的变化。但真正掌握梯度大小的参数,是学习率 η \eta η。而在这两种算法中, η \eta η至始至终都是一个固定的超参数。我们是否也可以对学习率进行优化 ? ? ?

优化学习率的合理性

在优化学习率之前,需要认识以下:对于学习率的优化是否是有必要 ? ? ?在线搜索方法(步长角度)中,我们从精确搜索非精确搜索两种角度对步长进行了充分的描述,并延伸出一系列的搜索准则,如 Armijo \text{Armijo} Armijo准则、 wolfe \text{wolfe} wolfe准则等等。

  • 这个小例子可能不是很贴切~因为无论是精确搜索还是非精确搜索,它们都建立在方向固定是负梯度方向这个条件下。但是像动量法或者是 Nesterov \text{Nesterov} Nesterov动量法,它的梯度方向会随着迭代步骤发生变化。
  • 但也可以从侧面看出,步长的选择是有优劣之分的,并不是一成不变的。

基于上面的简单描述,无论使用哪类方法,做为调整梯度大小(步长)学习率 η \eta η都不应该是一个确定的值。我们不否认:梯度向量自身会随着迭代步骤的增加而减小,并向零向量逼近;但如果学习率不跟随梯度向量进行变化,可能会出现下面的情况:

  • 极值点附近无法收敛。这种情况可能发生的条件是:在某迭代过程中,即便梯度信息已经足够小了,但由于学习率是定值,依然会导致虽然梯度方向指向正确,但梯度向量不够小穿过极值点
    梯度信息不够小而导致穿过极值点
  • 在后续的迭代过程中,它可能都无法收敛至极值点,从而在极值点周围震荡
    无法收敛至极值点产生震荡

因而无论使用哪类方法,关于学习率的变化趋势我们都希望:学习率随着迭代过程慢慢减小。既然已经知道了目标,我们可以想到一种硬核的学习率优化方式:学习率随着每一次迭代减小一个固定的数值,当学习率减小至 0 0 0时,整个学习过程结束

很明显,这种方式自然是不够优秀的,它的缺陷主要体现在:

  • 减小的固定数值人为设定的,实际上它也间接地人为设定了迭代步骤的上界。如果迭代次数超过了该上界——即便是没有到达极值点,也要强行将迭代停止
  • 相反地,如果人为设定的固定数值过小——意味着在迭代次数内已经到达极值点,它会一直在极值点处震荡,直到学习率为 0 0 0

可以看出:人为设定学习率的衰减不可取的,但也给我们提供新的思路:是否能够让学习率在迭代过程中自主进行调整 ? ? ?

AdaGrad算法的简单认识

AdaGrad \text{AdaGrad} AdaGrad算法的核心思想是:使学习率在算法迭代过程中进行自适应调节,而自适应调节同样依靠历史梯度信息。关于 AdaGrad \text{AdaGrad} AdaGrad的迭代过程使用数学符号表示如下:
{ G t = ∇ θ ; t − 1 J ( θ t − 1 ) R t ⇐ R t − 1 + G t ⊙ G t θ t ⇐ θ t − 1 − η R t + ϵ ⊙ G t \begin{cases} \mathcal G_t = \nabla_{\theta;t-1} \mathcal J(\theta_{t-1}) \\ \mathcal R_t \Leftarrow \mathcal R_{t-1} + \mathcal G_t \odot \mathcal G_t \\ \begin{aligned} \theta_t \Leftarrow \theta_{t-1} - \frac{\eta}{\sqrt{\mathcal R_t} + \epsilon} \odot \mathcal G_t \end{aligned} \end{cases} Gt=θ;t1J(θt1)RtRt1+GtGtθtθt1Rt +ϵηGt
其中:

  • G t \mathcal G_t Gt表示当前步骤的梯度方向
  • R t \mathcal R_t Rt动量法中的 m t m_t mt一样,是历史信息的一个累积载体;而这里的历史信息并不是单纯的历史梯度信息 G t \mathcal G_t Gt,而是 G t \mathcal G_t Gt与自身的内积结果 G t ⊙ G t \mathcal G_t \odot \mathcal G_t GtGt
  • ϵ \epsilon ϵ是一个较小的正数,仅为保证分母项不为 0 0 0

很明显,由于 G t ∈ R p \mathcal G_t \in \mathbb R^p GtRp( p p p表示权重空间维数),因而 G t ⊙ G t = ∥ G t ∥ 2 ∈ R \mathcal G_t \odot \mathcal G_t = \|\mathcal G_t \|^2 \in \mathbb R GtGt=Gt2R,是一个实数;因而 R t = R t + G t ⊙ G t = ∑ i = 1 t ∥ G i ∥ 2 ∈ R \begin{aligned}\mathcal R_t = \mathcal R_t + \mathcal G_t \odot \mathcal G_t = \sum_{i=1}^t \|\mathcal G_i \|^2 \in \mathbb R \end{aligned} Rt=Rt+GtGt=i=1tGi2R也是一个实数观察最后一项关于学习率的优化 η ⇒ η R t + ϵ \begin{aligned}\eta \Rightarrow \frac{\eta}{\sqrt{\mathcal R_t} + \epsilon}\end{aligned} ηRt +ϵη

  • 关于分母部分: R t + ϵ = ∑ i = 1 t ∥ G i ∥ 2 + ϵ \sqrt{\mathcal R_t} + \epsilon = \sqrt{\sum_{i=1}^t \|\mathcal G_i\|^2} + \epsilon Rt +ϵ=i=1tGi2 +ϵ可以发现:这个函数是单调递增的,也就是说:关于 η \eta η的优化结果只会减小,不会增加;在梯度结果 G t \mathcal G_t Gt存在较大变化时, η \eta η会相应减小
  • 可以将 G t \mathcal G_t Gt拿到分子上,可以得到: η ⋅ G t R t + ϵ \begin{aligned}\frac{\eta \cdot \mathcal G_t}{\sqrt{\mathcal R_t} + \epsilon}\end{aligned} Rt +ϵηGt(由于 ⊙ \odot 的两项分别是实数与向量,因而这里的内积 ⊙ \odot 就是乘法),其中分子的项 η ⋅ G t \eta \cdot \mathcal G_t ηGt实际上就是真实更新梯度,而 AdaGrad \text{AdaGrad} AdaGrad的操作就是将真实更新梯度执行标准化操作
    这种操作和批标准化( Batch Normalization \text{Batch Normalization} Batch Normalization)中也出现过类似的形式。该部分欢迎小伙伴们一起讨论~

这种学习率优化的优势在于:

  • 若某迭代步骤 t t t梯度 G t = ∇ θ ; t − 1 J ( θ t − 1 ) \mathcal G_t = \nabla_{\theta;t-1} \mathcal J(\theta_{t-1}) Gt=θ;t1J(θt1)过大,其会相应地得到一个快速下降的学习率
  • 相反,对于梯度 G t \mathcal G_t Gt较小的部分,虽然学习率依然在减小,但但减小的幅度也会下降。这种情况会使参数在更新过程中面对平缓的倾斜方向会存在不错的收敛效果

AdaGrad \text{AdaGrad} AdaGrad算法对于学习率的优化也存在明显的缺陷

  • 由于初始化状态下的参数可能是随机生成的,这种情况下有可能导致初始梯度 G \mathcal G G的结果极大/变化非常剧烈,而这种剧烈变化会使得 R t \mathcal R_t Rt累积了较大的内积信息,从而导致本在有效收敛的过程中,由于学习率过早地、并且过量的减少,最终使:参数没有动力收敛到预期的极值点而产生欠拟合

AdaGrad的算法过程描述

基于 AdaGrad \text{AdaGrad} AdaGrad的算法步骤表示如下:
初始化操作

  • 全局学习率 η \eta η,初始化参数 θ \theta θ
  • 超参数 ϵ = 1 0 − 7 \epsilon = 10^{-7} ϵ=107,梯度累积信息 R = 0 \mathcal R = 0 R=0

算法过程

  • While \text{While} While没有达到停止准则 do \text{do} do
  • 从训练集 D \mathcal D D中采集出包含 k k k个样本的小批量 { ( x ( i ) , y ( i ) ) } i = 1 k \{(x^{(i)},y^{(i)})\}_{i=1}^k {(x(i),y(i))}i=1k
  • 计算当前步骤参数 θ \theta θ梯度信息
    G ⇐ 1 k ∑ i = 1 k ∇ θ L [ f ( x ( i ) ; θ ) , y ( i ) ] \mathcal G \Leftarrow \frac{1}{k} \sum_{i=1}^k \nabla_{\theta} \mathcal L[f(x^{(i)};\theta),y^{(i)}] Gk1i=1kθL[f(x(i);θ),y(i)]
  • 使用 R \mathcal R R梯度内积进行累积
    R ⇐ R + G ⊙ G \mathcal R \Leftarrow \mathcal R + \mathcal G \odot \mathcal G RR+GG
  • 计算更新的梯度量
    Δ θ = − η ϵ + R ⊙ G \Delta \theta = - \frac{\eta}{\epsilon + \sqrt{\mathcal R}} \odot \mathcal G Δθ=ϵ+R ηG
  • 更新梯度 θ \theta θ
    θ ⇐ θ + Δ θ \theta \Leftarrow \theta + \Delta \theta θθ+Δθ
  • End While \text{End While} End While

Reference \text{Reference} Reference
“随机梯度下降、牛顿法、动量法、Nesterov、AdaGrad、RMSprop、Adam”,打包理解对梯度下降的优化
《深度学习(花书)》 P187 8.5.1 AdaGrad \text{P187 8.5.1 AdaGrad} P187 8.5.1 AdaGrad

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

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

相关文章

华为云云耀云服务器L实例评测|测试CentOS的网络配置和访问控制

目录 引言 1 理解几个基础概念 2 配置VPC、子网以及路由表 3 配置安全组策略和访问控制规则 3.1 安全组策略和访问控制简介 3.2 配置安全组策略 3.3 安全组的最佳实践 结论 引言 在云计算时代,网络配置和访问控制是确保您的CentOS虚拟机在云环境中安全运行的…

每个前端都要学的【前端自动化部署】,Devops,CI/CD

原文发布于:2023-09-21 11:50 作者:65岁退休Coder 原文链接:https://juejin.cn/post/7102360505313918983 DevOps 当我们提到 Jenkins,大家首先想到的概念就是 CI/CD,在这之前我们应该再了解一个概念。 DevOps&#…

3.springcloudalibaba gateway项目搭建

文章目录 前言一、搭建gateway项目1.1 pom配置1.2 新增配置如下 二、新增server服务2.1 pom配置2.2新增测试接口如下 三、测试验证3.1 分别启动两个服务,查看nacos是否注册成功3.2 测试 总结 前言 前面已经完成了springcloudalibaba项目搭建,接下来搭建…

js 之让人迷惑的闭包

文章目录 一、闭包是什么? 🤦‍♂️二、闭包 😎三、使用场景 😁四、使用场景(2) 😁五、闭包的原理六、思考总结一、 更深层次了解闭包,分析以下代码执行过程二、闭包三、闭包定义四、…

每日一题 2578. 最小和分割(简单,模拟)

思路: 拆分 num 的每一位数字,将他们排序。最大的两个放在个位,其次两个放十位,以此类推。注意并不需要重新组合出 num1 和 num2 ,他只要和即可。优化,可以不使用排序,因为只有 0 到 9 一共十个…

【Hello Algorithm】暴力递归到动态规划(一)

暴力递归到动态规划(一) 斐波那契数列的动态规划机器人走路初级递归初级动态规划动态规划 先后选牌问题初级递归初级动态规划动态规划 我们可以一句话总结下动态规划 动态规划本质是一种以空间换时间的行为 如果你发现有重复调用的过程 在经过一次之后把…

jmeter怎样的脚本设计才能降低资源使用

官网地址:Apache JMeter - Users Manual: Best Practices 1、用好断言 频繁的使用断言会加大资源的消耗,尽可能减少断言的使用,或者在使用的过程中断言数据文本尽量精简 2、使用命令执行 启动的时候就提示我们在执行压测的时候应该用命令执…

自动化测试框架有哪些?怎么选?今天我来告诉你

前言 随着软件开发过程中的复杂度不断提高,自动化测试成为了一个必要的手段。Python作为一种灵活易用的编程语言,已经成为自动化测试领域的一种主流工具。Python自动化测试框架可以使得我们更加方便地进行测试脚本的编写和执行,同时也可以提…

【力扣】2. 两数相加

题目描述 给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。 请你将两个数相加,并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外,这两个数都…

Centos指令合集

2023-10-09 防火墙 开启 systemctl start firewalld自启动 systemctl enable firewalld.service关闭 systemctl stop firewalld禁用 systemctl disable firewalld.service查看状态 systemctl status firewalld

OpenCV4(C++)—— 仿射变换、透射变换和极坐标变换

文章目录 一、仿射变换1. getRotationMatrix2D()2. warpAffine() 二、透射变换三、极坐标变换 一、仿射变换 在OpenCV中没有专门用于图像旋转的函数,而是通过图像的仿射变换实现图像的旋转。实现图像的旋转首先需要确定旋转角度和旋转中心,之后确定旋转…

Windows10打开应用总是会弹出提示窗口的解决方法

用户们在Windows10电脑中打开应用程序,遇到了总是会弹出提示窗口的烦人问题。这样的情况会干扰到用户的正常操作,给用户带来不好的操作体验,接下来小编给大家详细介绍关闭这个提示窗口的方法,让大家可以在Windows10电脑中舒心操作…

Java Agent初探

1:Java Agent简介 Java Agent 这个技术出现在 JDK1.5 之后,对于大多数人来说都比较陌生,但是多多少少又接触过,实际上,我们平时用的很多工具,都是基于 Java Agent 实现的,例如常见的热部署 JRe…

电脑中的opencl.dll丢失怎么办,三步解决opencl.dll丢失

最近有不少用户都遇到了opencl.dll丢失的情况,其实解决opencl.dll丢失的办法很简单,今天就来教大家如何用三步解决opencl.dll丢失的问题。 一.了解opencl.dll opencl.dll是OpenCL的动态链接库文件。OpenCL(Open Computing Language&#xff…

上班第一天同事让我下载个小乌龟,我就去百度小乌龟。。。。

记得那会儿是刚毕业,去上班第一天,管我的那个上级说让我下载个小乌龟,等下把代码拉一下,我那是一脸懵逼啊,我在学校只学过git啊,然后开始磨磨蹭蹭吭吭哧哧的不知所措,之后我想也许百度能救我&am…

华为云云耀云服务器L实例评测 | 实例使用教学之高级使用:配置 Git SSH Key 进行自动识别拉代码

华为云云耀云服务器L实例评测 | 实例使用教学之高级使用:配置 Git SSH Key 进行自动识别拉代码 介绍华为云云耀云服务器 华为云云耀云服务器 (目前已经全新升级为 华为云云耀云服务器L实例) 华为云云耀云服务器是什么华为云云耀云…

05-进程控制

1. 学习目标 了解进程相关的概念掌握fork/getpid/getppid函数的使用熟练掌握ps/kill命令的使用熟练掌握execl/execlp函数的使用说出什么是孤儿进程什么是僵尸进程熟练掌握wait函数的使用熟练掌握waitpid函数的使用 2 进程相关概念 2.1 程序和进程 程序,是指编译好…

mysql数据库root密码忘记了,这里有一个简单的方法可以解决

mysql安装久了,就容易忘记root密码,那么下面这个找回密码的方法将解决你的问题: 特别注意事项: 本方法只适合mysql数据库密码遗忘(忘记了) 这个解决方案的前提是你的电脑里安装了navicat(其他…

阿桂天山的技术小结:Sqlalchemy+pyodbc连接MSSQL server测试

话不多说,有图有源码 1)确保本机安装了sql server对应的odbc驱动 在控制面板的管理工具中可以查:数据源(ODBC) 我这里已经安装了,如果没有安装可以自行下载安装 2)连接MsSql Server代码 # -*- coding: utf-8 -*- __author__ "阿桂天山"#----------判…

【位图+布隆过滤器】

目录 一、位图1.1位图的概念1.2位图的实现 二、布隆过滤器2.1布隆过滤器的概念2.2布隆过滤器的实现 三、位图的扩展--找只出现一次的数 一、位图 1.1位图的概念 所谓位图,就是用每一位来存放某种状态,适用于海量数据,数据无重复的场景。通常…