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 异步编程 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渲染、分类标签、全文搜索的私有化知识发布系统... 目录引言:为什么要自建知识博客一、技术选型:极简主义开发栈二、系统架构设计三、核心代码实现(分步解析

揭秘Python Socket网络编程的7种硬核用法

《揭秘PythonSocket网络编程的7种硬核用法》Socket不仅能做聊天室,还能干一大堆硬核操作,这篇文章就带大家看看Python网络编程的7种超实用玩法,感兴趣的小伙伴可以跟随小编一起... 目录1.端口扫描器:探测开放端口2.简易 HTTP 服务器:10 秒搭个网页3.局域网游戏:多人联机对战4.

Java并发编程必备之Synchronized关键字深入解析

《Java并发编程必备之Synchronized关键字深入解析》本文我们深入探索了Java中的Synchronized关键字,包括其互斥性和可重入性的特性,文章详细介绍了Synchronized的三种... 目录一、前言二、Synchronized关键字2.1 Synchronized的特性1. 互斥2.

Python异步编程中asyncio.gather的并发控制详解

《Python异步编程中asyncio.gather的并发控制详解》在Python异步编程生态中,asyncio.gather是并发任务调度的核心工具,本文将通过实际场景和代码示例,展示如何结合信号量... 目录一、asyncio.gather的原始行为解析二、信号量控制法:给并发装上"节流阀"三、进阶控制

C#多线程编程中导致死锁的常见陷阱和避免方法

《C#多线程编程中导致死锁的常见陷阱和避免方法》在C#多线程编程中,死锁(Deadlock)是一种常见的、令人头疼的错误,死锁通常发生在多个线程试图获取多个资源的锁时,导致相互等待对方释放资源,最终形... 目录引言1. 什么是死锁?死锁的典型条件:2. 导致死锁的常见原因2.1 锁的顺序问题错误示例:不同

PyCharm接入DeepSeek实现AI编程的操作流程

《PyCharm接入DeepSeek实现AI编程的操作流程》DeepSeek是一家专注于人工智能技术研发的公司,致力于开发高性能、低成本的AI模型,接下来,我们把DeepSeek接入到PyCharm中... 目录引言效果演示创建API key在PyCharm中下载Continue插件配置Continue引言

C#反射编程之GetConstructor()方法解读

《C#反射编程之GetConstructor()方法解读》C#中Type类的GetConstructor()方法用于获取指定类型的构造函数,该方法有多个重载版本,可以根据不同的参数获取不同特性的构造函... 目录C# GetConstructor()方法有4个重载以GetConstructor(Type[]