机器人中的数值优化(五)——信赖域方法

   本系列文章主要是我在学习《数值优化》过程中的一些笔记和相关思考,主要的学习资料是深蓝学院的课程《机器人中的数值优化》和高立编著的《数值最优化方法》等,本系列文章篇数较多,不定期更新,上半部分介绍无约束优化,下半部分介绍带约束的优化,中间会穿插一些路径规划方面的应用实例



   七、信赖域方法

   1、信赖域方法简介

   信赖域方法(Trust Region Methods)是一种用于非线性优化的数值优化方法,旨在寻找目标函数的最小值。信赖域算法是一种迭代算法,即从给定的初始解出发,通过逐步迭代,不断改进,直到获得满意的近似最优解为止。其基本思想是把最优化问题转化为一系列简单的局部寻优问题。

   它的核心思想是在当前点的局部模型和真实模型之间建立一个可信区域(Trust Region),并在可信区域内寻找更优的解。

   该方法在解决非线性优化问题时,常使用局部二次模型来近似目标函数,并在每个迭代步骤中解决这个二次模型的最小化问题。信赖域方法是求解非线性最优化问题的有效方法之一,广泛应用于计算机视觉、机器学习、优化控制等领域。


   2、信赖域方法基本思想

   信赖域方法的基本思想是将问题分解为多个步骤。首先,用一个二次模型来近似目标函数,这个模型只在一个局部域内是准确的。其次,在这个局部域内求解二次模型的最小值。最后,使用这个最小值来更新优化变量,然后检查更新后的函数值是否小于当前的函数值。如果是,则扩大局部域的半径,否则缩小局部域的半径,以此控制每个步骤的更新大小。

   那么为什么要构建局部模型,而不使用真实模型呢?

   假设在点 x k x_k xk处,我们欲求下降方向 d x d_x dx,若直接求解极小值问题 m i n f ( x k + d ) min f(x_k+ d) minf(xk+d)去得到 d k d_k dk,那么这个问题与原问题复杂程度相同,而关于方向d的问题应该是相对简单、易求的。所以,解决这个问题简单可行的方法是:利用Taylor展式,在点 x k x_k xk的邻域中,使用 f ( x k + d ) f(x_k+ d) f(xk+d)的一阶近似函数或二阶近似函数作为局部模型代替 f ( x k + d ) f(x_k+ d) f(xk+d)去求 d k d_k dk(常使用二阶近似函数),我们记这个局部模型函数为 q k ( d ) q_k(d) qk(d).求取局部模型 q k ( d ) q_k(d) qk(d)的极小点,并将其作为迭代方向 d k d_k dk ,即求

   min ⁡ d q k ( d ) \operatorname*{min}_{d}q_{k}(d) dminqk(d)


   q k ( d ) q_k(d) qk(d)近似 f ( x k + d ) f(x_k+ d) f(xk+d)的好坏,是受到 x k x_k xk处邻域大小的影响的.合适的邻域和合适的近似函数的选取,可以保证 q k ( d ) q_k(d) qk(d) f ( x k + d ) f(x_k+ d) f(xk+d)的一个好的近似函数,如取

   q k ( d ) = f k + ∇ f k T d + 1 2 d T ∇ 2 f k d q_k(d)=f_k + \nabla f_k^T d + \frac{1}{2} d^T \nabla^2 f_k d qk(d)=fk+fkTd+21dT2fkd

   当||d||较小时, q k ( d ) q_k(d) qk(d)近似 f ( x k + d ) f(x_k+ d) f(xk+d)的误差亦小. 如果 x k x_k xk处的邻域太大,就无法保证 q k ( d ) q_k(d) qk(d) f ( x k + d ) f(x_k+ d) f(xk+d)的好的近似函数,此时可能会出现 q k ( d ) q_k(d) qk(d)的极小点与目标函数 f ( x k + d ) f(x_k+ d) f(xk+d)的极小点相差甚远的情况. 而邻域的大小决定了步长的长短,太短的步长会增加算法的迭代次数,影响算法的收敛速度,所以领域也不能取得过小。

   因此,每步迭代在 x k x_k xk处选择一个合适的邻域,在这个邻域中求解 min ⁡ d q k ( d ) \operatorname*{min}_{d}q_{k}(d) mindqk(d),这就是信赖域方法的思想.这个邻域,我们称之为信赖域,即在此信赖域中,我们相信 q k ( d ) q_k(d) qk(d) f ( x k + d ) f(x_k+ d) f(xk+d)的好的近似函数.

   假定在第k步迭代已得 x k x_k xk以及信赖域的半径 Δ k \Delta_k Δk,则信赖域的子问题即为求解如下表达式,得到 d k d_k dk

   min ⁡ q k ( d ) , s.t. ∥ d ∥ ⩽ Δ k , Δ k > 0 \begin{array}{l}\min q_k(d),\\ \textrm{s.t.}\|d\|\leqslant\Delta_k,\Delta_k>0\end{array} minqk(d),s.t.dΔk,Δk>0

   在得到新的迭代点 x k + 1 = x k + d k x_{k+1}=x_k+d_k xk+1=xk+dk之后,我们可以判断 Δ k \Delta_k Δk是否是下一步迭代的合适的信赖域半径,若不合适,可以修正 Δ k \Delta_k Δk得下一步迭代的 Δ k + 1 \Delta_{k+1} Δk+1,上式中的范数可依方法而定。


   那么如何衡量 Δ k \Delta_k Δk是否是下一步迭代的合适的信赖域半径呢?

   应该根据 x k x_k xk q k ( d ) q_k(d) qk(d)近似 f ( x k + d ) f(x_k+ d) f(xk+d)的好坏来确定,具体来说,可以根据从 x k x_k xk x k + d k x_k+d_k xk+dk f ( x ) f(x) f(x)的实际减少量 Δ f k \Delta f_k Δfk与近似函数 q k ( d ) q_k(d) qk(d)的减少量 Δ q k \Delta q_k Δqk之比 γ k \gamma_k γk来衡量,其中 q k ( 0 ) = f ( x k ) q_k(0)=f(x_k) qk(0)=f(xk)

   Δ f k = f ( x k ) − f ( x k + d k ) Δ q k = q k ( 0 ) − q k ( d k ) γ k = Δ f k Δ q k \begin{array}{l}\Delta f_k=f(x_k)-f(x_k+d_k)\\ \\ \Delta q_k=q_k(0)-q_k(d_k)\\ \\ \gamma_k=\dfrac{\Delta f_k}{\Delta q_k}\end{array} Δfk=f(xk)f(xk+dk)Δqk=qk(0)qk(dk)γk=ΔqkΔfk

   γ k \gamma_k γk接近1时,表明 q k ( d ) q_k(d) qk(d)近似 f ( x k + d ) f(x_k+ d) f(xk+d)的程度好,下一步迭代应增大 Δ k \Delta_k Δk;当 γ k \gamma_k γk为接近于零的正数时,表明 q k ( d ) q_k(d) qk(d)近似 f ( x k + d ) f(x_k+ d) f(xk+d)的程度不好,下一步迭代应减小 Δ k \Delta_k Δk;当 γ k \gamma_k γk为零或负数时,说明 f ( x k + d k ) ≥ f ( x k ) f(x_k+ d_k)≥ f(x_k) f(xk+dk)f(xk) x k + d k x_k+ d_k xk+dk不应被接受为下一步的迭代点,这时只应缩小信赖域的半径 γ k \gamma_k γk:,并重新求解。


   3、信赖域方法的具体步骤

   (1)初始化:选择一个初始点 x 0 x_0 x0,设定信赖域的初始大小 Δ 0 \Delta_0 Δ0,初始化迭代次数k=0。

   (2)开始迭代:判断是否满足终止条件(例如目标函数的值达到了一定的精度),若满足则输出 x k x_k xk,迭代停止

   (3)构建局部模型:在当前点 x k x_k xk处,构建一个局部二次模型,

   q k ( d ) = f k + ∇ f k T d + 1 2 d T ∇ 2 f k d q_k(d)=f_k + \nabla f_k^T d + \frac{1}{2} d^T \nabla^2 f_k d qk(d)=fk+fkTd+21dT2fkd

   其中, f k f_k fk是目标函数在 x k x_k xk处的函数值, ∇ f k \nabla f_k fk是目标函数在 x k x_k xk处的梯度, ∇ 2 f k \nabla^2 f_k 2fk是目标函数在 x k x_k xk处的Hessian矩阵的近似值。

   (4)寻找下降方向:求解 q k ( d ) q_k(d) qk(d)的最小值 d k d_k dk,满足 ∣ d k ∣ ≤ Δ k |d_k| \leq \Delta_k dkΔk,其中 Δ k \Delta_k Δk是当前信赖域的半径。

   (5)计算实际下降量和预测下降量:计算从 x k x_k xk x k + d k x_k+d_k xk+dk f ( x ) f(x) f(x)的实际减少量 Δ f k \Delta f_k Δfk与近似函数 q k ( d ) q_k(d) qk(d)的减少量 Δ q k \Delta q_k Δqk之比 γ k \gamma_k γk

   (6)更新信赖域大小:根据比值 γ k \gamma_k γk的大小更新信赖域大小

   如果 γ k \gamma_k γk一定程度上接近于1(比如说 γ k \gamma_k γk>0.75)说明局部模型对目标函数有较好的拟合效果,可以增加信赖域的大小 Δ k + 1 = min ⁡ ( γ 2 Δ k , Δ max ⁡ ) \Delta_{k+1}=\min(\gamma_2 \Delta_k, \Delta_{\max}) Δk+1=min(γ2Δk,Δmax),其中 γ 2 > 1 \gamma_2>1 γ2>1是一个大于1的常数, Δ max ⁡ \Delta_{\max} Δmax是信赖域大小的上限。

   如果 γ k \gamma_k γk一定程度上接近于0(比如说 γ k \gamma_k γk<0.25)说明局部模型对目标函数的拟合效果较差,应该减少信赖域的大小 Δ k + 1 = γ 1 Δ k \Delta_{k+1}=\gamma_1 \Delta_k Δk+1=γ1Δk,其中 0 < γ 1 < 1 0<\gamma_1<1 0<γ1<1是一个小于1的常数。

   如果 γ k \gamma_k γk位于0~1之间,既不靠近0也不靠近1(比如说0.25< γ k \gamma_k γk<0.75)说明局部模型对目标函数的拟合效果既不好也不坏,可以保持信赖域不变 Δ k + 1 = Δ k \Delta_{k+1}=\Delta_k Δk+1=Δk

   (7)判断是否接受新的点 x k + 1 = x k + d k x_{k+1}=x_k+d_k xk+1=xk+dk

   如果 γ k \gamma_k γk<=0,说明 f ( x k + d k ) ≥ f ( x k ) f(x_k+ d_k)≥ f(x_k) f(xk+dk)f(xk) x k + d k x_k+ d_k xk+dk不应被接受为下一步的迭代点,取 x k + 1 = x k x_{k+1}=x_k xk+1=xk,转到第(2)步继续迭代,重新求取第k次迭代的解。

   如果 γ k \gamma_k γk>0,说明 f ( x k + d k ) < f ( x k ) f(x_k+ d_k)< f(x_k) f(xk+dk)<f(xk) x k + d k x_k+ d_k xk+dk可以被接受为下一步的迭代点,取 x k + 1 = x k + d k x_{k+1}=x_k+d_k xk+1=xk+dk,并将迭代数加1,即k=k+1,转到第(2)步继续迭代。


   4、总结

   与线搜索方法先在 x k x_k xk点求得下降方向 d k d_k dk,再沿 d k d_k dk方向确定步长 a k a_k ak不同,信赖域方法是先限定步长的范围,再同时确定下降方向 d k d_k dk和步长 a k a_k ak

   信赖域方法相对于其他优化算法的优点在于它可以保证每次迭代都可以得到一个可行解,并且可以保证在可信区域内寻找更优的解,从而增加算法的稳定性和可靠性。此外,信赖域方法也可以灵活地处理约束条件和不等式约束问题。

   然而,信赖域方法也存在一些缺点。例如,它可能会陷入局部最优解,并且每次迭代需要计算Hessian矩阵或其近似,计算成本较高。同时,信赖域大小的选取也需要一定的经验和调试。

   总的来说,信赖域方法是一种有效的非线性优化算法,可以用于解决一类较为复杂的优化问题。



   参考资料:

   1、机器人中的数值优化

   2、信赖域算法

   3、数值最优化方法(高立 编著)

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

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

相关文章

ubuntu22.04搭建verilator仿真环境

概述 操作系统为 Ubuntu(22.04.2 LTS)&#xff0c;本次安装verilator开源verilog仿真工具&#xff0c;进行RTL功能仿真。下面构建版本为5.008的verilator仿真环境。先看一下我系统的版本&#xff1a; 安装流程 安装依赖 sudo apt-get install git perl python3 make autoc…

肖sir__设计测试用例方法之边界值03_(黑盒测试)

设计测试用例方法之边界值 边界点定义 上点&#xff1a;边界上的点 离点&#xff1a;离上点最近的点&#xff08;即上点左右两边最邻近的点&#xff09; 内点&#xff1a;在域范围内的点 案例&#xff1a;qq号&#xff1a;5-12位 闭区间&#xff1a; 离点&#xff1a;5 位 &…

计算机组成原理学习记录(更新中)

文章目录 仅做个人记录计组的学习中认为容易记错的点或是个人认为的要点&#xff0c;如有错误&#xff0c;请多包涵。 学习资源为b站网课&#xff1a;王道计算机考研 计算机组成原理 大部分图片来自该网课 &#xff08;1&#xff09;冯诺依曼型计算机由五个部分组成&#xff…

ajax day2

1、 2、控制弹框显示和隐藏&#xff1a; 3、右键tr&#xff0c;编辑为html&#xff0c;可直接复制tr部分的代码 4、删除时&#xff0c;点击删除按钮&#xff0c;可以获取图书id&#xff1a; 5、编辑图书 快速赋值表单元素内容&#xff0c;用于回显&#xff1a; 6、hidden …

Spring AOP与静态代理/动态代理

文章目录 一、代理模式静态代理动态代理代理模式与AOP 二、Spring AOPSping AOP用来处理什么场景jdk 动态代理cglib 动态代理面试题&#xff1a;讲讲Spring AOP的原理与执行流程 总结 一、代理模式 代理模式是一种结构型设计模式&#xff0c;它允许对象提供替代品或占位符&…

Android片段

如果你希望应用根据不同的环境有不同的外观和行为&#xff0c;这种情况下就需要片段&#xff0c;片段是可以由不同活动重用的模块化代码组件。 片段&#xff08;Fragment&#xff09;是活动&#xff08;Activity&#xff09;的一种模块化部分&#xff0c;表示活动中的行为或界面…

Gin学习记录2——路由

路由 一. 常规路由二. 动态路由三. 带参数的路由3.1 GET3.2 POST3.3 绑定 四. 简单的路由组五. 文件分组 一. 常规路由 package mainimport ("net/http""github.com/gin-gonic/gin" )func index(ctx *gin.Context) {ctx.String(http.StatusOK, "Hell…

八个针对高级职位的高级 JavaScript 面试题

JavaScript 是一种功能强大的语言&#xff0c;是网络的主要构建块之一。这种强大的语言也有一些怪癖。例如&#xff0c;您是否知道 0 -0 的计算结果为 true&#xff0c;或者 Number("") 的结果为 0&#xff1f; 问题是&#xff0c;有时这些怪癖会让你摸不着头脑&…

Python 操作 Excel

之前看过一篇文章&#xff0c;说一个工作多年的老员工&#xff0c;处理数据时只会用复制粘贴到 Excel &#xff0c;天天加班工作还完不成&#xff0c;后来公司就招了一个会 Python 的新人&#xff0c;结果分分钟就处理完成。所以工作中大家经常会使用 Excel 去处理以及展示数据…

AI工人操作行为流程规范识别算法

AI工人操作行为流程规范识别算法通过yolov7python网络模型框架&#xff0c;AI工人操作行为流程规范识别算法对作业人员的操作行为进行实时分析&#xff0c;根据设定算法规则判断操作行为是否符合作业标准规定的SOP流程。Yolo意思是You Only Look Once&#xff0c;它并没有真正的…

【Cortex-M3权威指南】学习笔记4 - 异常

目录 实现 CM3流水线CM3 详细框图CM3 总线接口总线连接模板 异常异常类型优先级定义优先级组 向量表中断输入于挂起NMI中断挂起 Fault 类异常总线 faults存储器管理 faults用法 faults SVC 与 PendSV 实现 CM3 流水线 CM3 处理器使用 3 级流水线&#xff0c;分别是&#xff1a;…

【从0学习Solidity】2. 值类型详解

Solidity极简入门: 2. 值类型 博主简介&#xff1a;不写代码没饭吃&#xff0c;一名全栈领域的创作者&#xff0c;专注于研究互联网产品的解决方案和技术。熟悉云原生、微服务架构&#xff0c;分享一些项目实战经验以及前沿技术的见解。关注我们的主页&#xff0c;探索全栈开发…

etcd分布式存储

etcd分布式存储 etcd简介etcd下载安装etcd常用命令etcd配置参数etcd集群golang操作etcd

Android大厂需要刷的(999道)面试题

想必大家都在为今年的金九银十做准备&#xff0c;今年也是最为艰难的一年。作为程序员从未感觉到如此艰难&#xff0c;身边不是被辞退就是找不到工作。先不说2023年应届生毕业即失业&#xff0c;作为开发15年的老Android程序员&#xff0c;现在也在和300个人挣一个岗位。 肉少…

嵌入式学习笔记(12)汇编写启动代码之设置栈和调用C语言

C语言运行时需求和栈的意义 “C语言运行时&#xff08;runtime&#xff09;”需要一定的条件&#xff0c;这些条件由汇编来提供。C语言运行时主要是需要栈。 C语言和栈的关系&#xff1a;C语言中的局部变量都是用栈来实现的。如果我们汇编部分没有给C部分预先设置合理合法的栈…

QT实现TCP通信(服务器与客户端搭建)

一、TCP通信框架 二、QT中的服务器操作 创建一个QTcpServer类对象&#xff0c;该类对象就是一个服务器调用listen函数将该对象设置为被动监听状态&#xff0c;监听时&#xff0c;可以监听指定的ip地址&#xff0c;也可以监听所有主机地址&#xff0c;可以通过指定端口号&#x…

前端需要学习哪些技术?

前端工程师岗位缺口一直很大&#xff0c;符合岗位要求的人越来越少&#xff0c;所以学习前端的同学要注意&#xff0c;一定要把技能学到扎实&#xff0c;做有含金量的项目&#xff0c;这样在找工作的时候展现更大的优势。 缺人才&#xff0c;又薪资高&#xff0c;那么怎样才能…

Unity制作下雨中的地面效果

Unity引擎制作下雨效果 大家好&#xff0c;我是阿赵。   之前介绍了Unity引擎里面通过UV偏移做序列帧动画的做法&#xff0c;这里再介绍一个进阶的用法&#xff0c;模拟地面下雨的雨点效果。 一、原理 最基本的原理&#xff0c;还是基于这个序列帧动画的做法。不过这里做一点…

Unity3D下如何采集camera场景数据并推送RTMP服务?

Unity3D使用场景 Unity3D是非常流行的游戏开发引擎&#xff0c;可以创建各种类型的3D和2D游戏或其他互动应用程序。常见使用场景如下&#xff1a; 游戏开发&#xff1a;Unity3D是一个广泛用于游戏开发的环境&#xff0c;适用于创建各种类型的游戏&#xff0c;包括动作游戏、角…

【Linux内核】以共享内存的方式实现进程间通信

现在有很多进程间通信的模式&#xff0c;但是我们选择一个简单的IPC机制&#xff08;共享内存&#xff09;来实现&#xff0c;并让它工作起来。 简单来讲我们实现了两个系统调用&#xff08;不可避免地需要我们完善IDT&#xff09;&#xff0c;发送方查看接受方是否接收&#…