jax可微分编程的笔记(7)

2024-02-29 05:12
文章标签 笔记 编程 微分 jax

本文主要是介绍jax可微分编程的笔记(7),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

jax可微分编程的笔记(7)

第七章 优化算法

从优化理论的整体框架来看,任何优化问题都可以被分解为
模型的建立,损失函数的构造以及优化算法的选取这三个部分。
其中优化算法的具体形式,又依赖于步长下降方向和终止条件
的选取。

对于多维函数的极值问题,如果参数间存在不等式形式的线性
约束,我们可以使用著名的单纯形法加以求解。如果优化参数
间存在任意的非线性的不等式约束,则还有增广拉格朗日乘子法
等算法可供选择。

7.1 下降算法概要

模型,损失函数,和优化器是优化问题的三个重要组成部分。
而下降算法是优化器的核心所在。

数学上的收敛性是算法正确的基本前提,而终止条件则是
将数学讨论转化为程序代码的必要条件。

7.1.1 下降算法的数学表达

在深度学习中,这里的待优化函数通常为经验风险函数或者是
带有正则项的结构风险函数。

在强化学习中,人们基于环境给出的奖励来更新智能体的一系列
价值函数;在物理学中由于任何实际体系都会自发地趋于能量最小
的状态,这里的待优化函数同样可以是体系的能量(参考第9章中
的案例);在控制理论中,待优化函数亦柯以是真值和设定值之间的
差距。

模型是一个含有待定参数的待优化函数。
损失函数用于判断一个模型是否能正确地刻画输入数据的规律。
优化器通过最小化损失函数,确定模型中待定的参量。

7.1.2 步长的选择

选取学习率的条件有充分下降条件,曲率条件,沃尔夫条件,
和强沃尔夫条件。

7.1.3终止条件的选择

下降算法常用的终止条件有最大迭代次数,梯度大小,绝对
优化量,相对优化量。

上述4种可能的终止条件并不是相互独立的,在实际的代码书写中
它们可以以任何合理的方式相互组合。

7.1.4 下降方向

负梯度是函数在当前的领域内下降最快的方向。
在绝大多数的情况下,最速下降法和共轭梯度法会用于大型
稀疏矩阵线性方程组的迭代求解中。

7.1.5 共轭梯度法

共轭梯度法是对最速下降法的一种优化。在确定步长时,
两者是一样的,两者的不同之处在搜索方向的选取上。

7.2 一阶优化算法

对于一阶优化算法而言,程序中只涉及对待优化函数一阶
导数的计算。算法有动量法,自适应算法等。

7.2.1 动量法

当模型中的参数较多,即使尝试在每一步迭代时近似地确定
线搜索法的最优步长,算法的计算代价也将显得过于高昂。
在大多数情况下,如果仅根据函数f的局部性质而选取远大
于1的步长,则在函数f本身的形式较为复杂时,这样的优化
算法也显得过于激进,出于这样的考虑,在大多数描述步长的
超参数远小于1,并令其取值在优化过程中尽量保持不变(或者
改变较为缓慢)

在上述的假设下,大多数深度学习中的优化算法,都能与一个
特定的动力学问题联系起来。

从数学角度来看,动量法选用梯度在时间尺度上的泄漏平均值,
来取代局域的梯度,以执行参数的更新参数β在这里成为泄漏
平均值中的衰减因子。特别的,在β=0时,动量法参数之间的递
推关系将退化为经典的梯度下降算法。

在概率论中,如果体系未来的演化仅依赖于体系在当前时刻的
状态,与体系演化的历史无关,则称这样的过程具有马尔可夫性质。

例如对于中国象棋来说,棋局未来走向与对弈双方达到当前局面
的走子方式无关,因此中国象棋的棋局具有全局马尔可夫性质。
而对于围棋来说,如果棋规要求“着子后不能使对方面临出现过的
局面”,那么围棋的棋局不再具有马尔可夫性质。通常而言,马尔
可夫性质对于随机过程来说是一个较强的假设。


7.2.2 自适应算法

动量法在对参数进行更新时,对所有的参数采用相同的学习率,
对一些常见的特征快速收敛,对于不常见特征则迟迟无法收敛。
这种不平衡的问题,催生出自适应次梯度法(AdaGrad)

对AdaGrad而言,凸优化问题上确实可以是有较好的表现的,
遗憾的是,实际问题中的大多数待优化函数,通常是非凸的。
为了解决这个问题,Geoff Hinton将指数滑动平均值引入
参数s的更新过程,从而解决了学习率单调减小的问题,与
相对应的优化器被称为RMSProp优化器(Root Mean Square Propagation)

这篇关于jax可微分编程的笔记(7)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/757668

相关文章

Python异步编程之await与asyncio基本用法详解

《Python异步编程之await与asyncio基本用法详解》在Python中,await和asyncio是异步编程的核心工具,用于高效处理I/O密集型任务(如网络请求、文件读写、数据库操作等),接... 目录一、核心概念二、使用场景三、基本用法1. 定义协程2. 运行协程3. 并发执行多个任务四、关键

AOP编程的基本概念与idea编辑器的配合体验过程

《AOP编程的基本概念与idea编辑器的配合体验过程》文章简要介绍了AOP基础概念,包括Before/Around通知、PointCut切入点、Advice通知体、JoinPoint连接点等,说明它们... 目录BeforeAroundAdvise — 通知PointCut — 切入点Acpect — 切面

Python学习笔记之getattr和hasattr用法示例详解

《Python学习笔记之getattr和hasattr用法示例详解》在Python中,hasattr()、getattr()和setattr()是一组内置函数,用于对对象的属性进行操作和查询,这篇文章... 目录1.getattr用法详解1.1 基本作用1.2 示例1.3 原理2.hasattr用法详解2.

C#异步编程ConfigureAwait的使用小结

《C#异步编程ConfigureAwait的使用小结》本文介绍了异步编程在GUI和服务器端应用的优势,详细的介绍了async和await的关键作用,通过实例解析了在UI线程正确使用await.Conf... 异步编程是并发的一种形式,它有两大好处:对于面向终端用户的GUI程序,提高了响应能力对于服务器端应

C# async await 异步编程实现机制详解

《C#asyncawait异步编程实现机制详解》async/await是C#5.0引入的语法糖,它基于**状态机(StateMachine)**模式实现,将异步方法转换为编译器生成的状态机类,本... 目录一、async/await 异步编程实现机制1.1 核心概念1.2 编译器转换过程1.3 关键组件解析

Go语言数据库编程GORM 的基本使用详解

《Go语言数据库编程GORM的基本使用详解》GORM是Go语言流行的ORM框架,封装database/sql,支持自动迁移、关联、事务等,提供CRUD、条件查询、钩子函数、日志等功能,简化数据库操作... 目录一、安装与初始化1. 安装 GORM 及数据库驱动2. 建立数据库连接二、定义模型结构体三、自动迁

Python 异步编程 asyncio简介及基本用法

《Python异步编程asyncio简介及基本用法》asyncio是Python的一个库,用于编写并发代码,使用协程、任务和Futures来处理I/O密集型和高延迟操作,本文给大家介绍Python... 目录1、asyncio是什么IO密集型任务特征2、怎么用1、基本用法2、关键字 async1、async

Java并发编程之如何优雅关闭钩子Shutdown Hook

《Java并发编程之如何优雅关闭钩子ShutdownHook》这篇文章主要为大家详细介绍了Java如何实现优雅关闭钩子ShutdownHook,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起... 目录关闭钩子简介关闭钩子应用场景数据库连接实战演示使用关闭钩子的注意事项开源框架中的关闭钩子机制1.

shell编程之函数与数组的使用详解

《shell编程之函数与数组的使用详解》:本文主要介绍shell编程之函数与数组的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录shell函数函数的用法俩个数求和系统资源监控并报警函数函数变量的作用范围函数的参数递归函数shell数组获取数组的长度读取某下的

利用Python快速搭建Markdown笔记发布系统

《利用Python快速搭建Markdown笔记发布系统》这篇文章主要为大家详细介绍了使用Python生态的成熟工具,在30分钟内搭建一个支持Markdown渲染、分类标签、全文搜索的私有化知识发布系统... 目录引言:为什么要自建知识博客一、技术选型:极简主义开发栈二、系统架构设计三、核心代码实现(分步解析