深度学习笔记之优化算法(四)Nesterov动量方法的简单认识

news2024/11/28 14:41:16

机器学习笔记之优化算法——Nesterov动量方法的简单认识

  • 引言
    • 回顾:梯度下降法与动量法
    • Nesterov动量法
    • Nesterov动量法的算法过程描述
    • 总结

引言

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

回顾:梯度下降法与动量法

关于梯度下降法的迭代步骤描述如下:
θ ⇐ θ − η ⋅ ∇ θ J ( θ ) \theta \Leftarrow \theta - \eta \cdot \nabla_{\theta} \mathcal J(\theta) θθηθJ(θ)
标准二次型 f ( x ) = x T Q x , Q = ( 0.5 0 0 20 ) , x = ( x 1 , x 2 ) T f(x) = x^T \mathcal Qx,\mathcal Q = \begin{pmatrix} 0.5 \quad 0 \\ 0 \quad 20 \end{pmatrix},x = (x_1,x_2)^T f(x)=xTQx,Q=(0.50020),x=(x1,x2)T为目标函数,使用梯度下降法求解目标函数 f ( x ) f(x) f(x)最小值的迭代过程如下:
梯度下降法在病态条件下凸二次函数示例
很明显,由于 Q \mathcal Q Q的原因,导致在算法迭代过程中,迭代更新点对应的 Hessian Matrix ⇒ ∇ 2 f ( ⋅ ) \text{Hessian Matrix} \Rightarrow \nabla^2 f(\cdot) Hessian Matrix2f()中的条件数都较大,从而使梯度下降法在该凸二次函数中的收敛速度沿着次线性收敛的方向退化,这也是图像中迭代路径震荡、折叠严重的主要原因。

这里仅观察少量几次迭代步骤,见下面局部图
梯度下降法——局部图

其中红色线表示梯度下降法在迭代过程中的更新方向;以第一次迭代的更新方向为例,将该方向进行分解,可以得到上述两个方向分量
由于目标函数 f ( x ) f(x) f(x) x x x是一个二维向量,因而在上图中的蓝色箭头分别描述了该方向在 x 1 , x 2 x_1,x_2 x1,x2正交基上的分量。

从上述两个分量可以看出:

  • 关于横轴分量,它一直指向前方,也就是最优解的方向
  • 而造成迭代过程震荡、折叠的是纵轴分量。

综上,从观察的角度描述迭代路径震荡折叠现象严重的原因在于:横轴上的分量向前跨越的步幅很小;相比之下,纵轴上的分量上下的波动很大。针对该现象,可以得到相应的优化思路
具体效果见下图绿色实心箭头,其中第一步红色与绿色实线箭头重合,因为在初始化过程中通常将动量向量初始化为零向量导致,这里以第二次迭代为例进行描述。图中的红色虚线表示梯度下降法当前迭代步骤在横轴、纵轴上的分量;绿色虚线则表示优化思路在当前步骤在横轴、纵轴上的分量。

  • 压缩纵轴分量上的波动幅度
  • 拉伸/延长横轴分量上的步幅,从而使其更快地达到极值点

优化思路示例
如何从数学角度达到这样的效果利用过去迭代步骤中的梯度数据,对当前迭代步骤的梯度信息进行修正。继续观察第二次迭代步骤:
第二次迭代步骤完整描述
第一次迭代步骤结束后,我们得到了一个历史梯度的分量信息,即图中的蓝色虚线;在执行第二次迭代步骤时,我们需要将该步骤的梯度分量与相应的历史梯度分量执行加权运算

  • 观察纵轴分量:由于历史纵轴分量与当前纵轴分量方向相反(红色、蓝色虚线垂直箭头),这势必会缩减当前迭代步骤的纵轴分量
  • 相反,观察横轴分量:历史横轴分量与当前横轴分量方向相同(红色、蓝色虚线横向箭头),这必然会扩张当前迭代步骤的横轴分量

如何对历史梯度信息进行描述,我们需要引入一个新的变量 m m m,用于累积历史梯度信息:
{ m t = m t − 1 + ∇ θ ; t − 1 J ( θ t − 1 ) θ t = θ t − 1 − η ⋅ m t \begin{cases} m_{t} = m_{t-1} + \nabla_{\theta;t-1} \mathcal J(\theta_{t-1}) \\ \theta_t = \theta_{t-1} - \eta \cdot m_t \end{cases} {mt=mt1+θ;t1J(θt1)θt=θt1ηmt

上式的 m t m_t mt确实达到了历史迭代步骤梯度累积的作用,但同样衍生出了新的问题上面步骤仅是将历史梯度信息完整地存储进来,如果迭代步骤较多的情况下,由于历史信息在累积过程中没有任何的丢失,最终可能导致:迭代步骤较深时,初始迭代步骤的历史梯度信息对当前时刻梯度的更新没有参考价值。相反,有可能会给当前迭代步骤引向错误的方向。因而关于 m t m_t mt的调整方式表示如下:
{ 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
关于上式的迭代加权运算被称作指数加权移动平均法。假设 β = 0.9 \beta = 0.9 β=0.9,关于 m t m_t mt的表示如下:
m t = 0.9 × m t − 1 + 0.1 × ∇ θ ; t − 1 J ( θ t − 1 ) = 0.9 × [ 0.9 × m t − 2 + 0.1 × ∇ θ ; t − 2 J ( θ t − 2 ) ] + 0.1 × ∇ θ ; t − 1 J ( θ t − 1 ) = ⋯ = 0.1 × 0. 9 0 × ∇ θ ; t − 1 J ( θ t − 1 ) + 0.1 × 0. 9 1 × ∇ θ ; t − 2 J ( θ t − 2 ) + 0.1 × 0. 9 2 × ∇ θ ; t − 3 J ( θ t − 3 ) + ⋯ + 0.1 × 0. 9 t − 1 × ∇ θ ; 1 J ( θ 1 ) \begin{aligned} m_t & = 0.9 \times m_{t-1} + 0.1 \times \nabla_{\theta;t-1} \mathcal J(\theta_{t-1}) \\ & = 0.9 \times \left[0.9 \times m_{t-2} + 0.1 \times \nabla_{\theta;t-2} \mathcal J(\theta_{t-2}) \right] + 0.1 \times \nabla_{\theta;t-1} \mathcal J(\theta_{t-1}) \\ & = \cdots \\ & = 0.1 \times 0.9^0 \times \nabla_{\theta;t-1} \mathcal J(\theta_{t-1}) + 0.1 \times 0.9^1 \times \nabla_{\theta;t-2} \mathcal J(\theta_{t-2}) + 0.1 \times 0.9^2 \times \nabla_{\theta;t-3} \mathcal J(\theta_{t-3}) + \cdots + 0.1 \times 0.9^{t-1} \times \nabla_{\theta;1} \mathcal J(\theta_1) \end{aligned} mt=0.9×mt1+0.1×θ;t1J(θt1)=0.9×[0.9×mt2+0.1×θ;t2J(θt2)]+0.1×θ;t1J(θt1)==0.1×0.90×θ;t1J(θt1)+0.1×0.91×θ;t2J(θt2)+0.1×0.92×θ;t3J(θt3)++0.1×0.9t1×θ;1J(θ1)
很明显,距离当前迭代步骤越近的梯度,其保留权重越大;反之,随着迭代步骤的推移,越靠近初始迭代步骤的梯度权重越小。
这让我想起了 GRU \text{GRU} GRU神经网络~

这种方法就是动量法,也被称作冲量法

Nesterov动量法

关于梯度下降法的优化,不仅可以像动量法一样考虑历史迭代步骤的梯度信息,实际上,我们同样可以超前参考未来的梯度信息

关于动量法在某迭代步骤中的更新过程示例如下:
动量法某迭代步骤更新过程

  • 其中黄色结点表示动量法在迭代过程中的更新位置淡蓝色曲线表示理想状态下下降路径
  • 其中红色实线表示梯度下降法的更新方向;蓝色实线表示历史梯度构成的冲量信息
    很明显,当前迭代步骤的梯度方向与更新点处更高线的切线相垂直~

假设 β = 0.5 \beta = 0.5 β=0.5,图中的橘黄色虚线表示加权后真正的更新方向。我们不否认:此时动量法相比纯粹的梯度下降法,其下降路径更接近理想状态路径。两者比对效果如下:
很明显,梯度下降法不仅多使用一次迭代步骤,并且最后结果依然不及两步的动量法。
梯度下降法vs动量法
但即便动量法有更优的下降路径,但依然距离理想状态下的下降路径存在差距。

假设:在动量法执行完第一次迭代步骤前,就已经预估到了未来步骤的位置信息,那么通过未来步骤加权的第一次迭代的位置信息会进一步得到修正。从数学角度观察 Nesterov \text{Nesterov} Nesterov动量法是如何实现超前参考的。回顾动量法公式:
{ 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
其中 ∇ θ ; t − 1 J ( θ t − 1 ) \nabla_{\theta;t-1} \mathcal J(\theta_{t-1}) θ;t1J(θt1)表示当前迭代步骤 t t t的梯度信息;而 Nesterov \text{Nesterov} Nesterov动量法是将上一迭代步骤的 θ t − 1 ⇐ θ t − 1 + γ ⋅ m t − 1 \theta_{t-1} \Leftarrow \theta_{t- 1} + \gamma \cdot m_{t-1} θt1θt1+γmt1,从而得到一个新时刻的未知的权重信息,并使用该信息替换 θ t − 1 \theta_{t-1} θt1参与运算:
之所以是新时刻,或者说是未来时刻,是因为当前迭代步骤的 θ t \theta_t θt还没有被解出来,而 θ t − 1 + γ ⋅ m t − 1 \theta_{t-1} + \gamma \cdot m_{t-1} θt1+γmt1又确实是超越了 t − 1 t-1 t1迭代步骤的新信息
{ 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

继续观察上式:关于超前信息 θ t − 1 + γ ⋅ m t − 1 \theta_{t-1} + \gamma \cdot m_{t-1} θt1+γmt1,它的格式与 θ t = θ t − 1 − η ⋅ m t \theta_t = \theta_{t-1} - \eta \cdot m_{t} θt=θt1ηmt非常相似,相当于该超前信息 θ t − 1 \theta_{t-1} θt1 m t − 1 m_{t-1} mt1之间的加权方向
为简化起见,这里仅描述一步: t − 1 ⇒ t t-1 \Rightarrow t t1t

  • 初始状态下,下图描述的是动量法的一次迭代步骤;红色实线表示 ∇ θ ; t − 1 ∇ J ( θ t − 1 ) \nabla_{\theta;t-1} \nabla \mathcal J(\theta_{t-1}) θ;t1J(θt1)蓝色实线表示 m t − 1 m_{t-1} mt1,中间的橙黄色虚线表示两者的加权结果 m t = β ⋅ m t − 1 + ( 1 − β ) ⋅ ∇ θ ; t − 1 J ( θ t − 1 ) m_t = \beta \cdot m_{t-1} + (1 - \beta) \cdot \nabla_{\theta;t-1} \mathcal J(\theta_{t-1}) mt=βmt1+(1β)θ;t1J(θt1)
    初始状态
  • 那么超前信息 θ t − 1 + γ ⋅ m t − 1 \theta_{t-1} + \gamma \cdot m_{t-1} θt1+γmt1如何表示 ? ? ?假设图中 θ t − 1 \theta_{t-1} θt1红色点的长度为 γ ⋅ m t − 1 \gamma \cdot m_{t-1} γmt1,那么红色点的位置就是超前信息的位置
    寻找超前信息的位置
  • 至此,可以描述 ∇ θ ; t − 1 J ( θ t − 1 + γ ⋅ m t − 1 ) \nabla_{\theta;t-1} \mathcal J(\theta_{t-1} + \gamma \cdot m_{t-1}) θ;t1J(θt1+γmt1)方向过红色点,与目标函数等高线相垂直的方向
    图中的红色虚线表示 ∇ θ ; t − 1 J ( θ t − 1 + γ ⋅ m t − 1 ) \nabla_{\theta;t-1} \mathcal J(\theta_{t-1} + \gamma \cdot m_{t-1}) θ;t1J(θt1+γmt1)的方向,仔细观察可以发现,它与 ∇ θ ; t − 1 J ( θ t − 1 ) \nabla_{\theta;t-1} \mathcal J(\theta_{t-1}) θ;t1J(θt1)描述的红色实线之间存在一丢丢的偏移,不是平行的~
    寻找超前位置的梯度
  • 接下来,将红色虚线替代红色实线,并得到 Nesterov \text{Nesterov} Nesterov动量法中的 m t = β ⋅ m t − 1 + ( 1 − β ) ⋅ ∇ θ ; t − 1 J ( θ t − 1 + γ ⋅ m t − 1 ) m_{t} = \beta \cdot m_{t-1} + (1 - \beta) \cdot \nabla_{\theta;t-1} \mathcal J(\theta_{t-1} + \gamma \cdot m_{t-1}) mt=βmt1+(1β)θ;t1J(θt1+γmt1)
    橙黄色虚线指向的红色点表示 Nesterov \text{Nesterov} Nesterov动量法中的经过 η \eta η修饰的 m t m_t mt结果(这里暂定 η \eta η不变的情况下),我们仍可以看出,相比于动量法, Nesterov \text{Nesterov} Nesterov动量法在迭代过程中能够更偏向理想状态下降路径
    计算新的更新方向

Nesterov动量法的算法过程描述

基于 Nesterov \text{Nesterov} Nesterov动量法的随机梯度下降的算法步骤表示如下:
初始化操作

  • 学习率 η \eta η,动量因子 γ \gamma γ
  • 初始化参数 θ \theta θ,初始动量 m m m

算法过程

  • 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
  • 应用临时的超前参数 θ ^ \hat \theta θ^
    θ ^ ⇐ θ + γ ⋅ m \hat \theta \Leftarrow \theta + \gamma \cdot m θ^θ+γm
  • 使用超前参数 θ ^ \hat \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)};\hat \theta),y^{(i)}] Gk1i=1kθL[f(x(i);θ^),y(i)]
  • 计算动量更新:
    m ⇐ γ ⋅ m − η ⋅ G m \Leftarrow \gamma \cdot m - \eta \cdot \mathcal G mγmηG
  • 计算参数 θ \theta θ更新:
    θ ⇐ θ + m \theta \Leftarrow \theta + m θθ+m
  • End While \text{End While} End While

总结

观察上述算法过程,可以发现:虽然我们更新的是 θ \theta θ,但整个算法至始至终都没有求解 θ \theta θ的梯度 ∇ θ J ( θ ) \nabla_{\theta} \mathcal J(\theta) θJ(θ),也就是说: m m m中的历史信息也均是超前梯度 ∇ θ J ( θ + γ ⋅ m ) \nabla_{\theta} \mathcal J(\theta + \gamma \cdot m) θJ(θ+γm)构成的历史信息。

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

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

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

相关文章

在SOLIDWORKS搭建一个简易的履带式机器人

文章目录 前言一、构建模型基本单元二、搭建车体模块三.插入轮子4.构建履带 前言 趁着十一假期,在solidworks中搭建了一个履带式机器人小车,计划将其应用在gazebo中完成多机器人编队的仿真。 一、构建模型基本单元 构建底板(a面&#xff09…

第六讲:构建类的事件(下)

《VBA中类的解读及应用》教程【10165646】是我推出的第五套教程,目前已经是第一版修订了。这套教程定位于最高级,是学完初级,中级后的教程。 类,是非常抽象的,更具研究的价值。随着我们学习、应用VBA的深入&#xff0…

.some方法、vh、多列布局、DNS域名解析过程、空页面文字内容渲染

nodeEndTime.some((time) > !!time) 这个方法主要用来判断nodeEndTime这个数组中是否有至少一个非假值的元素。它会遍历 nodeEndTime 数组中的每个元素,如果至少有一个元素是真值(不是 null、undefined、0、false 或空字符串等假值&#x…

Flutter学习笔记

此篇文章用来记录学习Flutter 和 Dart 相关知识 零.Dart基本数据类型 Dart 是一种静态类型的编程语言,它提供了一系列基本数据类型,用于存储和操作不同种类的数据。以下是 Dart 中的一些基本数据类型以及它们的详细介绍: 1. 整数类型&#…

python学习——各种模块argparse、os、sys、time、re、sched、函数体

python学习——各种模块argparse、os、sys、time、re、sched、函数体 各种模块学习1. python脚本2. argparse模块:撰写帮助文档,命令行参数定义等3. os模块:用于文件/目录路径或名字的获取4. sys模块:用于对命令行参数进行获取处理…

车企“新四化”之——安全高效的电动汽车和混动汽车高压测量方案

一 背景 汽车行业正经历着“新四化”从概念向实际转化的过程(新四化即电动化、智能化、网络化、共享化),各大车企也将调整发展布局,而混合动力及电动汽车自然就成为了主要关注点。 对于混合动力汽车(PHEV&#xff09…

ReentrantLock锁与AQS的联系

请先看——————>AQS的简单说明 ReentrantLock底层是基于AQS实现的,在并发编程中可以实现公平锁和非公平锁来对同步资源进行控制,默认是非公平锁,并且是可重入锁。 1.ReentrantLock的体系关联结构 2.构造方法 可以发现ReentrantLock…

Spring Security——基于前后端分离项目的使用(安全框架)

1.简介 Spring Security有一个过滤器链,也就是说原本在拦截器和过滤器里面做的事都可以用Spring Security完成,比如验证token和将用户id存入线程上下文局部变量等等。 入门案例 创建项目并勾选依赖 最基本的要这两个依赖即可 新建一个Controller层的…

Dubbo v Spring Cloud:两大技术栈如何选型?

Java全能学习面试指南:https://javaxiaobear.cn 提到微服务开源框架,不可不说的是 Dubbo 和 Spring Cloud,这两大框架应该是大家最熟悉的微服务解决方案,也是面试中的热点。今天我们梳理下 Dubbo 和 Spring Cloud 的应用特性&…

win10 U盘安装教程

一年内,第三次重装电脑了,我必须要写一份教程了。从制作U盘开始,到重装系统,全部都记录一下,以备不时之需。 首先,找一个U盘,如果U盘内有需要文件,请自行备份,因为这个U盘…

“双节”出游,VR智慧景区让你的旅游更具“心价比”

中秋国庆八天长假落幕,全国旅游消费市场人气旺、活力足,黄金周旅游消费的变化凝结成为新的文旅趋势,更多的游客会选择人少、景美、价优的错峰游,为了享受品质游玩,VR全景展示为众多游客带来旅游新体验,让你…

分类预测 | MATLAB实现KOA-CNN-BiLSTM开普勒算法优化卷积双向长短期记忆神经网络数据分类预测

分类预测 | MATLAB实现KOA-CNN-BiLSTM开普勒算法优化卷积双向长短期记忆神经网络数据分类预测 目录 分类预测 | MATLAB实现KOA-CNN-BiLSTM开普勒算法优化卷积双向长短期记忆神经网络数据分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.MATLAB实现KOA-CNN-BiLST…

洗地机怎么选?2023年洗地机推荐

洗地机结合洗地、拖地、扫地的功能,在日常生活中备受关注,他能帮助我们更加节省时间和节省体力,但是面对参差不齐的洗地机市场如何选到适合自己的呢,下文整理了几款非常值得入手的性价比型号,供大家选择参考。 一、CE…

SpringBoot项目创建

创建SpringBoot项目: 选择maven项目,选择Java版本 选择springboot版本(这里随便选择,后面会进行更改,用不到这么高的版本),选择所需要的对应工具。 然后下一步即可。 配置修改 ,结构…

7346-2015 控制电机基本外形结构型式

声明 本文是学习GB-T 7346-2015 控制电机基本外形结构型式.pdf而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本标准规定了控制电机的机座号、外形及安装尺寸、轴伸型式、出线方式、标记及铭牌。 本标准适用于各类控制电机(以下简称电机),其…

漏洞复现--中远麒麟堡垒机SQL注入

免责声明: 文章中涉及的漏洞均已修复,敏感信息均已做打码处理,文章仅做经验分享用途,切勿当真,未授权的攻击属于非法行为!文章中敏感信息均已做多层打马处理。传播、利用本文章所提供的信息而造成的任何直…

性能监控-微服务链路追踪skywalking搭建

中文文档:hong设置 (skyapm.github.cio) 参考:微服务链路追踪SkyWalking的介绍和部署_skywalking部署_技术闲聊DD的博客-CSDN博客 参考:链路追踪SkyWalking整合项目以及数据持久化_skywalking 持久化_技术闲聊DD的博客-CSDN博客 Liunx部署skywalking以…

python每日一练(2)

🌈write in front🌈 🧸大家好,我是Aileen🧸.希望你看完之后,能对你有所帮助,不足请指正!共同学习交流. 🆔本文由Aileen_0v0🧸 原创 CSDN首发🐒 如…

【debian 12】:debian系统切换中文界面

目录 目录 项目场景 基础参数 原因分析 解决方案 1.ctrlaltT 打开终端 2.查询当前语言环境(我的已经设置成了中文 zh_CN.UTF-8) 3.打开语言配置界面 4.最后一步:重启 不要放弃任何一个机会! 项目场景: 这两…

项目进展(十)-解决ADS1285在调试时出现的问题

一、解决大坑 在项目进展(九)-完善ADS1285代码这边博客中,看似解决了问题,可以去读数据,但是其实是给自己挖大坑,这边博客就是来填坑的。   首先呢,上篇博客说的是用0x12指令来读取数据&#…