深度学习笔记之优化算法(七)总结与延伸:使用Nesterov动量的RMSProp算法

news2024/11/17 0:56:31

深度学习笔记之优化算法——总结与延伸:使用Nesterov动量的RMSProp算法

  • 引言
    • 回顾:优化方式区别
    • (2023/10/11) 关于指数加权移动平均法的补充
    • 算法过程描述
    • 基于Nesterov动量的RMSProp示例代码

引言

上一节介绍了 RMSProp \text{RMSProp} RMSProp算法,本节在其基础上进行延伸,介绍基于 Nesterov \text{Nesterov} Nesterov动量的 RMSProp \text{RMSProp} RMSProp算法

回顾:优化方式区别

在前面介绍的多种算法:动量法、 Nesterov \text{Nesterov} Nesterov动量法、 AdaGrad \text{AdaGrad} AdaGrad算法、 RMSProp \text{RMSProp} RMSProp算法,其本质上均是针对梯度下降法的优化方法。从优化方式的角度划分,可以将上述方法分为两类

  • 梯度方向进行优化。对应算法:动量法、 Nesterov \text{Nesterov} Nesterov动量法。它们的共同点是均利用了历史累积梯度对当前梯度进行优化。两者的不同点在于:

    • 动量法是通过当前迭代步骤梯度 ∇ θ ; t − 1 J ( θ t − 1 ) \nabla_{\theta;t-1} \mathcal J(\theta_{t-1}) θ;t1J(θt1)历史累积梯度 m t − 1 m_{t-1} mt1进行加权运算(向量加法),从而得到当前迭代步骤更新梯度 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
    • Nesterov \text{Nesterov} Nesterov动量法则是通过历史累积梯度 m t − 1 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)进行加法运算的方式得到 m t m_t mt
      { m t = β ⋅ m t − 1 + ( 1 − β ) ⋅ ∇ θ ; t − 1 ( θ 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}(\theta_{t-1} + \gamma \cdot m_{t-1}) \\ \theta_t = \theta_{t-1} - \eta \cdot m_t \end{cases} {mt=βmt1+(1β)θ;t1(θt1+γmt1)θt=θt1ηmt
  • 梯度大小(学习率)进行优化。对应算法: AdaGrad \text{AdaGrad} AdaGrad算法、 RMSProp \text{RMSProp} RMSProp算法。它们的不同点仅在: RMSProp \text{RMSProp} RMSProp算法在 AdaGrad \text{AdaGrad} 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 RMProp :  { G t = ∇ θ ; t − 1 J ( θ t − 1 ) R t = β ⋅ R t − 1 + ( 1 − β ) ⋅ G t ⊙ G t θ t = θ t − 1 − η R t + ϵ ⊙ G t \begin{aligned} \text{AdaGrad : } & \begin{cases} \mathcal G_t = \nabla_{\theta;t-1} \mathcal J(\theta_{t-1}) \\ \mathcal R_t = \mathcal R_{t-1} + \mathcal G_t \odot \mathcal G_t \\ \begin{aligned} \theta_t = \theta_{t-1} - \frac{\eta}{\sqrt{\mathcal R_t} + \epsilon} \odot \mathcal G_t \end{aligned} \end{cases} \\ \text{RMProp : } & \begin{cases} \mathcal G_t = \nabla_{\theta;t-1} \mathcal J(\theta_{t-1}) \\ \mathcal R_t = \beta \cdot \mathcal R_{t-1} + (1 - \beta) \cdot \mathcal G_t \odot \mathcal G_t \\ \begin{aligned} \theta_t = \theta_{t - 1} - \frac{\eta}{\sqrt{\mathcal R_t} + \epsilon} \odot \mathcal G_t \end{aligned} \end{cases} \\ \end{aligned} AdaGrad : RMProp :  Gt=θ;t1J(θt1)Rt=Rt1+GtGtθt=θt1Rt +ϵηGt Gt=θ;t1J(θt1)Rt=βRt1+(1β)GtGtθt=θt1Rt +ϵηGt

但上述两类优化方法由于针对梯度的不同角度(梯度方向、梯度大小),因而两者之间互不影响。本节将两种优化思想共同作用在一个算法中,即:基于 Nesterov \text{Nesterov} Nesterov动量的 RMSProp \text{RMSProp} RMSProp算法

(2023/10/11) 关于指数加权移动平均法的补充

在之前深度学习优化算法中,关于指数加权移动平均法,我们有意的避开一些点。但在基于 Nesterov \text{Nesterov} Nesterov动量的 RMSProp \text{RMSProp} RMSProp算法中,由于梯度方向、梯度大小(学习率) 均使用了指数加权移动平均法,关于《深度学习(花书)》中的算法描述,这里简单描述两类加权方法之间的区别

  • 在《深度学习(花书)》中,关于动量加权平均方法表示如下:
    详见《深度学习(花书)》P182 8.3.2动量 算法8.2
    { m t = γ ⋅ m t − 1 − η ⋅ G θ t = θ t − 1 + m t \begin{cases} m_t = \gamma \cdot m_{t-1} - \eta \cdot \mathcal G \\ \theta_t = \theta_{t-1} + m_t \end{cases} {mt=γmt1ηGθt=θt1+mt
  • 它与我们在 Nesterov \text{Nesterov} Nesterov动量法的简单认识中介绍动量法中的加权平均方法存在一些区别:
    { m t = β ⋅ m t − 1 + ( 1 − β ) ⋅ G θ t = θ t − 1 + η ⋅ m t \begin{cases} m_t = \beta \cdot m_{t-1} + (1 - \beta) \cdot \mathcal G \\ \theta_t = \theta_{t-1} + \eta \cdot m_t \end{cases} {mt=βmt1+(1β)Gθt=θt1+ηmt

第二种描述明显是:将历史梯度信息 m t − 1 m_{t-1} mt1当前迭代步骤梯度信息 G \mathcal G G按比例分配;而书中的描述仅将历史梯度信息 m t − 1 m_{t-1} mt1固定削减一个比例,而对当前迭代步骤梯度 G \mathcal G G不进行理会。但我们不否认的是:虽然后者更加简便,但依然能够达到适当地丢弃遥远过去的历史梯度信息

在书中基于 Nesterov \text{Nesterov} Nesterov动量的 RMSProp \text{RMSProp} RMSProp算法中,关于上述两种加权平均方法
如果有机会,也可以将其均改成第一种或者第二种加权平均方法,观察它们之间的关系(挖个坑)~

  • 对于梯度方向(动量) 的加权平均,它使用的是第一种方式
  • 对于梯度大小(学习率) 的加权平均,它使用的是第二种方式

算法过程描述

算法步骤表示如下:
初始化操作

  • 学习率 η \eta η;衰减因子 β \beta β;动量因子 γ \gamma γ
  • 初始化参数 θ \theta θ;初始动量 m m m;梯度累积信息 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

  • 计算临时的超前参数 θ ^ \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)]

  • 使用 R \mathcal R R通过指数加权移动平均法梯度内积 G ⊙ G \mathcal G \odot \mathcal G GG进行累积
    R ⇐ β ⋅ R + ( 1 − β ) ⋅ G ⊙ G \mathcal R \Leftarrow \beta \cdot \mathcal R + (1 - \beta) \cdot \mathcal G \odot \mathcal G RβR+(1β)GG

  • 计算动量更新:

    • 需要注意的点:通过历史动量与超前梯度更新当前迭代步骤动量 m m m的同时,超前梯度 G \mathcal G G自身也在被累积梯度优化的学习率更新;
    • 超参数 ϵ \epsilon ϵ消失了,虽然不知道为什么~
      m ⇐ γ ⋅ m − η R ⊙ G m \Leftarrow \gamma \cdot m - \frac{\eta}{\sqrt{\mathcal R}} \odot \mathcal G mγmR ηG
  • 计算参数 θ \theta θ更新:
    θ ⇐ θ + m \theta \Leftarrow \theta + m θθ+m

  • End While \text{End While} End While

基于Nesterov动量的RMSProp示例代码

依然使用凸函数 f ( x ) = x T Q x ; x = ( x 1 , x 2 ) T ; Q = ( 0.5 0 0 20 ) f(x) = x^T \mathcal Q x;x = (x_1,x_2)^T;\mathcal Q = \begin{pmatrix}0.5 \quad 0 \\ 0 \quad 20\end{pmatrix} f(x)=xTQx;x=(x1,x2)T;Q=(0.50020)作为目标函数,观察其迭代过程。对应代码表示如下:

import numpy as np
import math
import matplotlib.pyplot as plt
from tqdm import tqdm

def f(x, y):
    return 0.5 * (x ** 2) + 20 * (y ** 2)

def ConTourFunction(x, Contour):
    return math.sqrt(0.05 * (Contour - (0.5 * (x ** 2))))

def Derfx(x):
    return x

def Derfy(y):
    return 40 * y

def DrawBackGround():
    ContourList = [0.2, 1.0, 4.0, 8.0, 16.0, 32.0]
    LimitParameter = 0.0001
    for Contour in ContourList:
        # 设置范围时,需要满足x的定义域描述。
        x = np.linspace(-1 * math.sqrt(2 * Contour) + LimitParameter, math.sqrt(2 * Contour) - LimitParameter, 200)
        y1 = [ConTourFunction(i, Contour) for i in x]
        y2 = [-1 * j for j in y1]
        plt.plot(x, y1, '--', c="tab:blue")
        plt.plot(x, y2, '--', c="tab:blue")

def Process():
    Start = (8.0, 1.0)
    StartMomentum = (0.0, 0.0)
    LocList = list()
    LocList.append(Start)
    # 学习率;
    Eta = 0.1
    # Beta指RMSProp加权方法的参数;
    Beta = 0.8
    # Nesterov计算超前位置的参数以及Momentum加权方法的参数;
    alpha = 0.1
    R = 0.0
    Delta = 0.5

    while True:
        SpeedUpStart = (Start[0] + alpha * StartMomentum[0],Start[1] + alpha * StartMomentum[1])
        SpeedUpGradient = (Derfx(SpeedUpStart[0]),Derfy(SpeedUpStart[1]))
        SpeedUpInnerProduct = (SpeedUpGradient[0] ** 2) + (SpeedUpGradient[1] ** 2)

        # 累积梯度
        DecayR = R * Beta
        R = DecayR + ((1.0 - Beta) * SpeedUpInnerProduct)

        # 梯度大小(学习率)更新
        UpdateEta = -1 * (Eta / (math.sqrt(R)))
        UpdateMomentum = (alpha * StartMomentum[0] + UpdateEta * SpeedUpGradient[0],
                          alpha * StartMomentum[0] + UpdateEta * SpeedUpGradient[1])
        Next = (Start[0] + UpdateMomentum[0],Start[1] + UpdateMomentum[1])
        DerNext = (Derfx(Next[0]),Derfy(Next[1]))

        # 使用更新点梯度向量的模 < Delta作为停止准则(因为该函数存在唯一全局最优解,其梯度向量是零向量);
        if math.sqrt((DerNext[0] ** 2) + (DerNext[1] ** 2)) < Delta:
            break
        else:
            LocList.append(Next)
            StartMomentum = UpdateMomentum
            Start = Next
    return LocList

def DrawPicture():
    NesterovRMSPropLocList = Process()
    plt.figure(figsize=(10,5))
    NesterovRMSPropplotList = list()
    DrawBackGround()
    for (x, y) in tqdm(NesterovRMSPropLocList):
        NesterovRMSPropplotList.append((x, y))
        plt.scatter(x, y, s=30, facecolor="none", edgecolors="tab:red", marker='o')
        if len(NesterovRMSPropplotList) < 2:
            continue
        else:
            plt.plot([NesterovRMSPropplotList[0][0], NesterovRMSPropplotList[1][0]], [NesterovRMSPropplotList[0][1], NesterovRMSPropplotList[1][1]], c="tab:red")
            NesterovRMSPropplotList.pop(0)
    plt.show()

if __name__ == '__main__':
    DrawPicture()

对应图像结果表示如下:
NesterovRMSProp图像示例
这看起来与 RMSProp \text{RMSProp} RMSProp的图像结果没什么区别~原因在于:我们设置的动量参数alpha过小,从而依赖过去梯度信息的比例过小。可以固定学习率Eta以及 RMSProp \text{RMSProp} RMSProp加权参数Beta,对动量参数alpha ∈ [ 0 , 1 ) \in[0,1) [0,1)进行调整。对应图像表示如下。其中蓝色线表示alpha=0.9时的路径结果;而红色线表示alpha=0.1时的路径结果。
下图是Eta=0.1,beta=0.8时,各alpha对应的路径效果。
不同Alpha对应迭代路径效果
同理,我们同样可以固定动量参数alpha和学习率Eta,来观察 RMSProp \text{RMSProp} RMSProp加权参数Beta对迭代路径的影响
下图是Eta=0.1,alpha=0.9时,各Beta对应的路径效果。
不同Beta对应迭代路径效果
Reference \text{Reference} Reference
《深度学习(花书)》 P189 8.5.2 RMSProp \text{P189 8.5.2 RMSProp} P189 8.5.2 RMSProp

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

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

相关文章

【方法】PDF不能转换成其它格式如何解决?

想把PDF文件转换成其他格式&#xff0c;比如Word、PPT&#xff0c;却发现无法操作&#xff0c;这是什么情况呢&#xff1f;又该如何解决&#xff1f;下面我们一起来看看吧。 原因1&#xff1a;没有使用PDF编辑器 如果是在线打开PDF&#xff0c;或者使用PDF阅读器打开PDF&…

C++ opencv实现letterbox

代码&#xff1a; #include <iostream> #include "string" #include "opencv2/opencv.hpp"cv::Mat preprocess_img(cv::Mat& img, int input_w,int input_h) {int w,h,x,y;float r_winput_w/(img.cols*1.0);float r_hinput_h/(img.rows*1.0);if…

DC电源模块选用电容滤波器的注意事项

BOSHIDA DC电源模块选用电容滤波器的注意事项 DC电源模块是电子系统中的重要部件&#xff0c;常用于给各种电子设备供电。为了使输出的直流电压更加稳定&#xff0c;需要在电源模块中加入电容滤波器。电容滤波器的作用是平滑输出的直流电压&#xff0c;去除其中的纹波信号&…

记录--`ElementUI` 中的奇技淫巧

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 在ElementUI的世界中&#xff0c;不仅有基础的组件和功能&#xff0c;还有一些让你眼前一亮、*得不能再*的高级技巧和窍门。本文将揭示这些技巧&#xff0c;让你在前端开发的舞台上独领风骚。无论你是…

geecg-uniapp 同源策略 数据请求 页面渲染 ui库安装(3)

一&#xff0c;同源策略 &#xff08;1&#xff09;要是没有env 需要创建一个替换成后端接口 &#xff08;2&#xff09;因为他封装了 先找到http请求位置 一级一级找 然后进行接口修改 都改完运行即可 &#xff08;3&#xff09;appUpdata 二&#xff0c;数据请求 &…

如何在Ubuntu 20.04.6 LTS系统上运行Playwright自动化测试

写在前面 这里以 Ubuntu 20.04.6 LTS为例。示例代码&#xff1a;自动化测试代码。 如果过程中遇到其他非文本中提到的错误&#xff0c;可以使用搜索引擎搜索错误&#xff0c;找出解决方案&#xff0c;再逐步往下进行。 一、 环境准备 1.1 安装python3 1.1.1 使用APT安装Py…

[GXYCTF2019]Ping Ping Ping - RCE(空格、关键字绕过[3种方式])

[GXYCTF2019]Ping Ping Ping 1 解题流程1.1 小试牛刀1.2 三种解法1.2.1 解法一:变量定义拼接绕过1.2.2 解法二:base64编码绕过1.2.3 解法三:内联执行绕过2 思考总结1 解题流程 1.1 小试牛刀 1、提示?ip,结合题目名称,我们直接输入?ip=127.0.0.1 PING 127.0.0.1 (127.…

读书笔记-《ON JAVA 中文版》-摘要26[第二十三章 注解]

文章目录 第二十三章 注解1. 基本语法1.1 基本语法1.2 定义注解1.3 元注解 2. 编写注解处理器2.1 编写注解处理器2.2 注解元素2.3 默认值限制 3. 使用javac处理注解4. 基于注解的单元测试5. 本章小结 第二十三章 注解 注解&#xff08;也被称为元数据&#xff09;为我们在代码…

unity URP 利用particle system制作简单的shader交互

首先这里制作了一个简单交互&#xff0c;使用shader grapgh&#xff0c;根据计算距离和变化数值的差实现交互后的扩散&#xff0c;同时计算消散遮罩让它逐渐谈去。 将他赋予材质物体&#xff0c;根据脚本传入位置和逐渐变化的大小后&#xff0c;呈现这样的效果。 但是&#xff…

040:mapboxGL鼠标hover更换选中feature颜色

第040个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+mapbox中通过鼠标hover的方式来更换选中feature颜色。这里面利用了mousemove和mouseleave的方法,通过选中图层的feature,来设置hover的true或者false,从而通过opacity的case状态来判断透明度用哪一个值。 直接复…

6款流程图制作软件:一站式指南

流程图是一种常用的图示工具&#xff0c;可以帮助我们更清晰地表达和展示流程、流程图等内容。在今天已经变得非常普及和便捷&#xff0c;接下来本文将于大家分享6款好用的流程图软件&#xff0c;一起来看看吧&#xff01; 博思白板boardmix 博思白板boardmix是一款基于浏览器…

【HTML】web worker

Web Worker是HTML5中的一项技术&#xff0c;可以在后台运行JavaScript代码&#xff0c;以提高Web应用程序的性能并改善用户体验。它允许在独立的线程中执行耗时的操作&#xff0c;而不会阻塞主线程。 主线程是浏览器用来渲染页面、处理用户交互和执行JavaScript代码的线程。然…

记录一次紧急的版本切换

背景 由于一些特殊原因&#xff0c;需要前同事的代码。他并没有给我们后端一份他走时的src。因此这边需要拉到前同事的代码。 过程 查看版本信息 前同事和我们现在开发用的是一个gitee仓库。因此&#xff0c;我们可以看一下之前的开发线。 说白了&#xff0c;每一次提交&a…

【数据结构】算法之道与实践指南:深入理解二叉树的遍历和分治思想(一)

&#x1f6a9;纸上得来终觉浅&#xff0c; 绝知此事要躬行。 &#x1f31f;主页&#xff1a;June-Frost &#x1f680;专栏&#xff1a;数据结构 &#x1f525;该文章主要讲述二叉树的递归结构及分治算法的思想。 目录&#xff1a; &#x1f30d;前言&#xff1a;&#x1f30d;…

面试准备-软件工程

参考&#xff1a; 《程序员面试笔试宝典》&#xff08;何昊、叶向阳&#xff09; 标准的软件开发过程&#xff1a; 1&#xff09;可行性分析&#xff1a;要确定开发目标和总要求&#xff0c;一般要考虑技术是否可行&#xff0c;收益是否可行、用户操作是否可行&#xff0c;是…

【C++】如何使用RapidXML读取和创建XML文件

2023年10月11日&#xff0c;周三下午 目录 RapidXML的官网使用rapidXML读取XML文件中的元素的属性和值此次要读取的XML文件&#xff1a;ReadExample.xml用于读取此XML文件的C代码运行结果使用rapidXML创建XML文件用于创建XML文件的C代码 如果上面的代码无法运行运行结果​编辑…

Peter算法小课堂—DP背包问题

大家好&#xff0c;我是Peter&#xff0c;我又来啦&#x1f388;&#x1f384;✨ &#x1f388;&#x1f9e8;&#x1f389;《动态规划》专栏来啦&#xff0c;目前为止&#xff0c;此专栏已经有四篇文章啦&#x1f381;&#x1f380;&#x1f384; 1.DP概念与编程方法 DP概念…

交叉熵Loss多分类问题实战(手写数字)

1、import所需要的torch库和包 2、加载mnist手写数字数据集&#xff0c;划分训练集和测试集&#xff0c;转化数据格式&#xff0c;batch_size设置为200 3、定义三层线性网络参数w&#xff0c;b&#xff0c;设置求导信息 4、初始化参数&#xff0c;这一步比较关键&#xff0c;…

bootz启动 Linux内核涉及do_bootm_linux 函数

一. bootz启动Linux uboot 启动Linux内核使用bootz命令。当然还有其它的启动命令&#xff0c;例如&#xff0c;bootm命令等等。 本文只分析 bootz命令启动 Linux内核的过程中涉及的几个重要函数。具体分析 do_bootm_linux函数执行过程。 本文继上一篇文章&#xff0c;地址…

vue3 + element Plus实现表格根据关键字合并行,并实现行的增删改操作

根据关键字合并表格 1.实现初始化表格2.实现添加班级与学生的功能3.添加的弹窗4.删除班级5.删除学生 首先看最终实现的效果 1.实现初始化表格 <template><div class"main-page"><div class"flex-end"><div class"public-search…