目录

  • 前言
  • 最速下降法(梯度下降/一阶导数法)
  • 牛顿法(二阶导数法)
  • 高斯牛顿法
  • Levenberg-Marquadt(LM算法)

前言

最优化方法应用广泛,但在实现原理上大同小异。作者在学习高翔博士的视觉SLAM十四讲的过程中对其第六章非线性最小二乘求解所涉及到的最优化方法(最速下降、牛顿法、高斯牛顿法、LM算法)进行了简要总结如下:

最速下降法(梯度下降/一阶导数法)

作者在最速下降法解析(理解笔记)中曾经介绍过最速下降法的实现过程,并列举了一个小例子。在这里,为了文章整体的完整性,我们再重新叙述一下,大家也可以参考。
假设我们希望求解一个最小二乘问题:
min⁡x=12∥f(x)∥22\min_{x} = \frac{1}{2}\begin{Vmatrix}f(x)\end{Vmatrix}^2_2xmin​=21​∥∥​f(x)​∥∥​22​
把上式在xxx处进行泰勒展开:
∥f(x+Δx)∥22=∥f(x)∥22+J(x)Δx+12ΔxTH(x)Δx\begin{Vmatrix}f(x+\Delta x)\end{Vmatrix}^2_2=\begin{Vmatrix}f(x)\end{Vmatrix}^2_2+J(x)\Delta x+ \frac{1}{2}\Delta x^TH(x)\Delta x∥∥​f(x+Δx)​∥∥​22​=∥∥​f(x)​∥∥​22​+J(x)Δx+21​ΔxTH(x)Δx
式中J(x)J(x)J(x)与H(x)H(x)H(x)分别为关于变量xxx的雅克比矩阵(一阶导数)和海塞矩阵(二阶导数)。
在梯度下降法中,我们只考虑在xxx处的一阶梯度。则上式变为:
∥f(x+Δx)∥22=∥f(x)∥22+J(x)Δx\begin{Vmatrix}f(x+\Delta x)\end{Vmatrix}^2_2=\begin{Vmatrix}f(x)\end{Vmatrix}^2_2+J(x)\Delta x∥∥​f(x+Δx)​∥∥​22​=∥∥​f(x)​∥∥​22​+J(x)Δx
认为沿着一阶梯度反方向下降最快,当然,在迭代过程中每一步走多长也是一个需要考虑的问题,我们可以设计一个定长λ\lambdaλ。当然这种方式有着明显的不合理之处,一个较大的步长会导致我们在优化过程中走出锯齿状路线,而一个较小的步长则会导致我们收敛速度过慢。这种设置为固定步长λ\lambdaλ的方式为梯度下降法。很多时候认为梯度下降最速下降是等价的,这并不十分准确,最速下降法对步长λ\lambdaλ进行选取一个最优的λ∗\lambda^*λ∗。
其把λ\lambdaλ代入:x(1)=x(0)−λJ(x)x_{(1)}=x_{(0)}-\lambda J(x)x(1)​=x(0)​−λJ(x),然后求取在f(x(1))f(x_{(1)})f(x(1)​)处取得最小值的λ\lambdaλ作为λ∗\lambda^*λ∗。

建议读者去最速下降法解析(理解笔记)看一下实际使用过程中的例子。

牛顿法(二阶导数法)

这里我们保留在xxx处的二阶展开项:
∥f(x+Δx)∥22=∥f(x)∥22+J(x)Δx+12ΔxTH(x)Δx\begin{Vmatrix}f(x+\Delta x)\end{Vmatrix}^2_2=\begin{Vmatrix}f(x)\end{Vmatrix}^2_2+J(x)\Delta x+ \frac{1}{2}\Delta x^TH(x)\Delta x∥∥​f(x+Δx)​∥∥​22​=∥∥​f(x)​∥∥​22​+J(x)Δx+21​ΔxTH(x)Δx

首先明确一下我们的目的是找到一个最优的Δx∗\Delta x^*Δx∗使得上式取得最小值:
Δx∗=arcmin(∥f(x)∥22+J(x)Δx+12ΔxTH(x)Δx)\Delta x^*=arcmin(\begin{Vmatrix}f(x)\end{Vmatrix}^2_2+J(x)\Delta x+ \frac{1}{2}\Delta x^TH(x)\Delta x)Δx∗=arcmin(∥∥​f(x)​∥∥​22​+J(x)Δx+21​ΔxTH(x)Δx)

将上式视为Δx\Delta xΔx的函数,对Δx\Delta xΔx进行求导,得到如下形式:

J(x)+H(x)ΔxJ(x)+ H(x)\Delta xJ(x)+H(x)Δx
令其导数为0:
J(x)+H(x)Δx=0J(x)+ H(x)\Delta x=0J(x)+H(x)Δx=0
则取得极小值,解出增量为:
Δx=−H(x)−1J(x)\Delta x=- H(x)^{-1}J(x)Δx=−H(x)−1J(x)

还有另外一种理解方式是把牛顿法看成是对一阶导数法的求根过程,即使用牛顿法求解原函数一阶导数为零的Δx\Delta xΔx。

牛顿法需要计算目标函数的二阶导数H(x)H(x)H(x),这在遇到规模较大的问题时,会比较困难,因此我们常常避免H(x)H(x)H(x)矩阵的运算。
后续的高斯牛顿法LM算法解决了这个问题。

高斯牛顿法

高斯牛顿法是对函数f(x)f(x)f(x)进行一阶展开(注意不是f(x)2f(x)^2f(x)2),展开形式如下:
f(x+Δx)≈f(x)+J(x)Δxf(x+\Delta x)\approx f(x)+J(x)\Delta xf(x+Δx)≈f(x)+J(x)Δx
这里的J(x)也是雅克比矩阵,与前述不同的是这里是f(x)f(x)f(x)对变量xxx的导数。
由此,当前我们的目标变成了:寻找一个增量Δx\Delta xΔx,使得∥f(x+Δx)∥22\begin{Vmatrix}f(x+\Delta x)\end{Vmatrix}^2_2∥∥​f(x+Δx)​∥∥​22​的值达到最小。即求解下述关系:
Δx∗=argmin⁡Δx(12∥f(x)+J(x)Δx∥22)\Delta x^*=arg\min_{\Delta x} (\frac{1}{2}\begin{Vmatrix}f(x)+J(x)\Delta x\end{Vmatrix}^2_2)Δx∗=argΔxmin​(21​∥∥​f(x)+J(x)Δx​∥∥​22​)
展开上式:
12∥f(x)+J(x)Δx∥22=12(f(x)+J(x)Δx)T(f(x)+J(x)Δx)=12(∥f(x)∥22+2f(x)TJ(x)Δx+ΔxTJ(x)TJ(x)Δx)\frac{1}{2}\begin{Vmatrix}f(x)+J(x)\Delta x\end{Vmatrix}^2_2 \\ =\frac{1}{2}(f(x)+J(x)\Delta x)^T(f(x)+J(x)\Delta x) \\ = \frac{1}{2}(\begin{Vmatrix}f(x)\end{Vmatrix}^2_2+2f(x)^TJ(x)\Delta x+\Delta x^{T}J(x)^{T}J(x)\Delta x)21​∥∥​f(x)+J(x)Δx​∥∥​22​=21​(f(x)+J(x)Δx)T(f(x)+J(x)Δx)=21​(∥∥​f(x)​∥∥​22​+2f(x)TJ(x)Δx+ΔxTJ(x)TJ(x)Δx)
上式关于Δx\Delta xΔx求导,并令其为0:
J(x)Tf(x)+J(x)TJ(x)Δx=0J(x)^Tf(x)+J(x)^{T}J(x)\Delta x=0J(x)Tf(x)+J(x)TJ(x)Δx=0
即:
J(x)TJ(x)Δx=−J(x)Tf(x)J(x)^{T}J(x)\Delta x=-J(x)^Tf(x)J(x)TJ(x)Δx=−J(x)Tf(x)
上式是一个线性方程组,被称为增量方程,也可以称为高斯牛顿方程或者正规方程。把左边的系数即为HHH,右侧记为ggg,则上式转换为:
HΔx=gΔx=H−1gH\Delta x=g \\ \Delta x=H^{-1}gHΔx=gΔx=H−1g
这里的HHH即为牛顿法里海塞矩阵的近似,省略了计算二阶导数的过程。

上述过程中我们使用了J(x)TJ(x)J(x)^{T}J(x)J(x)TJ(x)的逆,但是J(x)TJ(x)J(x)^{T}J(x)J(x)TJ(x)是半正定的,不能保证其为非奇异性。

Levenberg-Marquadt(LM算法)

LM算法是一种信赖域方法,我们使用一个参数 ρ\rhoρ 来根据我们的近似模型跟实际函数之间的差异来确定这个范围,如果ρ\rhoρ的值较小,则差异较小,让范围继续扩大,而如果ρ\rhoρ的值很大,则差异较大,则缩小范围:
ρ=f(x+Δx)−f(x)J(x)Δx\rho=\frac{f(x+\Delta x)-f(x)}{J(x)\Delta x}ρ=J(x)Δxf(x+Δx)−f(x)​
上式中分子是实际函数下降的值,分母是近似值。若ρ\rhoρ的值接近1则认为近似是好的。如果ρ\rhoρ太小,则认为近似比较差,则需要缩小近似范围。反之,如果ρ\rhoρ比较大,则认为实际下降的比预计的大,我们可以扩大近似范围。

上图中公式(6.24)是一个带有不等式约束的优化问题。使用一个Lagrange乘子把其转换为一个无约束优化问题。
min⁡Δxk=12∥f(xk)+J(xk)Δxk∥22+λ2∥DΔx∥22\min_{\Delta x_{k}}= \frac{1}{2}\begin{Vmatrix}f(x_{k})+J(x_{k})\Delta x_{k}\end{Vmatrix}^2_2+ \frac{\lambda}{2}\begin{Vmatrix}D\Delta x\end{Vmatrix}^2_2Δxk​min​=21​∥∥​f(xk​)+J(xk​)Δxk​​∥∥​22​+2λ​∥∥​DΔx​∥∥​22​
使用类似于高斯牛顿法中的过程,对上式进行求导,然后使其导数为0,得到的增量方程为:
(H+λDTD)Δx=g(H+\lambda D^TD)\Delta x=g(H+λDTD)Δx=g
与高斯牛顿法相比,我们可以发现多出来一项λDTD\lambda D^TDλDTD,简化记D=ID=ID=I则上式变为:
(H+λI)Δx=g(H+\lambda I)\Delta x=g(H+λI)Δx=g
可以由上式观察到,当参数λ\lambdaλ的值比较大时,则LM算法接近为最速下降法,而λ\lambdaλ的值较小时则近似于高斯牛顿法。

最优化方法(最速下降、牛顿法、高斯牛顿法、LM算法)相关推荐

  1. 梯度下降、牛顿法、高斯牛顿L-M算法比较

    本文梳理一下常见的几种优化算法:梯度下降法,牛顿法.高斯-牛顿法和L-M算法,优化算法根据阶次可以分为一阶方法(梯度下降法),和二阶方法(牛顿法等等),不同优化算法的收敛速度,鲁棒性都有所不同.一般来 ...

  2. 最优化方法总结——梯度下降法、最速下降法、牛顿法、高斯牛顿法、LM法、拟牛顿法

    目录 1 最优化方法的结构 2 常用最优化方法对比分析 3 相关计算公式 1 最优化方法的结构 最优化问题的一般形式为: 其中为决策变量,是目标函数,为约束集或可行域.特别地,如果,则最优化问题成为无 ...

  3. 相机校正、张氏标定法、极大似然估计/极大似然参数估计、牛顿法、高斯牛顿法、LM算法、sin/cos/tan/cot

    日萌社 人工智能AI:Keras PyTorch MXNet TensorFlow PaddlePaddle 深度学习实战(不定时更新) CNN:RCNN.SPPNet.Fast RCNN.Faste ...

  4. SLAM从0到1——状态估计之最小二乘问题解法:最速下降法、牛顿法、高斯牛顿法、LM法...

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 学习3D视觉核心技术,扫描查看介绍,3天内无条件退款 圈里有高质量教程资料.可答疑解惑.助你高效解决问 ...

  5. 最优化八:高斯牛顿法、LM法

    梯度法:,负梯度方向 牛顿法:,A为Hession矩阵 高斯牛顿法:,为的解 LM法:,为的解 1 高斯牛顿法(Gauss-Newton) 针对优化问题求解x使得f(x)取得最小值,采用高斯牛顿法,步 ...

  6. 陈宝林《最优化理论与算法》超详细学习笔记 (一)————第十章 使用导数的最优化方法(最速下降法、牛顿法、阻尼牛顿法)

    陈宝林<最优化理论与算法>超详细学习笔记 (一)----第十章 使用导数的最优化方法(最速下降法.牛顿法.阻尼牛顿法) 写在前面 第十章 使用导数的最优化方法 最速下降法 牛顿法 阻尼牛顿 ...

  7. 牛顿法、梯度下降法、高斯牛顿法、Levenberg-Marquardt算法

    何为梯度? 一般解释: f(x)在x0的梯度:就是f(x)变化最快的方向 举个例子,f()是一座山,站在半山腰, 往x方向走1米,高度上升0.4米,也就是说x方向上的偏导是 0.4 往y方向走1米,高 ...

  8. 高斯牛顿算法matlab代码,matlab实现高斯牛顿法、Levenberg–Marquardt方法

    高斯牛顿法: function [ x_ans ] = GaussNewton( xi, yi, ri) % input : x = the x vector of 3 points % y = th ...

  9. 高斯牛顿迭代matlab程序,高斯—牛顿法(LM法)迭代无法收敛,代码如下,R14b版本...

    本帖最后由 大禹man 于 2017-2-25 16:07 编辑 需要拟合的函数为zeta,用omeg的前两个数计算得到系数a0和a1,他们会在循环过程中随着miu0和miu1变化,我的程序如下,可以 ...

  10. 牛顿法和高斯牛顿法对比

    文章目录 一.非线性最小二乘 一.牛顿法 二.高斯牛顿法 三.列文伯格-马夸尔特法(LM) 四.ceres求解优化问题 一.非线性最小二乘 考虑最小二乘函数F(x), 其等于: 通过求F(x)导数为零 ...

最新文章

  1. 知乎算法团队负责人孙付伟:Graph Embedding在知乎的应用实践
  2. 【拓扑排序】【bitset】Gym - 101128A - Promotions
  3. vue开发(2) 使用vue-cli来构建项目
  4. Codeforces 1144D Deduction Queries 并查集
  5. Entityframework批量删除
  6. failed to allocate 192.19M (201523200 bytes) from device: CUDA_ERROR_OUT_OF_MEMORY: out of memory
  7. linux安装.AppImage后缀安装包
  8. linux lamp框架,LAMP架构协同应用的实例——phpMyAdmin
  9. java 悬浮提示框_弹出提示框的方式——java
  10. 查看docker run启动参数命令 runlike
  11. CentOS7 安装jdk8教程
  12. xcode 可以打开xmind_思维导图,原来Xmind这么强大
  13. 【京东商城首页实战4】topbanner制作
  14. Stochastic Weight Averaging (SWA) 随机权重平均
  15. storj for windows 主网挖矿指南
  16. 神经网络基础之激活函数
  17. Android 6.0-13.0系统兼容
  18. 免费下载学术文献的网站,好用!
  19. luogu 1327 数列排序 2017 ACM-ICPC 亚洲区(南宁赛区)网络赛 J题 循环节
  20. 老笔记整理二:网页小问题汇总

热门文章

  1. stm32烧写序列号
  2. 4款开源中文分词系统。
  3. 花生壳 Linux arm
  4. 十大免费java开源商城系统
  5. 17 张程序员壁纸(使用频率很高)
  6. MATLAB绘图/数据的可视化
  7. Git以及GithubDesktop配置ssh访问/下载/上传 详细步骤
  8. java的json解析工具_json在java中的几种解析工具的使用
  9. 两款扒站工具使用说明
  10. 中学计算机基础知识,初中信息技术学业水平考试计算机基础知识考点大全(重点汇总)...