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

news2024/11/17 6:22:36

深度学习笔记之优化算法——RMSProp算法的简单认识

  • 引言
    • 回顾:AdaGrad算法
      • AdaGrad算法与动量法的优化方式区别
      • AdaGrad算法的缺陷
    • RMProp算法
      • 关于AdaGrad问题的优化方式
      • RMSProp的算法过程描述
    • RMSProp示例代码

引言

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

回顾:AdaGrad算法

AdaGrad算法与动量法的优化方式区别

动量法、 Nesterov \text{Nesterov} Nesterov动量法在迭代过程中对梯度方向进行优化不同, AdaGrad \text{AdaGrad} AdaGrad算法在迭代过程中对梯度大小(学习率)进行优化,两者优化的思路本质上存在区别。其迭代过程对比表示如下:

  • 关于动量法在计算当前迭代步骤的梯度 m t m_t mt时,使用了 m t − 1 , ∇ θ ; t − 1 J ( θ t − 1 ) m_{t-1},\nabla_{\theta;t-1} \mathcal J(\theta_{t-1}) mt1,θ;t1J(θt1)加权和(向量加法)的方式来优化 m t m_t mt的方向;当方向固定后,在判断沿着 m t m_t mt方向前进的步长时,仅使用了固定的学习率 η \eta η作为前进步长。
  • AdaGrad \text{AdaGrad} AdaGrad算法对当前时刻的梯度信息 G t \mathcal G_t Gt并没有执行任何方向上的优化;在判断步长时使用 η R t + ϵ ⇒ η \begin{aligned}\frac{\eta}{\sqrt{\mathcal R_t} + \epsilon} \Rightarrow \eta\end{aligned} Rt +ϵηη执行更新操作,其本质上是向量与标量之间的乘法操作
    Momentum :  { m t = β ⋅ m t − 1 + ( 1 − β ) ⋅ ∇ θ ; t − 1 J ( θ t − 1 ) θ t = θ t − 1 − η ⋅ m t 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{aligned} & \text{Momentum : } \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} \\ & \text{AdaGrad : } \quad \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} \end{aligned} Momentum : {mt=βmt1+(1β)θ;t1J(θt1)θt=θt1ηmtAdaGrad :  Gt=θ;t1J(θt1)Rt=Rt1+GtGtθt=θt1Rt +ϵηGt

AdaGrad算法的缺陷

引入上一节使用 AdaGrad \text{AdaGrad} AdaGrad算法对目标函数 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)迭代过程:Adagrad算法图像示例
我们能够观察到:虽然该算法在梯度较小的、平缓的倾斜方向能够稳定的前进,但是同样也会观察到:在迭代算法的中后段,算法消耗了相当多的迭代步骤,原因也很明显:此时的学习率 η \eta η太小了,并且还会无限的小下去

上述示例中的目标函数是一个强凸函数,它存在全局最优解;因此迭代的最终结果也只会趋近最优解;但如果目标函数是一个复杂函数 ? ? ?就像这样:
画的不太好,凑合着看~
非凸复杂函数示例
观察上图,黄色点描述的是使用 AdaGrad \text{AdaGrad} AdaGrad算法,权重不同迭代步骤下的更新位置;如果该目标函数是一个简单的凸函数,它可能最终会收敛至某一点,例如红色点;但如果该函数比较复杂,在本段迭代过程之后,梯度又重新增加(图中最左侧黄点位置)那么此时的收敛速度又是什么样的呢 ? ? ?

上一节提到过: AdaGrade \text{AdaGrade} AdaGrade的学习率只会减小,不会增加,即便后续的梯度又重新增大,但它的学习率不会增加,只会更加缓慢地继续更新
对应《深度学习(花书)》P188 8.5.1中的原文:从训练开始时累积梯度平方会导致有效学习率过早地、过量地减小

之所以 AdaGrad \text{AdaGrad} AdaGrad算法的学习率只减不增,究其原因还是:在累积平方梯度的过程中,平方梯度 G t ⊙ G t \mathcal G_t \odot \mathcal G_t GtGt完整地保存在累积梯度变量 R \mathcal R R。这种现象在 Nesterov \text{Nesterov} Nesterov动量法中也提到过:在迭代步骤较深时,初始迭代步骤的历史平方梯度对当前步骤没有参考价值

RMProp算法

关于AdaGrad问题的优化方式

针对上述问题,同样可以按照动量法的思路:通过指数加权移动平均法适当地丢弃遥远过去的历史平方梯度。优化后的公式表示如下:
视频中的描述(文章下方链接) 33:14 \text{33:14} 33:14与《深度学习(花书)》中的公式关于 ϵ \epsilon ϵ的位置存在稍许不同,对比如下:
AdaGrad :  { G t = ∇ θ ; t − 1 J ( θ t − 1 ) R t = R t − 1 + G t ⊙ G t θ t = θ t − 1 − η R t + ϵ ⊙ G t Video(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 DeepLearning(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{Video(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} \\ \text{DeepLearning(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 : Video(RMProp) : DeepLearning(RMProp) :  Gt=θ;t1J(θt1)Rt=Rt1+GtGtθt=θt1Rt +ϵηGt Gt=θ;t1J(θt1)Rt=βRt1+(1β)GtGtθt=θt1Rt +ϵηGt Gt=θ;t1J(θt1)Rt=βRt1+(1β)GtGtθt=θt1Rt+ϵ ηGt
这种操作旨在:当执行迭代步骤时,只有之前的若干次迭代步骤对当前步骤产生影响

RMSProp的算法过程描述

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

  • 学习率 η \eta η; 衰减因子 β \beta β
  • 初始化参数 θ \theta θ;梯度累积信息 R = 0 \mathcal R = 0 R=0;超参数 ϵ = 1 0 − 7 \epsilon = 10^{-7} ϵ=107

算法过程

  • 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 \mathcal G G
    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通过指数加权移动平均法梯度内积 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
  • 计算参数 θ \theta θ更新信息 Δ θ \Delta \theta Δθ
    这里暂时使用《深度学习(花书)》中的描述。
    Δ θ = − η R t + ϵ ⋅ G \Delta \theta = - \frac{\eta}{\sqrt{\mathcal R_t + \epsilon}} \cdot \mathcal G Δθ=Rt+ϵ ηG
  • 应用更新:
    θ ⇐ θ + Δ θ \theta \Leftarrow \theta + \Delta \theta θθ+Δθ
  • End While \text{End While} End While

RMSProp示例代码

RMSProp \text{RMSProp} RMSProp算法 AdaGrad \text{AdaGrad} AdaGrad算法进行对比,对应代码表示如下:

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(ax,Idx):
    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]
        ax[Idx].plot(x, y1, '--', c="tab:blue")
        ax[Idx].plot(x, y2, '--', c="tab:blue")

def Process(mode):
    assert mode in ["AdaGrad","RMSProp"]
    Start = (8.0, 1.0)
    LocList = list()
    LocList.append(Start)
    Eta = 0.2
    Beta = 0.8
    Epsilon = 0.0000001
    R = 0.0
    Delta = 0.1

    while True:
        DerStart = (Derfx(Start[0]), Derfy(Start[1]))
        InnerProduct = (DerStart[0] ** 2) + (DerStart[1] ** 2)

        if mode == "AdaGrad":
            R += InnerProduct
        else:
            DecayR = R * Beta
            R = DecayR + ((1.0 - Beta) * InnerProduct)

        UpdateEta = -1 * (Eta / (Epsilon + math.sqrt(R)))
        UpdateMessage = (UpdateEta * DerStart[0], UpdateEta * DerStart[1])
        Next = (Start[0] + UpdateMessage[0], Start[1] + UpdateMessage[1])
        DerNext = (Derfx(Next[0]), Derfy(Next[1]))

        # 这里终止条件使用梯度向量的模接近于Delta,一个很小的正值;
        if math.sqrt((DerNext[0] ** 2) + (DerNext[1] ** 2)) < Delta:
            break
        else:
            LocList.append(Next)
            Start = Next
    return LocList

def DrawPicture():
    AdaGradLocList = Process(mode="AdaGrad")
    RMSPropLocList = Process(mode="RMSProp")
    fig, ax = plt.subplots(2, 1, figsize=(8, 6))

    AdaGradplotList = list()
    ax[0].set_title("AdaGrad")
    DrawBackGround(ax,Idx=0)
    for (x, y) in tqdm(AdaGradLocList):
        AdaGradplotList.append((x, y))
        ax[0].scatter(x, y, s=30, facecolor="none", edgecolors="tab:orange", marker='o')
        if len(AdaGradplotList) < 2:
            continue
        else:
            ax[0].plot([AdaGradplotList[0][0], AdaGradplotList[1][0]], [AdaGradplotList[0][1], AdaGradplotList[1][1]], c="tab:orange")
            AdaGradplotList.pop(0)

    RMSPropplotList = list()
    ax[1].set_title("RMSProp")
    DrawBackGround(ax, Idx=1)
    for (x, y) in tqdm(RMSPropLocList):
        RMSPropplotList.append((x, y))
        ax[1].scatter(x, y, s=30, facecolor="none", edgecolors="tab:red", marker='o')
        if len(RMSPropplotList) < 2:
            continue
        else:
            ax[1].plot([RMSPropplotList[0][0], RMSPropplotList[1][0]], [RMSPropplotList[0][1], RMSPropplotList[1][1]], c="tab:red")
            RMSPropplotList.pop(0)
    plt.show()

if __name__ == '__main__':
    DrawPicture()

对应图像结果表示如下:
AdaGradVSRMSProp
对比图像可以看出:关于 RMSProp \text{RMSProp} RMSProp的迭代步骤明显少于 AdaGrad \text{AdaGrad} AdaGrad
回头再次观察 RMSProp \text{RMSProp} RMSProp迭代公式,可以发现:虽然 RMSprop \text{RMSprop} RMSprop算法对 AdaGrad \text{AdaGrad} AdaGrad进行了改进,但其本质上依然是对梯度的大小(学习率)进行优化。下一节我们将对 RMSProp \text{RMSProp} RMSProp进行延伸——从梯度方向、梯度大小(学习率)两个角度同时对梯度进行优化。
使用 Nesterov \text{Nesterov} Nesterov动量的 RMSProp \text{RMSProp} RMSProp算法

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

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

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

相关文章

重载和重写的区别

方法重载&#xff1a; &#xff08;1&#xff09;在同一个类中 &#xff08;2&#xff09;方法名必须相同 &#xff08;3&#xff09;形参列表必须不同&#xff08;形参类型或个数或顺序&#xff0c;至少有一样不同&#xff0c;参数名无要求&#xff09; &#xff08;4&…

基于SpringBoot的校园社团信息管理系统

目录 前言 一、技术栈 二、系统功能介绍 学生管理 社长管理 社团信息管理 社团新闻管理 社团添加 社团活动 加入社团 三、核心代码 1、登录模块 2、文件上传模块 3、代码封装 前言 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术…

Linux---进程(1)

操作系统 传统的计算机系统资源分为硬件资源和软件资源。硬件资源包括中央处理器&#xff0c;存储器&#xff0c;输入设备&#xff0c;输出设备等物理设备&#xff1b;软件资源是以文件形式保存在存储器上的成熟和数据等信息。 操作系统就是计算机系统资源的管理者。 如果你的计…

GEO生信数据挖掘(七)差异基因分析

上节&#xff0c;我们使用结核病基因数据&#xff0c;做了一个数据预处理的实操案例。例子中结核类型&#xff0c;包括结核&#xff0c;潜隐进展&#xff0c;对照和潜隐&#xff0c;四个类别。本节延续上个数据&#xff0c;进行了差异分析。 差异分析 计算差异指标step12 加载…

销售小白如何写客户拜访记录?

销售小白如何写客户拜访记录&#xff1f;10年客户管理经验&#xff0c;接下来我说的&#xff0c;都是实实在在的经验&#xff0c;小白能用到其中的40%&#xff0c;你的客户成单率会大大提升&#xff01; 首先&#xff0c;客户拜访记录的哪些信息是重要的&#xff1f; 答案是&…

【ccf-csp题解】第7次csp认证-第二题-俄罗斯方块-简单碰撞检测算法

题目描述 思路讲解 本题的主要思路是实现一个draw函数&#xff0c;这个函数可以绘制每一个状态的画布。然后从第一个状态往后遍历&#xff0c;当绘制到某一个状态发生碰撞时&#xff0c;答案就是上一个状态的画布。 此处的状态x实际就是在原来的15*10画布上的第x行开始画我们…

深度优先搜索详解

目录 前言 一、工作原理 二、模板 函数模板&#xff1a; 准备工作 三、主要应用 &#xff08;一&#xff09;寻找全部路径 题目描述 输入格式 输出格式 样例输入 样例输出 参考代码 思路 原题链接&#xff1a;1213: 走迷宫 &#xff08;二&#xff09;统计连通块…

哪款洗地机更好用?2023年最好用的洗地机

随着科技的发展和生活质量的提高&#xff0c;人们对洗地机的关注也越来越频繁&#xff0c;但是市场上洗地机品牌众多&#xff0c;消费者在选择时常常会感到困惑。那么&#xff0c;究竟哪个品牌的洗地机更好用呢? 我们在购买洗地机的时候&#xff0c;都要关注洗地机的哪些方面…

如何下载IEEE Journal/Conference/Magazine的LaTeX/Word模板

当你准备撰写一篇学术论文或会议论文时&#xff0c;使用IEEE&#xff08;电气和电子工程师协会&#xff09;的LaTeX或Word模板是一种非常有效的方式&#xff0c;它可以帮助你确保你的文稿符合IEEE出版的要求。无论你是一名研究生生或一名资深学者&#xff0c;本教程将向你介绍如…

深度学习问答题(更新中)

1. 各个激活函数的优缺点&#xff1f; 2. 为什么ReLU常用于神经网络的激活函数&#xff1f; 在前向传播和反向传播过程中&#xff0c;ReLU相比于Sigmoid等激活函数计算量小&#xff1b;避免梯度消失问题。对于深层网络&#xff0c;Sigmoid函数反向传播时&#xff0c;很容易就…

读懂MCU产品选型表

读懂MCU产品选型表 产品状态 MP&#xff1a;Mass Production&#xff08;大规模生产&#xff09; - 这表示产品已经进入了大规模生产阶段&#xff0c;可以大量生产并提供给市场。UD&#xff1a;Under Development&#xff08;开发中&#xff09; - 这表示产品目前正在开发阶段…

嵌入式音频软件开发之协议时序图分析方法

是否需要申请加入数字音频系统研究开发交流答疑群(课题组)&#xff1f;加我微信hezkz17, 本群提供音频技术答疑服务 1 TCP/IP 三次握手协议-时序图 序列号是随机数&#xff0c;但是对方回应则是序列号1 &#xff0c;同步1使能&#xff0c;ACK1使能该功能 2 iAP2 授权交互时序…

如何优化敏捷需求管理流程,敏捷需求如何管理。

优化敏捷需求管理流程的方法可以参照如下&#xff1a; 明确需求 。在项目开始时&#xff0c;要确保清楚地理解客户需求&#xff0c;明确项目的目标和范围&#xff0c;以便能够在敏捷迭代中快速响应需求变更。 使用用户故事 。采用用户故事的方式&#xff0c;让客户和开发团队…

云开发中关于Container与虚拟机之间的比较

虚拟机的优势&#xff1a; 1、较小的硬盘开销&#xff1a;一个物理机上可以运行多个虚拟机。 2、容易移植到其他机器上。 3、整合闲置工作负载。 提高设备利用率。 4、通过释放不用的资源来减少能源消耗。 5、多种操作系统让其具有灵活性和可扩展性。 虚拟机的缺点&#…

数据库中了mkp勒索病毒怎么恢复数据,勒索病毒解密,数据恢复

mkp勒索病毒是一种危害性极大&#xff0c;且比较常见的电脑病毒类型。根据数据统计&#xff0c;这种类型的勒索病毒每月攻击的用户数量高达数百起。其中绝大多数用户需要恢复的数据类型为数据库。包括但不限于SQL server、MySQL和oracle等数据库。所以云天数据恢复中心将针对数…

行情分析——加密货币市场大盘走势(9.10)

大饼在昨日下跌回踩了EMA21均线&#xff0c;但是遇到强阻力回调&#xff0c;形成了金针探底的形态。MACD日线级别来看&#xff0c;延续了绿色空心柱&#xff0c;并且还要继续延续的趋势。但是目前依然没有跌破上涨趋势区域。现在建议保持观望状态&#xff0c;现在多空盈亏比不够…

python 在window对exe、注册表、bat、系统服务操作等实例讲解

目录 前言&#xff1a; 1、python准备工作 具体操作实例 实例1&#xff1a;调用exe文件 实例2&#xff1a;调用bat批处理文件 实例3&#xff1a;调用mis安装文件 实例4&#xff1a; 操作注册表 实例5&#xff1a; window系统服务的操作 完整代码 前言&#xf…

原生JS-鼠标拖动

原生JS-鼠标拖动 通过鼠标的点击事件通过h5的属性 通过鼠标的点击事件 步骤&#xff1a; 1. 鼠标按下div。 2. 鼠标移动&#xff0c;div跟着移动 原生js&#xff0c;实现拖拽效果。1. 给被拖拽的div加上 onmousedown 鼠标【按下事件】。鼠标按下的时候&#xff0c;开始监听鼠标…

安达发|制造业的新趋势:APS排程软件的广泛应用

近年来&#xff0c;随着科技的快速发展&#xff0c;制造业也在逐步实现智能化、自动化。其中&#xff0c;APS排程软件的应用越来越广泛&#xff0c;成为制造业提高生产效率、降低运营成本的重要工具。本文将深入探讨这一现象背后的原因。 制造业是全球经济的重要支柱&#xff0…

pygame简单实现游戏开始菜单

最终效果&#xff1a; 完整视频&#xff1a; pygame简单实现菜单 Code&#xff1a; settings.py RESWIDTH,HEIGHT800,600 FPS60main.py import pygame as pg from settings import * import sysclass Game:def __init__(self):pg.init()self.screenpg.display.set_mode(RES)…