CL关于一些优化算法的学习理解

2024-02-25 16:20
文章标签 算法 学习 优化 理解 cl

本文主要是介绍CL关于一些优化算法的学习理解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

梯度下降法牛顿法高斯-牛顿L-M方法

最近看到了ORB SLAM中的后端优化部分,外加EPnP算法中也涉及到了高斯牛顿的优化算法,今天就打算把这玩意在原有的基础上搞得更透彻一点,这也是我为什么没把PnPsolver代码解读放出的原因,看完这个,回头再看,再加上EPnP的论文,看起来会轻松很多,那就开始吧。

就个人而言,对于优化算法的理解,其实就是两部分,一部分是下降方向在哪儿;另一部分是步长是多少,从这两个方面去学习
优化算法可能会更好一点吧。

梯度下降法

梯度下降法从另一个角度上来讲也是一种贪心算法,因为它每次的下降方向找的就是局部最大梯度的反方向。
具体的公式:

对于梯度下降法,我们找到的下降方向:梯度的负方向,那步长怎么定呢?查了相关的资料和博客,就步长这一块的计算,有很多的尝试,具体还是要看你的模型是什么样子的。

引用一篇博客中的话 https://www.cnblogs.com/pinard/p/5970503.html
算法的步长选择。在前面的算法描述中,我提到取步长为1,但是实际上取值取决于数据样本,可以多取一些值,从大到小,分别运行算法,看看迭代效果,如果损失函数在变小,说明取值有效,否则要增大步长。前面说了。步长太大,会导致迭代过快,甚至有可能错过最优解。步长太小,迭代速度太慢,很长时间算法都不能结束。所以算法的步长需要多次运行后才能得到一个较为优的值。

这边再提一下梯度下降法的不同形式(BGD,SGD,MBGD)

批量梯度下降法(Batch Gradient Descent)

这种梯度求解方式就最常用的方式。在梯度更新方面,用了所有参数信息。

随机梯度下降法(Stochastic Gradient Descent)

随机梯度下降法和批量梯度下降法的原理类似,区别在于求梯度时没有用所有样本的数据,而是仅仅选取一个样本来求梯度。
随机梯度下降法和批量梯度下降法是两个极端,一个采用所有数据来梯度下降,一个用一个样本来梯度下降。两者有着各自的优缺点。对于训练速度来说,随机梯度下降法由于每次仅仅采用一个样本来迭代,训练速度很快,而批量梯度下降法在样本量很大的时候,训练速度不能让人满意。对于准确度来说,随机梯度下降法用于仅仅用一个样本决定梯度方向,导致解很有可能不是最优。对于收敛速度来说,由于随机梯度下降法一次迭代一个样本,导致迭代方向变化很大,不能很快的收敛到局部最优解。

小批量梯度下降法(Mini-batch Gradient Descent)

小批量梯度下降法相当于结合了批量和随机两种梯度计算方法。在所有的样本中随机取x个样本,x一般是取10,不过最终x怎么定还是要根据样本的数据,可以调整这个x的值。

牛顿法

原始牛顿法

牛顿法的基本思想是:在现有极小点估计值的附近对f(x)做二阶泰勒展开,进而找到极小点的下一个估计值。设Xk为当前的极小点估计值,则

函数直接在Xk附近的二阶泰勒展开式。由于求的是最值,由极值必要条件可知,应该满足
求得
于是给定初始值,则可以构造如下的迭代格式
如果是从矩阵的角度上来看(多元函数),这边的一阶导数就是梯度矩阵,这边的二阶导数就是海森矩阵。 当目标函数是二次函数时,由于二次泰勒展开函数与原目标函数不是近似而是完全相同的二次式,海森矩阵退化成了一个常数矩阵,从任一初始点出发,只要一步迭代即可达到函数的极小值点,因此牛顿法是一种具有二次收敛性的算法。对于非二次函数,若函数的二次性态较强,或迭代点已进入极小点的邻域,则其收敛速度也是很快的,这是牛顿法的主要优点。但是原始牛顿法由于迭代公式中没有步长因子,而不是定长迭代,对于非二次型目标,牛顿法可能不收敛。 原始牛顿法不能保证函数值稳定地下降。

阻尼牛顿法

阻尼牛顿法的出现是为了消除原始牛顿法的一些弊端。阻尼牛顿法每次的迭代方向还是采用的牛顿方向,但是每次迭代需沿此方向作一维搜索,寻求最优的步长因子。

牛顿法主要存在以下两个缺点:
  1. 对目标函数有较严格的要求,函数必须具有连续的一、二阶偏导数,海森矩阵必须正定
  2. 计算相当复杂,除需计算梯度之外,还需要计算二阶偏导数矩阵和它的逆矩阵。计算量、存储量都很大,且都以维度N的平方的增加,当N很大时这个问题更加突出。

拟牛顿法

前面两种牛顿法虽然收敛速度快,但是计算过程中需要计算目标函数的二阶偏导数(海森矩阵),计算复杂度较大,而且有时目标函数的海森矩阵无法保持正定,从而使牛顿法失效,为了克服这两个问题,提出了逆牛顿法。
这个方法的基本思想是:不用二阶偏导数而构造出可以近似海森矩阵(或海森矩阵的逆)的正定堆成阵。
拟牛顿法只是一个概念,具体的方法有DFP、BFGS和L-BFGS。
DFP算法是最早的拟牛顿法,该算法的核心是:通过迭代的方法,对海森矩阵的逆进行近似,迭代的格式为

这边的D是海森矩阵的逆。一般,初始化的D为单位矩阵。

BFGS算法中核心公式的推导过程和DFP完全类似,只是互换了其中的sk和yk的位置。BFGS算法近似的是海森矩阵,所以这边还有求逆的过程,所以这边应用到了Sherman-Morrison公式,直接给出了海森矩阵逆矩阵的递推公式。

L-BFGS(Lmited-memory BFGS 或 Limited-storage BFGS)算法的基本思想就是不再存储完整的海森逆矩阵,而是存储计算过程中的向量序列y和s,需要矩阵的时候,再利用向量序列的计算来代替,而且,向量序列也不是所有的都存,而是固定存最新的m个参数,这边的更新主要就是海森逆矩阵这一块,由于这边我们只存储m个参数,所有在计算到m+1,m+2时,必然会丢弃一些向量信息,那么肯定是考虑那些最早生成的向量,所以这边的海森逆矩阵只能是近似计算了,精度的损失带来的是存储空间的大大减少。

不过从个人角度上来讲,这些近似公式的出现,似乎都充满了哲学道理,人生嘛,啥都活明白了还待在尘世干嘛,不需要那么精确的嘛。以上一些推导和总结来自

link.
具体的推导他的博客里都有,很好的学习素材。

高斯-牛顿

高斯-牛顿是在牛顿法基础上进行了修改得到的,其最大的优点不需要计算海森矩阵,当然这项优点的代价是其仅适用于最小二乘问题。
最小二乘方法的目标是令残差的平方和最小:

如果是采用牛顿法求解该函数的最小值,需要计算其梯度向量与海森矩阵
公式中的最后一个列矩阵就是所谓的雅克比矩阵。 再看海森矩阵
观察二阶导数项,因为残差约等于0,因此这边的二阶导数项将被舍去,所以海森矩阵可以近似写成,
从这边可以看出高斯-牛顿法相对于牛顿法的不同就是在于采用了近似的海森矩阵降低了计算难度,但是同时,舍去项仅适用于最小二乘问题中残差较小的情形。

将近似的海森矩阵带入牛顿法迭代公式,得到高斯-牛顿法的迭代式,

L-M方法

与牛顿法一样,当初始值距离最小值较远时,高斯-牛顿法不能保证收敛。另外,当进行近似海森矩阵出现近似奇异时,高斯-牛顿也不能正确收敛。L-M算法算是对上述缺点的改进。
L-M方法是对梯度下降法与高斯-牛顿法进行线性组合以充分利用两种算法的优势。通过在Hessian矩阵中加入阻尼系数λ来控制每一步迭代的步长以及方向:

当λ增大时,H+λI趋向于λI,因此△x趋向于梯度下降法给出的迭代方向;

当λ减小时,H+λI趋向于H,△x趋向于高斯-牛顿法给出的方向。

这个信赖域半径怎么定呢?(这边给出的值是个人的经验值)

  1. 近似模型和实际函数之间的差异
  1. 上式的分子是世界函数下降的值,分母是近似模型下降的值。如果计算出的差异值接近于1,则近似是好的;如果差异值太小,说明实际减小的值远小于近似减小的值,则认为近似比较差,需要缩小近似范围。反之,如果差异值比较大,则说明实际下降的比预计的更大,可以放大近似范围。
  2. 如果差异值>3/4,将信赖域的半径扩大到原来的2倍;如果差异值<1/4,将信赖域的半径缩小为原来的1/2。
    图片来源于《视觉SLAM十四讲从理论到实践》
图片来源于《视觉SLAM十四讲从理论到实践》

时间:2019年09月05日
作者:hhuchen
机构:河海大学机电工程学院

这篇关于CL关于一些优化算法的学习理解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

深入理解C++ 空类大小

《深入理解C++空类大小》本文主要介绍了C++空类大小,规定空类大小为1字节,主要是为了保证对象的唯一性和可区分性,满足数组元素地址连续的要求,下面就来了解一下... 目录1. 保证对象的唯一性和可区分性2. 满足数组元素地址连续的要求3. 与C++的对象模型和内存管理机制相适配查看类对象内存在C++中,规

正则表达式高级应用与性能优化记录

《正则表达式高级应用与性能优化记录》本文介绍了正则表达式的高级应用和性能优化技巧,包括文本拆分、合并、XML/HTML解析、数据分析、以及性能优化方法,通过这些技巧,可以更高效地利用正则表达式进行复杂... 目录第6章:正则表达式的高级应用6.1 模式匹配与文本处理6.1.1 文本拆分6.1.2 文本合并6

Vue3 的 shallowRef 和 shallowReactive:优化性能

大家对 Vue3 的 ref 和 reactive 都很熟悉,那么对 shallowRef 和 shallowReactive 是否了解呢? 在编程和数据结构中,“shallow”(浅层)通常指对数据结构的最外层进行操作,而不递归地处理其内部或嵌套的数据。这种处理方式关注的是数据结构的第一层属性或元素,而忽略更深层次的嵌套内容。 1. 浅层与深层的对比 1.1 浅层(Shallow) 定义

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

HDFS—存储优化(纠删码)

纠删码原理 HDFS 默认情况下,一个文件有3个副本,这样提高了数据的可靠性,但也带来了2倍的冗余开销。 Hadoop3.x 引入了纠删码,采用计算的方式,可以节省约50%左右的存储空间。 此种方式节约了空间,但是会增加 cpu 的计算。 纠删码策略是给具体一个路径设置。所有往此路径下存储的文件,都会执行此策略。 默认只开启对 RS-6-3-1024k

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

康拓展开(hash算法中会用到)

康拓展开是一个全排列到一个自然数的双射(也就是某个全排列与某个自然数一一对应) 公式: X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[1]*0! 其中,a[i]为整数,并且0<=a[i]<i,1<=i<=n。(a[i]在不同应用中的含义不同); 典型应用: 计算当前排列在所有由小到大全排列中的顺序,也就是说求当前排列是第