非线性优化的数值方法小结——梯度下降法,牛顿法,高斯牛顿法,LM法

news2024/11/16 1:31:31

非线性优化的数值方法小结——梯度下降法,牛顿法,高斯牛顿法,LM法

在非线性优化领域中,我们常采用一系列数值方法对构造的问题进行求解,各方法彼此联系,本文将对这些数值处理方法进行梳理构造。

问题描述

非线性优化问题有很多种,本文将用最常见的非线性优化问题——也是高斯牛顿法和LM法能处理的唯一问题——最小二乘问题展开分析:
最小二乘问题,即让误差函数的绝对值最小,我们设误差函数为f(x),则我们的目标是:
min ⁡ F ( x ) = 1 2 ∥ f ( x ) ∥ 2 2 \min F(x)=\frac{1}{2}\|f(x)\|_2^2 minF(x)=21f(x)22
使得F(x)最小化。如何解决这个问题呢?

梯度下降法

梯度下降法的思路是给定一个函数,在每次迭代让自变量x沿着负梯度方向前进一步,就可以让函数F(x)减小。最终函数将收敛至无法减小,也就是梯度为0的地方,也就是局部最小值。
F ( x ) = 1 2 ∥ f ( x ) ∥ 2 2 = 1 2 f ( x ) T f ( x ) F(x) = \frac{1}{2}\|f(x)\|_2^2=\frac{1}{2}f(x)^Tf(x) F(x)=21f(x)22=21f(x)Tf(x)
F ( x ) ′ = f ( x ) T ′ f ( x ) F(x)^{\prime} = f(x)^{T{\prime}}f(x) F(x)=f(x)Tf(x)
我们令 J = f ( x ) T ′ J=f(x)^{T{\prime}} J=f(x)T,梯度下降法的假设是让x沿着负梯度的方向运动:
x k + 1 = x k − α J x_{k+1} = x_{k} - {\alpha}J xk+1=xkαJ
α {\alpha} α是步长,常取0到1之间的值,这就是梯度下降法。另一种常用的方法最速下降法与梯度下降法形式相同,区别在于,梯度下降法中 α {\alpha} α是人工设定的经验值,最速下降法中, α {\alpha} α是求解优化问题:
α k = argmin ⁡ α k f ( x i − α k J ) \alpha_k=\operatorname{argmin}_{\alpha_k} f\left(x_i-\alpha_k J\right) αk=argminαkf(xiαkJ)
计算得到的。这个优化问题怎么求呢?最直观的方法,通过二分法不断搜索 α k {\alpha_k} αk的值取最优。
性质分析
1、梯度下降法是线性收敛的,由于没有用到函数本身的信息,收敛较慢。
2、对于强凸函数,具有全局收敛性。
3、由于每次都朝梯度方向运动,因此轨迹常呈锯齿状:
在这里插入图片描述

牛顿法

牛顿法是一种用于求解方程:
f ( x ) = 0 f(x) = 0 f(x)=0
的方法。其思路是,对于迭代过程中的值 x k x_{k} xk,过该点,沿着该点的梯度方向做直线,与横轴的交点即为 x k + 1 x_{k+1} xk+1
在这里插入图片描述

因此我们可以得到 x k x_{k} xk与$x_{k+1}的关系:
f ( x k + 1 ) − f ( x k ) = f ( x k ) ′ ( x k + 1 − x k ) f(x_{k+1})-f(x_{k}) = f(x_{k}) ^{\prime}(x_{k+1}-x_{k}) f(xk+1)f(xk)=f(xk)(xk+1xk)
我们希望 f ( x k + 1 ) = 0 f(x_{k+1})=0 f(xk+1)=0,因此,我们对 x k + 1 x_{k+1} xk+1这样取值:
x k + 1 = x k − f ( x k ) f ( x k ) ′ x_{k+1} = x_{k}-\frac{f(x_{k})}{f(x_{k})^{\prime}} xk+1=xkf(xk)f(xk)
牛顿法可以求解任意f(x) = 0的问题,在最小二乘问题中,我们希望得到F(x)的最小值,也就是F(x)'=0,因此,实际的迭代过程是:
x k + 1 = x k − F ( x k ) ′ F ( x k ) ′ ′ = x k − J f ( x k ) f ( x k ) ′ ′ + J J T x_{k+1} = x_{k}-\frac{F(x_{k})^{\prime}}{F(x_{k})^{\prime\prime}} = x_{k}-\frac{Jf(x_{k})}{f(x_{k})^{\prime\prime}+JJ^{T}} xk+1=xkF(xk)′′F(xk)=xkf(xk)′′+JJTJf(xk)
在多维情况下,我们一般称 f ( x k ) ′ ′ f(x_{k})^{\prime\prime} f(xk)′′为海森矩阵H,也就是:
x k + 1 = x k − J f ( x k ) H + J J T x_{k+1} = x_{k}-\frac{Jf(x_{k})}{H+JJ^{T}} xk+1=xkH+JJTJf(xk)
要注意,很多博主这块自己没弄清楚,海森矩阵和 J J T JJ^{T} JJT分不清,F(x)和f(x)分不清,导致一些模棱两可的推导。
性质分析
1、牛顿法需要求海森矩阵,在高维和规模较大的情况下计算量大,一般避免求海森矩阵。
2、牛顿法在最优点附近具有二次收敛性,比梯度法有快的多。但是,其代价是只具有局部收敛性,当初值远离最优点时,即便函数是凸的,依然有可能无解。

高斯牛顿法

从方法的名字也可以看出高斯牛顿法是高斯在牛顿法的基础上改进的,高斯发现,除了能对F(x)直接展开优化,还可以对f(x)做文章,于是他先将f(x)展开:

f ( x + Δ x ) = f ( x ) + J Δ x + o ( Δ x ) f(x+\Delta x) = f(x) + J\Delta x + o(\Delta x) f(x+Δx)=f(x)+JΔx+o(Δx)
我们可以求变量 Δ x \Delta x Δx的最优值来让F(x)最小:
G ( Δ x ) = F ( x + Δ x ) = 1 2 ∥ f ( x + Δ x ) ∥ 2 2 = 1 2 f ( x + Δ x ) T f ( x + Δ x ) G(\Delta x) = F(x+\Delta x) = \frac{1}{2}\|f(x+\Delta x)\|_2^2=\frac{1}{2}f(x+\Delta x)^Tf(x+\Delta x) G(Δx)=F(x+Δx)=21f(x+Δx)22=21f(x+Δx)Tf(x+Δx)
= 1 2 ( f ( x ) + J Δ x ) T ( f ( x ) + J Δ x ) = 1 2 f ( x ) T f ( x ) + f ( x ) J Δ x + Δ x T J T J Δ x =\frac{1}{2}(f(x)+J\Delta x)^T(f(x)+J\Delta x)= \frac{1}{2}f(x)^Tf(x) + f(x)J \Delta x + \Delta x^{T}J^{T}J\Delta x =21(f(x)+JΔx)T(f(x)+JΔx)=21f(x)Tf(x)+f(x)JΔx+ΔxTJTJΔx
该函数对\Delta x求导,得:
G ( Δ x ) ′ = J f ( x ) + J T J Δ x G(\Delta x)^{\prime} = Jf(x) + J^{T}J \Delta x G(Δx)=Jf(x)+JTJΔx
G ( Δ ) x ′ = 0 G(\Delta )x^{\prime} =0 G(Δ)x=0时,F(x+\Delta x) 取值达到了最小。因此,我们令:
Δ x = − J f ( x ) J T J \Delta x = -\frac{Jf(x)}{ J^{T}J} Δx=JTJJf(x)

有人也把 J T J { J^{T}J} JTJ写作 H H H,要注意这里的H并非海森矩阵。
性质分析
1、高斯牛顿法最大的改进在于不需要求海森矩阵,减少了计算量。
2、 J T J { J^{T}J} JTJ只能保证半正定,而其作为分母时需要是正定的。这导致算法可能出现奇异或接近奇异时稳定性差
3、和牛顿法的收敛性一样,高斯牛顿法也有局部二阶收敛性。
4、当求解出的步长 Δ x \Delta x Δx太大时,会导致局部近似不精确,甚至不收敛。牛顿法也有类似问题。

LM(列文伯格-马夸特)法

为了解决高斯牛顿法的不收敛性问题(顺便解决了歧义性问题),又诞生了LM方法。LM方法的核心思路是,引入一个迭代步长的信赖域 μ \mu μ,认为当 Δ x < μ \Delta x < \mu Δx<μ时,这次迭代才是可以信赖的。即:
min ⁡ F ( x ) = m i n 1 2 ∥ f ( x ) + J Δ x ∥  s.t  ∥ D Δ x < μ ∥ 2 \min F(x) = min \frac{1}{2}\left\|f(x)+J \Delta x\right\| \quad \text { s.t } \quad\|D \Delta x<\mu\|_2 minF(x)=min21f(x)+JΔx s.t DΔx<μ2
用拉格朗日法,将有约束问题转化为无约束问题:
L ( Δ x , λ ) = 1 2 ∥ f ( x ) + J Δ x ∥ 2 + λ 2 ( ∥ D Δ x ∥ 2 − μ ) L(\Delta x, \lambda)=\frac{1}{2}\left\|f(x)+J \Delta x\right\|^2+\frac{\lambda}{2}\left(\|D \Delta x\|^2-\mu\right) L(Δx,λ)=21f(x)+JΔx2+2λ(DΔx2μ)
求导并让导数为0,有:
( J J T + λ D T D ) Δ x = − J f ( x ) \left(J J^T+\lambda D^T D\right) \Delta x=-J f(x) (JJT+λDTD)Δx=Jf(x)
我们把 J T J { J^{T}J} JTJ写作 H H H,令D取单位矩阵I得:

Δ x = − J f ( x ) H + λ I \Delta x = -\frac{Jf(x)}{H+\lambda I} Δx=H+λIJf(x)
在实际使用中\lambda 是通过迭代计算得到的值。我们发现,当\lambda较小时,该方法和高斯牛顿法相同,当lambda较大时, Δ x = − J f ( x ) λ \Delta x = -\frac{Jf(x)}{\lambda} Δx=λJf(x),和梯度下降法形式i相同。可以认为LM方法是梯度方法和高斯牛顿法的结合,那么 λ \lambda λ如何计算呢?
一般,我们取一个较小的处置 λ 0 \lambda_{0} λ0,之后进行迭代,我们需要计算这次迭代的近似效果(也就是信赖程度):
ρ = f ( x + Δ x ) − f ( x ) J T Δ x \rho=\frac{f(x+\Delta x)-f(x)}{J^{T}\Delta x} ρ=JTΔxf(x+Δx)f(x)
ρ \rho ρ较大时,表示这次拟合程度较好,可以适当扩大信赖域,当 ρ \rho ρ较小时,表示拟合程度较差,需要缩小信赖域。
性质分析
1、LM法通过添加阻尼项(信赖域项),控制了 Δ x \Delta x Δx的大小,解决了高斯牛顿法收敛性差的问题。
2、阻尼项也解决了奇异的问题,保证了分母的正定性。

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

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

相关文章

Win系统如何下载安装使用cpolar内网穿透工具?

文章目录 概述什么是cpolar&#xff1f;cpolar可以用在哪些场景&#xff1f; 1. 注册cpolar帐号1.1 访问官网站点&#xff1a;[https://www.cpolar.com](https://link.zhihu.com/?targethttps%3A//www.cpolar.com/) 1.2 注册帐号 2. 下载Windows版本cpolar客户端2.1 下载并安装…

Vue.js 生命周期函数

系列文章目录 Vue.js基础简答题 文章目录 系列文章目录前言一、创建阶段1.beforeCreate2.created3.beforeMount4.mounted 二、运行阶段1.beforeUpdate2.updated 三、销毁阶段1.beforeDestroy2.destroyed 总结 前言 Vue.js 生命周期指的是Vue实例的生命周期&#xff1b; Vue实…

深入学习 Redis - 基于 Jedis 通过 Java 客户端操作 Redis

目录 一、Jedis 依赖 二、Java 客户端操控 redis 2.1、准备工作&#xff08;ssh 隧道&#xff09; 2.2、概要 2.2、string 2.3、hash 2.4、list 2.5、set 2.5、zset 一、Jedis 依赖 自己去 中央仓库 上面找. 二、Java 客户端操控 redis 2.1、准备工作&#xff08;ssh 隧…

数学建模学习(7):单目标和多目标规划

优化问题描述 优化 优化算法是指在满足一定条件下,在众多方案中或者参数中最优方案,或者参数值,以使得某个或者多个功能指标达到最优,或使得系统的某些性能指标达到最大值或者最小值 线性规划 线性规划是指目标函数和约束都是线性的情况 [x,fval]linprog(f,A,b,Aeq,Beq,LB,U…

C++创建线程

前言 线程是轻量级的进程&#xff08;LWP&#xff1a;light weight process&#xff09;&#xff0c;在Linux环境下线程的本质仍是进程。在计算机上运行的程序是一组指令及指令参数的组合&#xff0c;指令按照既定的逻辑控制计算机运行。操作系统会以进程为单位&#xff0c;分…

【点云处理教程】03使用 Python 实现地面检测

一、说明 这是我的“点云处理”教程的第3篇文章。“点云处理”教程对初学者友好&#xff0c;我们将在其中简单地介绍从数据准备到数据分割和分类的点云处理管道。 在上一教程中&#xff0c;我们在不使用 Open3D 库的情况下从深度数据计算点云。在本教程中&#xff0c;我们将首先…

H5打包封装小程序系统开发

H5打包封装小程序系统开发 H5打包封装小程序系统开发是指将H5页面打包封装成小程序的开发过程。下面是一个简单的步骤&#xff1a; 准备工作&#xff1a;首先&#xff0c;需要准备好H5页面的代码和资源文件。确保H5页面在浏览器中正常运行&#xff0c;并且没有依赖于浏览器特…

【LeetCode每日一题合集】2023.7.24-2023.7.30

文章目录 771. 宝石与石头代码1——暴力代码2——位运算集合⭐&#xff08;英文字母的long集合表示&#xff09; 2208. 将数组和减半的最少操作次数&#xff08;贪心 优先队列&#xff09;2569. 更新数组后处理求和查询⭐⭐⭐⭐⭐&#xff08;线段树&#xff09;TODO2500. 删除…

渗透测试技术知识技能全景图(超清晰哦~~!)

这张技术全景图是博主对信息安全专业的了解学习&#xff0c;以及通过多方资料学习整理出来的&#xff0c;也结合了个人的一些学习经验在里面&#xff0c;图里详细列举了渗透测试这门技术应该具备的知识技能以及一些相关的图书的推荐。里面东西均为通过个人经验对渗透测试的了解…

DRIFTINGBLUES-1靶机通关详解

信息收集 漏洞发现 进web看源码发现 解码得到 /noteforkingfish.txt 访问发现是ook 解得 先把这个名字记下来 说不定之后要ssh爆破有用 然后他说要用 host file 注意到域名可能是driftingblues.box 加到hosts里试试 没啥用 看别人wp知道还得爆破子域名 那kali也添加个hosts…

【腾讯云 Cloud Studio 实战训练营】全新的开发方式,让你实现一站式开发

一、前言 关于 Cloud Studio 全在线云端开发 用户只需要浏览器就可以访问和使用Cloud Studio,无需在本地配置开发环境。Cloud Studio将开发环境部署在云服务器上,用户可以随时随地进行开发。多语言支持 Cloud Studio支持常见的开发语言,如Node.js、Python、Java、PHP等。用户…

QtC++ 技术分析3 - IOStream

目录 iostreamscanf/printfiostream 整体架构流相关类流缓冲区 模板特化后整体结构文件流文件流对象创建常见文件流操作输出格式设定文件流状态 字符串流字符串流内部缓冲区字符串流使用 流缓冲区用户自定义 IO iostream scanf/printf 几种常见的输入输出流函数 scanf 从键盘…

哆啦A梦(Python代码实现)

目录 1 送她的多啦A梦 2 白驹过隙 3 Python代码实现 1 送她的多啦A梦 一个哆啦A梦让她开心开心好久好久。我也很开心&#xff0c;昨天送了一个实体模型&#xff0c;今天用Python代码再弄一个送给她。 哆啦A梦&#xff08;日语&#xff1a;ドラえもん&#xff0c;英语&…

linux页框回收之shrink_node函数源码剖析

概述 《Linux内存回收入口_nginux的博客-CSDN博客》前文我们概略的描述了几种内存回收入口&#xff0c;我们知道几种回收入口最终都会调用进入shrink_node函数&#xff0c;本文将以Linux 5.9源码来描述shrink_node函数的源码实现。 函数调用流程图 scan_control数据结构 str…

如何关闭谷歌浏览器自动更新

适用范围: 写自动化脚本时&#xff0c;需要安装浏览器驱动&#xff0c;安装浏览器驱动时需要下载对应的浏览器驱动版本&#xff0c;如果浏览器版本一直在自动更新的话&#xff0c;自动化脚本会报错浏览器版本和浏览器驱动不匹配&#xff0c;所以建议关闭谷歌浏览器自动更新&am…

认识 springboot 之 它的配置文件 -2

前言 本篇了解springboot中配置的作用&#xff0c;介绍配置文件的种类&#xff0c;介绍简单使用配置文件&#xff0c;简单的小技巧如何设置注释&#xff0c;开启热部署等等&#xff0c;如有错误&#xff0c;请在评论区指正&#xff0c;让我们一起交流&#xff0c;共同进步&…

内存分区模型

C程序在执行时&#xff0c;将内存大方向划分为4个区域 代码区&#xff1a;存放函数体的二进制代码&#xff0c;由操作系统进行管理的全局区&#xff1a;存放全局变量和静态变量以及常量栈区&#xff1a;由编译器自动分配释放, 存放函数的参数值,局部变量等堆区&#xff1a;由程…

ReentrantLock锁的实现

ReentrantLock基于AQS&#xff0c;在并发编程中可以实现公平锁和非公平锁来对同步资源进行控制&#xff0c;并且是可重入锁。 1.ReentrantLock中的类的继承结构&#xff1a; 2.构造方法&#xff1a; 3.非公平锁的实现 看是否能够通过CAS来设置state来获取到锁&#xff0c;如果…

【数据结构】这堆是什么

目录 1.二叉树的顺序结构 2.堆的概念及结构 3.堆的实现 3.1 向上调整算法与向下调整算法 3.2 堆的创建 3.3 建堆的空间复杂度 3.4 堆的插入 3.5 堆的删除 3.6 堆的代码的实现 4.堆的应用 4.1 堆排序 4.2 TOP-K问题 首先&#xff0c;堆是一种数据结构&#xff0c;一种特…

Selenium开发环境搭建

1.下载Python https://www.python.org/downloads/ 下载下来选择自己创建的路径进行安装&#xff0c;然后配置环境变量 cmd命令框查看 2.安装selenium cmd命令框输入&#xff1a; pip install selenium3.下载pycharm https://www.jetbrains.com/pycharm/download/#sec…