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

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

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

引言

上一节介绍了随机梯度下降 ( 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 pltdef 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 xdef Derfy(y):return 40 * ydef DrawBackGround():ContourList = [0.2, 1.0, 4.0, 8.0, 16.0, 32.0]LimitParameter = 0.0001plt.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.6LocList = 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 = NextVStart = Nextepsilon /= 1.1breakelse: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 = Nextepsilon /= 1.1breakplotList = 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:continueelse: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.mzph.cn/news/97476.shtml

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

相关文章

基础算法之——【动态规划之路径问题】1

今天更新动态规划路径问题1&#xff0c;后续会继续更新其他有关动态规划的问题&#xff01;动态规划的路径问题&#xff0c;顾名思义&#xff0c;就是和路径相关的问题。当然&#xff0c;我们是从最简单的找路径开始&#xff01; 动态规划的使用方法&#xff1a; 1.确定状态并…

vue3+vite+uniapp 封装一个省市区组件

一、预览图 二、使用前的一些注意事项 只支持在 uniapp vue3 项目中使用支持微信小程序和h5 (app端没有测试过)ui库用的 uview-plus省市区数据用的是 vant-ui 提供的一个赖库 vant/area-data 三、组件代码 <template><u-popup :show"show" type"botto…

软件工程与计算总结(二)软件工程的发展

本章开始介绍第二节内容&#xff0c;主要是一些历史性的东西~ 一.软件工程的发展脉络 1.基础环境因素的变化及其对软件工程的推动 抽象软件实体和虚拟计算机都是软件工程的基础环境因素&#xff0c;它们能从根本上影响软件工程的生产能力&#xff0c;而且是软件工程无法反向…

Zabbix 监控系统安装和部署

Zabbix 监控系统安装和部署 一、zabbix 是什么&#xff1f;1.1、zabbix 监控原理&#xff08;重点&#xff09;1.2、Zabbix 6.0 新特性1.3、Zabbix 6.0 功能组件1.4、数据库1.5、Web 界面1.6、Zabbix Agent1.7、Zabbix Proxy1.8、Java Gateway 二、部署Zabbix 6.02.1、 解决 za…

Configuration of phpstudy and sqli-labs

Go download the app&#xff1a; 小皮面板(phpstudy) - 让天下没有难配的服务器环境&#xff01; (xp.cn) Have done. Then enter the program. Enable both functions&#xff1a; Apache and MySQL. Open the website&#xff1a; Next, Lets make the sqli-liab. GitHub…

基于MDK-Keil环境如何把STM32程序直接下载到SRAM运行

1. 前言 对于 Cortex-M 内核的微控制器&#xff0c;它们都可以支持在 RAM 中执行程序&#xff0c;有些非 ARM 的微控制器是不支持的。 在内部 SRAM 执行程序&#xff0c;有基于以下几方面的原因&#xff1a; 1、所使用的设备可能具有OTP&#xff08;One-time Programmable&a…

笔记一:odoo透视表和图表

透视表 1、首先在xml文件添加pivot 说明&#xff1a;&#xff08;1&#xff09;根元素pivot中属性&#xff1a; disable_linking&#xff1a;设置为True&#xff0c;删除表格单元格到列表视图的链接 display_quantity&#xff1a;设置为True&#xff0c;默认显示“数量”列 d…

关于IDEA中gradle项目bootrun无法进入断点以及gradle配置页面不全的解决方案

问题背景 在使用gradle编写的bootrun&#xff0c;采用debug方式启动项目时&#xff0c;无法进入断点&#xff0c;程序正常运行 并发现象1 此处无法识别为大象图标 点击右键后&#xff0c;没有圈中的这个选项 并发现象2 图片圈中的位置缺失 问题原因 正常的 run 命令是通过…

SoapUI实践:自动化测试、压力测试、持续集成

因为项目的原因&#xff0c;前段时间研究并使用了 SoapUI 测试工具进行自测开发的 api。下面将研究的成果展示给大家&#xff0c;希望对需要的人有所帮助。 SoapUI 是什么&#xff1f; SoapUI 是一个开源测试工具&#xff0c;通过 soap/http 来检查、调用、实现 Web Service …

springboot和vue:十、vue2和vue3的差异+组件间的传值

首先用vue-cli创建一个vue2的项目。 vue2和vue3的差异 main.js的语法有所差别。 vue2是 import Vue from vue import App from ./App.vuenew Vue({render: h > h(App), }).$mount(#app)vue3是 import { createApp } from vue import App from ./App.vuecreateApp(App).…

Java虚拟机内存模型

JVM虚拟机将内存数据分为&#xff1a; 程序计数器、虚拟机栈、本地方法栈、Java堆、方法区等部分。 程序计数器用于存放下一条运行的指令&#xff1b; 虚拟机栈和本地方法栈用于存放函数调用堆栈信息&#xff1b; Java堆用于存放Java程序运行时所需的对象等数据&#xff1b…

学习笔记|串口通信的基础知识|同步/异步|RS232|常见的串口软件的参数|STC32G单片机视频开发教程(冲哥)|第二十集:串口通信基础

目录 1.串口通信的基础知识串口通信(Serial Communication)同步/异步&#xff1f;全双工&#xff1f;常见的串口软件的参数 2.STC32的串口通信实现原理引脚选择&#xff1a;实现分时复用模式选择串口1模式1&#xff0c;模式1波特率计算公式 3.串口通信代码实现编写串口1通信程序…

前端 | AjaxAxios模块

文章目录 1. Ajax1.1 Ajax介绍1.2 Ajax作用1.3 同步异步1.4 原生Ajax 2. Axios2.1 Axios下载2.2 Axios基本使用2.3 Axios方法 1. Ajax 1.1 Ajax介绍 Ajax: 全称&#xff08;Asynchronous JavaScript And XML&#xff09;&#xff0c;异步的JavaScript和XML。 1.2 Ajax作用 …

vue3+elementPlus:el-tree复制粘贴数据功能,并且有弹窗组件

在tree控件里添加contextmenu属性表示右键点击事件。 因右键自定义菜单事件需要获取当前点击的位置&#xff0c;所以此处绑定动态样式来控制菜单实时跟踪鼠标右键点击位置。 //html <div class"box-list"><el-tree ref"treeRef" node-key"id…

python+selenium实现UI自动化(入门篇)

一、基础准备。 python环境安装&#xff0c;参考&#xff1a;CSDN pycharm安装&#xff0c;参考&#xff1a;CSDN 谷歌浏览器驱动配置&#xff0c;参考&#xff1a;CSDN二、新建pycharm项目 截图中&#xff0c;上面是项目地址&#xff08;可以提前在指定位置创建文件夹&#xf…

Redis 主从复制及哨兵模式

目录 1 Redis 主从复制 1.1 主从复制的作用 1.2 主从复制流程 2 搭建Redis 主从复制 2.1 安装 Redis 2.2 修改 Redis 配置文件&#xff08;Master节点操作&#xff09; 2.3 修改 Redis 配置文件&#xff08;Slave节点操作&#xff09; 2.4 验证主从效果 3 Redis 哨兵模…

数据结构——排序算法(C语言)

本篇将详细讲一下以下排序算法&#xff1a; 直接插入排序希尔排序选择排序快速排序归并排序计数排序 排序的概念 排序&#xff1a;所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某写关键字的大小&#xff0c;按照递增或递减0排列起来的操作。 稳定性的概念…

JAVA开发中常用RDMS

一、前言 JAVA的开发离不开数据库的支持&#xff0c;常见的有关系型数据库和非关系型数据库。java除了处理不依赖与数据库的通信技术。很多的java项目或者应用程序都需要建立在数据库的基础上。所以java开发早已经不是单纯的java开发&#xff0c;更多的是基于对数据的处理&…

一文教你如何快速备考云计算HCIE 3.0 !

大家好&#xff0c;在誉天实验辅导老师的耐心帮助下&#xff0c;本人在9月21日的云计算HCIE 3.0考试已顺利通过&#xff0c;很高兴有这个机会给大家分享备考的经历&#xff0c;希望对还在备考的同学能有一定的帮助。 备考准备 在云计算HCIE3.0的课程学习结束之后&#xff0c;就…

一款构建Python命令行应用的开源库

1 简介 当我们编写 Python 程序时&#xff0c;我们经常需要与用户进行交互&#xff0c;接收输入并输出结果。Python 提供了许多方法来实现这一点&#xff0c;其中一个非常方便的方法是使用 typer 库。typer 是一个用于构建命令行应用程序的 Python 库&#xff0c;它使得创建命令…