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

news2024/12/27 11:11:00

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

  • 引言
    • 回顾:条件数与随机梯度下降的相应缺陷
    • 动量法简单认识
    • 动量法的算法过程描述
    • 附:动量法示例代码

引言

上一节介绍了随机梯度下降 ( Stochastic Gradient Descent,SGD ) (\text{Stochastic Gradient Descent,SGD}) (Stochastic Gradient Descent,SGD),本节将介绍动量法

回顾:条件数与随机梯度下降的相应缺陷

早在梯度下降法在强凸函数的收敛性分析中介绍了条件数 ( Condition Number ) (\text{Condition Number}) (Condition Number)的概念。如果目标函数 f ( ⋅ ) f(\cdot) f()在某点处的 Hessian Matrix ⇒ ∇ 2 f ( ⋅ ) \text{Hessian Matrix} \Rightarrow \nabla^2 f(\cdot) Hessian Matrix2f()存在并且它具备:
这意味着 Hessian Matrix \text{Hessian Matrix} Hessian Matrix必然是正定矩阵。
∇ 2 f ( ⋅ ) ≽ I \nabla^2 f(\cdot) \succcurlyeq \mathcal I 2f()I
那么它的条件数 C \mathcal C C可表示为:
C = λ m a x λ m i n \mathcal C = \frac{\lambda_{max}}{\lambda_{min}} C=λminλmax
其中 λ m a x \lambda_{max} λmax λ m i n \lambda_{min} λmin分别表示 ∇ 2 f ( ⋅ ) \nabla^2 f(\cdot) 2f()特征值的最大、最小值。如果 C \mathcal C C过大,会导致:使用梯度下降法处理 f ( ⋅ ) f(\cdot) f()的优化问题, C ⇒ ∞ \mathcal C \Rightarrow \infty C,那么算法的收敛速度由线性收敛退化至次线性收敛。这种现象也被称作 Hessain Matrix \text{Hessain Matrix} Hessain Matrix的病态条件

上面仅仅是理论上的描述。在真实环境下,会出现什么样的效果 ? ? ?标准二次型 f ( x ) = x T Q x f(x) = x^T \mathcal Q x f(x)=xTQx为例,其中 Q = ( 0.5 0 0 20 ) , x = ( x 1 , x 2 ) T \mathcal Q = \begin{pmatrix}0.5 \quad 0 \\ 0 \quad 20 \end{pmatrix},x=(x_1,x_2)^T Q=(0.50020),x=(x1,x2)T。使用梯度下降法对该目标函数求解最小值的迭代过程见下图:

  • 由于 Q \mathcal Q Q是对角阵,因而它的特征值分别是 0.5 , 20 0.5,20 0.5,20因而在 f ( x ) f(x) f(x)定义域内的点,其对应 Hessian Matrix \text{Hessian Matrix} Hessian Matrix的条件数也是不低的。
  • 如果从目标函数的角度观察,它会是一个中间狭窄,两端狭长的船形形状。
  • 关于该图代码见文章末尾,下同~
    梯度下降法关于病态问题的收敛效果描述

在该示例中,我们并不否认其最终收敛到最优解,但使用迭代步骤的数量是比较夸张的:

  • 其中一个原因是梯度下降法不具备二次终止性——即便已经到达最优解附近,但依然不能基于有限迭代步骤内接近最优解
  • 在整个迭代过程中,梯度下降法在 f ( ⋅ ) f(\cdot) f()收敛路径过于冗余(线性收敛退化至次线性收敛的效果)——完全可以通过震荡更小的、路径更直接的方式实现收敛过程

动量法简单认识

关于上述梯度下降法的迭代公式表示如下:
θ ⇐ θ − η ⋅ ∇ θ J ( θ ) \theta \Leftarrow \theta - \eta \cdot \nabla_{\theta} \mathcal J(\theta) θθηθJ(θ)
其中 η \eta η表示学习率。它可以被理解为每一迭代步骤,负梯度方向上调整的步长大小。随着迭代步骤的推移,梯度结果逐渐减小,而学习率是固定值,从而导致收敛速度越来越慢

  • 如果目标函数 f ( ⋅ ) f(\cdot) f()至少是严格凸函数,那么 f ( ⋅ ) f(\cdot) f()存在全局解,这种情况充其量是不具备二次终止性——需要花费较长时间收敛到最优解附近;
  • 但如果目标函数非常复杂,收敛速度可能导致:数值解陷入局部最优或者鞍点

关于动量法的迭代公式表示如下:
一些文章中也描述为: { m ⇐ γ ⋅ m + η ⋅ ∇ θ J ( θ ) θ ⇐ θ − m \begin{cases} m \Leftarrow \gamma \cdot m + \eta \cdot \nabla_{\theta} \mathcal J(\theta) \\ \theta \Leftarrow \theta - m \end{cases} {mγm+ηθJ(θ)θθm,两者之间等价,因为负梯度方向的描述就是 − ∇ θ J ( θ ) -\nabla_{\theta} \mathcal J(\theta) θJ(θ)该式首先仅将梯度数值部分进行累积,再执行更新。
{ m ⇐ γ ⋅ m − η ⋅ ∇ θ J ( θ ) θ ⇐ θ + m \begin{cases} m \Leftarrow \gamma \cdot m - \eta \cdot \nabla_{\theta} \mathcal J(\theta) \\ \theta \Leftarrow \theta + m \end{cases} {mγmηθJ(θ)θθ+m
其中 m m m表示动量;并且该变量在每次迭代过程中均被更新——它在每一次迭代过程中都对梯度元素 η ⋅ ∇ θ J ( θ ) \eta \cdot \nabla_{\theta} \mathcal J(\theta) ηθJ(θ)进行累积 γ ∈ [ 0 , 1 ) \gamma \in [0,1) γ[0,1)表示动量因子,它决定了之前迭代步骤累积得到的动量衰减的程度效果

动量法的核心思想是:利用过去累积的梯度元素当前迭代步骤的梯度元素进行加权运算,使其朝着最优解更快收敛

  • 如果 γ = 0 \gamma = 0 γ=0意味着:在当前迭代步骤中,之前累积的梯度元素没有任何比重。也就是说,每次迭代过程仅与当前迭代步骤的梯度相关,此时的动量法也退化为梯度下降法。这里以 γ = 0.1 \gamma = 0.1 γ=0.1图像进行示例:
    其中绿色图像表示梯度下降法的迭代路径;红色图像则表示 γ = 0.1 \gamma=0.1 γ=0.1时动量法的迭代路径。此时两者已经非常接近了,但动量法的迭代步骤明显小于梯度法。
    gamma=0.1
  • 如果 γ ⇒ 1 \gamma \Rightarrow 1 γ1意味着:当前迭代步骤中的梯度信息几乎不起作用,而过去累积的梯度元素占主导部分。这里以 γ = 0.9 \gamma=0.9 γ=0.9为例,对应图像结果表示如下:
    很明显,通过红色图像可知,当前迭代步骤的梯度元素也是有意义的,不能过于否定当前结果而过于依赖过去信息。
    gamma=0.9
  • 因而需要找到合适的 γ \gamma γ,使其能够稳定收敛的基础上,减少迭代路径的距离。例如 γ = 0.6 \gamma=0.6 γ=0.6时的图像结果:
    可以明显看出:随着迭代步骤的更新,动量法迭代的幅度(跨越的距离长度)越来越大。即:过去梯度元素牵制着当前步骤的梯度方向。从而会有效减少更新步骤。并且,对于这类病态条件的二次目标函数有着不错的效果。
    gamma=0.6

关于动量法更新速度,见如下示例:

  • m t m_t mt表示第 t t t次迭代步骤的动量;假设每次迭代的梯度结果均相同,为 G = ∇ θ J ( θ ) \mathcal G = \nabla_{\theta} \mathcal J(\theta) G=θJ(θ),从初始时刻 m 0 = 0 m_0=0 m0=0开始,有如下迭代过程:
    常用泰勒公式,需要满足 γ ∈ ( − 1 , 1 ) \gamma \in (-1,1) γ(1,1)
    m 0 = 0 m 1 = γ ⋅ m 0 + η ⋅ G = η ⋅ G m 2 = γ ⋅ m 1 + η ⋅ G = ( 1 + γ ) η ⋅ G m 3 = γ ⋅ m 2 + η ⋅ G = ( 1 + γ + γ 2 ) η ⋅ G ⋮ m + ∞ = ( 1 + γ + γ 2 + γ 3 + ⋯   ) η ⋅ G = 1 1 − γ η ⋅ G m_0 = 0 \\ m_1 = \gamma \cdot m_0 + \eta \cdot \mathcal G = \eta \cdot \mathcal G \\ m_2 = \gamma \cdot m_1 + \eta \cdot \mathcal G = (1 + \gamma) \eta \cdot \mathcal G \\ m_3 = \gamma \cdot m_2 + \eta \cdot \mathcal G = (1 + \gamma + \gamma^2) \eta \cdot \mathcal G\\ \vdots \\ m_{+\infty} = (1 + \gamma + \gamma^2 + \gamma^3 + \cdots) \eta \cdot \mathcal G = \frac{1}{1 - \gamma} \eta \cdot \mathcal G m0=0m1=γm0+ηG=ηGm2=γm1+ηG=(1+γ)ηGm3=γm2+ηG=(1+γ+γ2)ηGm+=(1+γ+γ2+γ3+)ηG=1γ1ηG
  • 这意味着:动量在迭代过程中进行累积 γ \gamma γ越大,动量越大,它的迭代幅度越大,更新速度也更快(见上图 2 2 2)。反之,一直快下去也不是优质的选择,我们同样需要当前迭代步骤的 η ⋅ G \eta \cdot \mathcal G ηG动量进行约束。

动量法的算法过程描述

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

  • 学习率 η \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
  • 计算当前迭代步骤的梯度估计
    其中 f ( x ( i ) ; θ ) f(x^{(i)};\theta) f(x(i);θ)表示模型预测结果; L ( ⋅ ) \mathcal L(\cdot) L()表示损失函数;
    G = 1 k ∑ i = 1 k ∇ θ L [ f ( x ( i ) ; θ ) , y ( i ) ] \mathcal G = \frac{1}{k} \sum_{i=1}^k \nabla_{\theta} \mathcal L[f(x^{(i)};\theta),y^{(i)}] G=k1i=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

附:动量法示例代码

注:代码中没有使用确定的学习率作为步长,是对最速下降法代码的一个修改,使用查找的方式找到一个优质步长实现迭代过程。

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

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
    plt.figure(figsize=(10, 5))
    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 GradientDescent(stepTime=80,epsilon=5.0,mode="momentum"):

    assert mode in ["SGD","momentum"]
    Start = (8.0, 0.5)
    StartV = (0.0, 0.0)
    alpha = 0.6
    LocList = list()
    LocList.append(Start)
    
    for _ in range(stepTime):
    
        DerStart = (Derfx(Start[0]), Derfy(Start[1]))
        for _,step in enumerate(list(np.linspace(0.0, 1.0, 1000))):

            if mode == "momentum":
                NextV = (alpha * StartV[0] - step * DerStart[0], alpha * StartV[1] - step * DerStart[1])
                Next = (Start[0] + NextV[0],Start[1] + NextV[1])
                DerfNext = Derfx(Next[0]) * (-1 * DerStart[0]) + Derfy(Next[1]) * (-1 * DerStart[1])

                if abs(DerfNext) <= epsilon:
                    LocList.append(Next)
                    StartV = NextV
                    Start = Next
                    epsilon /= 1.1
                    break
            else:
                Next = (Start[0] - (DerStart[0] * step), Start[1] - (DerStart[1] * step))
                DerfNext = Derfx(Next[0]) * (-1 * DerStart[0]) + Derfy(Next[1]) * (-1 * DerStart[1])

                if abs(DerfNext) <= epsilon:
                    LocList.append(Next)
                    Start = Next
                    epsilon /= 1.1
                    break

    plotList = list()
    if mode == "momentum":
        c = "tab:red"
    else:
        c = "tab:green"

    for (x, y) in LocList:
        plotList.append((x, y))
        plt.scatter(x, y, s=30, facecolor="none", edgecolors=c, marker='o')
        if len(plotList) < 2:
            continue
        else:
            plt.plot([plotList[0][0], plotList[1][0]], [plotList[0][1], plotList[1][1]], c=c)
            plotList.pop(0)

if __name__ == '__main__':
    DrawBackGround()
    GradientDescent(mode="SGD")
    GradientDescent(mode="momentum")
    plt.show()

Reference \text{Reference} Reference
谈谈优化算法之一(动量法、Nesterov法、自然梯度法)
深度学习(一)优化算法之动量法详解

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

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

相关文章

再不跳槽,就晚了....

从时间节点上来看&#xff0c;3月、4月是每年跳槽的黄金季&#xff01; 以 BAT 为代表的互联网大厂&#xff0c;无论是薪资待遇、还是平台和福利&#xff0c;都一直是求职者眼中的香饽饽&#xff0c;“大厂经历” 在国内就业环境中无异于一块金子招牌。在这金三银四的时间里&a…

基于SVM+TensorFlow+Django的酒店评论打分智能推荐系统——机器学习算法应用(含python工程源码)+数据集+模型(一)

目录 前言总体设计系统整体结构图系统流程图 运行环境Python环境TensorFlow 环境方法一方法二 安装其他模块安装MySQL 数据库 模块实现1. 数据预处理1&#xff09;数据整合2&#xff09;文本清洗3&#xff09;文本分词 相关其它博客工程源代码下载其它资料下载 前言 本项目以支…

三十一、【进阶】B+树的演变过程

1、B树简单介绍 &#xff08;1&#xff09;介绍&#xff1a;B树也属于B树&#xff0c;是B树的变种 &#xff08;2&#xff09;特点&#xff1a;所有的数据都位于叶子节点上&#xff0c;叶子节点上的所有元素形成了一个单项链表 &#xff08;3&#xff09;图示&#xff1a; 2…

多微信如何自动发朋友圈?

想要做私域&#xff0c;朋友圈是我们不可忽视的一部分。无论是促进潜在客户下单&#xff0c;还是引导老客户二次下单&#xff0c;朋友圈的经营需要我们用心去打造。 这怎么理解呢&#xff1f;我们可以在一天内定时发送几条朋友圈&#xff0c;分段时间发&#xff0c;这样微信好…

av_read_frame error: Connection reset by peer

播放器加上这个选项即可&#xff1a;setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT,"reconnect",1) 具体出处参照源码&#xff1a;

小程序 词云图 echarts-for-weixin-wordcloud

GitHub - clydee-geng/echarts-for-weixin-wordcloud: echarts词云微信小程序版 这个是适配与小程序版的词云图&#xff0c;之前有找到ucharts来代替&#xff0c;但是ucharts的词云图功能有两个缺点&#xff1a;1.无法根据值的大小显示词云图的大小&#xff1b;2.显示的顺序是…

前端 vs 后端️: 深入探讨Web开发的两大王国

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

数据防泄密软件排行榜(企业电脑防泄密软件哪一款好用,有哪些推荐)

在当今信息化社会&#xff0c;数据已经成为了企业的重要资产。然而&#xff0c;数据的安全问题也日益突出&#xff0c;尤其是数据的泄露&#xff0c;不仅会导致企业的商业秘密被竞争对手获取&#xff0c;还可能引发一系列的法律问题。因此&#xff0c;数据防泄密软件的重要性不…

九、互联网技术——记忆背诵

文章目录 一、网络操作系统的功能和特性二、网络操作系统的逻辑构成四、主动攻击和被动攻击五、安全机制和安全服务六、信息与数据七、数据处理与数据管理八、数据模型九、概念模型的E-R表示方法十、四种数据模型十一、数据库系统组成十二、DBMS主要功能十三、数据库系统的3级模…

【yolo系列:YOLOV7改进-添加EIOU,SIOU,AlphaIOU,FocalEIOU.】

yolo系列文章目录 在YoloV7中添加EIoU,SIoU,AlphaIoU,FocalEIoU,Wise-IoU. 2023-2-7 更新 yolov7添加Wise-IoUB站链接 重磅&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; YOLO系列模型改进损失函数 文章目录 yolo系列文章目录一、初始的yolov7损失函数二、首…

P1017 [NOIP2000 提高组] 进制转换

#include<iostream> #include<cstdio> #include<cmath> #include<cstring> using namespace std;void zhuan(int n,int r) {if(n0) return ;int mn%r;//m为余数 if(m<0) m-r,nr;//如果余数小于0&#xff0c;转化为正数//将余数转化为ascll码方便输出…

.NET 使用 ZXing.Net 生成二维码,并识别

前言 前面已经分享给很多创建二维码&#xff0c;条形码。。。等一系列的方式 各有优缺点&#xff0c;暂时不做评价。今天推荐ZXing.Net 。也是比较全面的一种方式&#xff0c;还支持解码 .NET 二维码生成库-QrCodeGenerator商业库–Spire.BarcodeThoughtWorks.QRCodeQRCoderS…

三维重建_使用OpenMVG/OpenMVS重建场景

目录 1. 安装环境 1.1 安装OpenMVS 1.2 安装OpenMVG 2. 测试 2.1 下载数据 2.2 进行三维重建 2.2.1 OpenMVG提取稀疏点云 2.2.2 OpenMVS稠密化点云/网格化/纹理贴图 3. 运行遇到问题记录 4. 参考 1. 安装环境 本地环境&#xff1a; Ubuntu20.04 没有cuda 1.1 安装O…

英特尔参与 CentOS Stream 项目

导读红帽官方发布公告欢迎英特尔参与进 CentOS Stream 项目&#xff0c;并表示 “这一举措不仅进一步深化了我们长期的合作关系&#xff0c;也构建在英特尔已经在 Fedora 项目中积极贡献的基础之上。” 目前&#xff0c;CentOS Stream 共包括以下特别兴趣小组&#xff08;SIG&a…

排序算法之【归并排序】

&#x1f4d9;作者简介&#xff1a; 清水加冰&#xff0c;目前大二在读&#xff0c;正在学习C/C、Python、操作系统、数据库等。 &#x1f4d8;相关专栏&#xff1a;C语言初阶、C语言进阶、C语言刷题训练营、数据结构刷题训练营、有感兴趣的可以看一看。 欢迎点赞 &#x1f44d…

oralce配置访问白名单的方法

目录 配置sqlnet.ora文件 重新加载使配置生效 注意事项 Oracle数据库安全性提升&#xff1a;IP白名单的配置方法 随着互联网的发展&#xff0c;数据库安全问题也越来越严重。Oracle是目前使用较为广泛的一款数据库管理系统&#xff0c;而IP白名单作为提升数据库安全性的有效…

骑行上下坡,如何分配重心?让你的骑行更稳定、更安全

骑行&#xff0c;作为一种环保、健康的出行方式&#xff0c;越来越受到人们的喜爱。然而&#xff0c;在骑行过程中&#xff0c;尤其是上下坡时&#xff0c;如何分配好重心&#xff0c;确保骑行的稳定性和安全性呢&#xff1f;本文将为您提供一些实用的技巧&#xff0c;让您的骑…

电脑被删除的文件怎么恢复?2023年数据恢复方法分享

大多数人在使用电脑时都可能会遇到误删文件的情况。一不小心&#xff0c;重要的文件或数据就消失了&#xff0c;情急之下&#xff0c;大多会感到慌乱和无助。但其实&#xff0c;文件误删除并非不可挽回的灾难。本文将为大家介绍几种有效的文件恢复方法&#xff0c;以帮助大家在…

【Proteus仿真】【STM32单片机】汽车倒车报警系统设计

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真STM32单片机控制器&#xff0c;使用LCD1602液晶、按键、继电器电机模块、DS18B20温度传感器、蜂鸣器LED、HCSR04超声波等。 主要功能&#xff1a; 系统运行后&#xff0c;LCD1602显…