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)

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

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

相关文章

JavaScript 浏览器元素滚动 scrollIntoView()

scrollIntoView() ​ DOM 规范中没有涉及的一个问题是如何滚动页面中的某个区域。为填充这方面的缺失,不同浏览器实现了不同的控制滚动的方式。在所有这些专有方法中,HTML5 选择了标准化 scrollIntoView()。 ​ scrollIntoView() 方法存在于所有 HTML …

深度学习中常见的backbone、neck、head的理解

在深度学习中,常见的backbone、neck和head是指网络结构的不同部分,它们各自承担着不同的功能: Backbone(骨干网络):骨干网络通常是指整个深度神经网络的主要部分,负责提取输入数据的特征。骨干网…

寒假作业Day 02

这是第二天的作业,fighting! Day 02 一、选择题 首先char* s[6]是指针数组,也就是其存储的都是这些字符串的地址,其实际上的类型为char**,而fun函数传入了s数组的首地址。而后续fun函数中打印字符,p[i]即…

ad18学习笔记十六:如何放置精准焊盘到特定位置,捕抓功能的讲解

网上倒是一堆相关的指导 AD软件熟练度提升,如何设置板框捕捉?_哔哩哔哩_bilibili 关于Altium Designer 20 的捕抓功能的讲解_ad捕捉设置-CSDN博客 AD软件捕捉进阶实例,如何精确的放置布局元器件?_哔哩哔哩_bilibili AD绘制PCB…

项目-SERVER模块-Socket模块

Socket模块 一、Socket模块是什么?二、代码实现1.成员变量2.构造、析构函数3.获取套接字文件描述符4.创建套接字5.绑定地址信息6.开始监听连接请求7.向服务器发起连接8.获取新连接9.接收数据10.非阻塞接收数据11.发送数据12.非阻塞发送数据13.关闭套接字14.创建一个…

何时使用子查询?一个使用子查询的SQL示例及其工作原理

何时使用子查询?给出一个使用子查询的SQL示例,并解释其工作原理。 子查询,也称为内部查询或嵌套查询,是嵌入在另一个SQL查询中的查询。外部查询,有时称为外部查询或主查询,是包含子查询的查询。子查询可以…

20240301作业

1.使用fwrite、fread将一张随意的bmp图片&#xff0c;修改成德国的国旗 #include <stdio.h> #include <string.h> #include <unistd.h> #include <stdlib.h> int main(int argc, const char *argv[]) {FILE* fp fopen("./gaoda.bmp","…

24.3.1 《CLR via C#》 笔记9

第十二章 泛型 泛型&#xff1a;支持泛型值类型、泛型引用类型、泛型接口、泛型委托&#xff1b;允许在引用类型、值类型和接口中定义泛型方法&#xff1b;泛型参数变量要么称为T&#xff0c;要么以T开头 具有泛型类型参数的类型称为开放类型&#xff0c;不允许构造实例&#…

Java毕业设计 基于SpringBoot vue 社区团购系统

Java毕业设计 基于SpringBoot vue 社区团购系统 SpringBoot vue 社区团购系统 功能介绍 前端用户: 首页 图片轮播 商品信息 商品分类展示 搜索 商品详情 点我收藏 添加到购物车 立即购买 我要开团 去参团 评论 公告资讯 资讯详情 登录 注册 个人中心 更新信息 点我充值 我的订…

Mysql笔记3

1、快速创建表 原理&#xff1a; 将一个查询结果当做一张表新建 这个可以完成表的快速复制 create table emp2 as select * from emp; mysql> select * from emp2; ---------------------------------------------------------------------- …

【vscode提取函数快捷键】提取函数,减少大方法的复杂度

在 Visual Studio Code 中&#xff0c;提取函数的快捷键取决于你所使用的编程语言和安装的插件。以下是一些常用的快捷键组合&#xff0c;可以用来在 Visual Studio Code 中提取函数&#xff1a; 执行以下步骤来提取函数&#xff1a; 选中要提取的代码块。右键单击选中的代码…

System Verilog学习笔记(十二)——数组(2)

System Verilog学习笔记&#xff08;十二&#xff09;——数组&#xff08;2&#xff09; 动态数组 在编译时不会为其定制尺寸&#xff0c;而是在仿真运行时来确定动态数组一开始为空&#xff0c;需要使用new[ ]来为其分配空间声明方式 int dyn[],d2[]; //声明了两个动态数组…

git之远程操作

一.分布式版本控制系统 分布式版本控制系统通常也有⼀台充当“中央服务器”的电脑&#xff0c;但这个服务器的作⽤仅仅是⽤来⽅便“交换”⼤家的修改&#xff0c;没有它⼤家也⼀样⼲活&#xff0c;只是交换修改不⽅便⽽已。有了这个“中央服务器”的电脑&#xff0c;这样就不怕…

ChatGPT学习第四周

&#x1f4d6; 学习目标 ChatGPT实践操作 通过实际操作和练习&#xff0c;加深对ChatGPT功能的理解。 项目&#xff1a;创建一个ChatGPT应用案例 设计一个基于ChatGPT的小项目&#xff0c;将理论应用于实践。 ✍️ 学习活动 学习资料 《万字干货&#xff01;ChatGPT 从零完…

[C++核心编程](一):内存分区

目录 代码区 全局区 栈区 堆区 new操作符 不同区域存放的数据&#xff0c;赋予不同的生命周期&#xff0c;给予开发人员更大的灵活编程。 代码区 存放二进制代码&#xff0c;由操作系统管理未执行程序&#xff08;.exe&#xff09;前已经存在共享&#xff0c;对频繁执行…

达梦数据库查询语句内存溢出问题解决

背景&#xff1a;达梦数据库使用过程中&#xff0c;某天突然服务宕机&#xff0c;导致各类后端服务无法注册到nacos上&#xff0c;重启之后nacos正常启动&#xff0c;可执行一条两千多条数据量的连表查询时间很长&#xff0c;甚至会报错&#xff0c;经查看日志发现在查询过程中…

【C语言】常见的动态内存管理错误

前言 上一篇介绍了C语言中 动态内存管理函数&#xff0c;本片讲解的是 在我们使用动态内存管理时 常见的错误&#xff0c;一起来看看吧~ 欢迎关注个人主页&#xff1a;逸狼 创造不易&#xff0c;可以点点赞吗~ 如有错误&#xff0c;欢迎指出~ 目录 1.对NULL指针的解引⽤操作 错…

什么是前端框架中的数据绑定(data binding)?有哪些类型的数据绑定?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

YOLOv5白皮书-第Y4周:common.py文件解读

YOLOv5白皮书-第Y4周:common.py文件解读 YOLOv5白皮书-第Y4周:common.py文件解读0.导入需要的包和基本配置1.基本组件1.1 autopad1.2 Conv1.3 Focus1.4 Bottleneck1.5 BottleneckCSP1.6 C31.7 SPP1.8 Concat1.9 Contract、Expand 2.重要类2.1 非极大值抑制&#xff08;NMS&…

vue3中的基本语法

目录 基础素材 vue3的优化 使用CompositionAPI理由 1. reactive() 函数 2. ref() 函数 2.1. ref的使用 2.2. 在 reactive 对象中访问 ref 创建的响应式数据 3. isRef() 函数 4. toRefs() 函数 5. computed() 5.1. 通过 set()、get()方法创建一个可读可写的计算属性 …