视觉SLAM笔记--第4篇: 高斯牛顿法(GN)和列文伯格-马夸特算法(LM)的算法流程,优劣分析

参考博客

参考博客: https://blog.csdn.net/heshaofeng2ly/article/details/105812746#3GN_50
参考博客:LM算法流程

数学基础(泰勒展开)

泰勒展开公式:
f ( x ) = f ( x 0 ) 0 ! + f ′ ( x 0 ) 1 ! ( x − x 0 ) + f ′ ′ ( x 0 ) 2 ! ( x − x 0 ) 2 + . . . . . . + f ( n ) ( x 0 ) n ! ( x − x 0 ) n f(x)=\frac{f(x_{0})}{0!}+ \frac{f^{'}(x_{0})}{1!}(x-x_{0})+\frac{f^{''}(x_{0})}{2!}(x-x_{0})^{2}+......+\frac{f^{(n)}(x_{0})}{n!}(x-x_{0})^{n} f(x)=0!f(x0)+1!f(x0)(xx0)+2!f(x0)(xx0)2+......+n!f(n)(x0)(xx0)n

该式表示 f ( x ) f(x) f(x) x 0 x_{0} x0处的 n n n阶泰勒展开.

1. 高斯牛顿法(GN法)

Gauss Newton 是最优化算法里面最简单的方法之一。它的思想是将 f ( x ) f(x) f(x) 进行一阶的泰勒展开.

1.1 基本原理

待优化的目标函数: ∣ ∣ f ( x + Δ x ) ∣ ∣ 2 ||f(x+\Delta{x})||^{2} f(x+Δx)2

将目标函数中 f ( x + Δ x ) f(x+\Delta{x}) f(x+Δx) 进行一阶泰勒展开可得:
f ( x + Δ x ) ≈ f ( x ) + f ′ ( x ) Δ x f(x+\Delta{x})\approx{f(x)+f^{'}(x)\Delta{x}} f(x+Δx)f(x)+f(x)Δx
J ( x ) = f ′ ( x ) , J ( x ) J(x)=f^{'}(x), J(x) J(x)=f(x),J(x)表示 f ( x ) f(x) f(x)的一阶导数,是雅克比矩阵.

目的: 通过不断寻找下降矢量 Δ x \Delta{x} Δx, 使目标函数 ∣ ∣ f ( x + Δ x ) ∣ ∣ 2 ||f(x+\Delta{x})||^{2} f(x+Δx)2达到最小值, 变为线性的最小二乘问题:
Δ x ∗ = arg min ⁡ Δ x 1 2 ∣ ∣ f ( x + Δ x ) ∣ ∣ 2 = arg min ⁡ Δ x 1 2 ∣ ∣ f ( x ) + J ( x ) Δ x ∣ ∣ 2 \Delta{x}^{*}=\argmin_{\Delta{x}}\frac{1}{2}||f(x+\Delta{x})||^{2}=\argmin_{\Delta{x}}\frac{1}{2}||f(x)+J(x)\Delta{x}||^{2} Δx=Δxargmin21f(x+Δx)2=Δxargmin21f(x)+J(x)Δx2将其展开:
1 2 ∣ ∣ f ( x ) + J ( x ) Δ x ∣ ∣ 2 = 1 2 [ f ( x ) + J ( x ) Δ x ] T [ f ( x ) + J ( x ) Δ x ] \frac{1}{2}||f(x)+J(x)\Delta{x}||^{2}=\frac{1}{2}[f(x)+J(x)\Delta{x}]^{T}[f(x)+J(x)\Delta{x}] 21f(x)+J(x)Δx2=21[f(x)+J(x)Δx]T[f(x)+J(x)Δx] = 1 2 [ ∣ f ( x ) ∣ ∣ 2 + f T ( x ) J ( x ) Δ x + Δ x T J T ( x ) f ( x ) + Δ x T J T ( x ) J ( x ) Δ x ] =\frac{1}{2}[ |f(x)||^{2}+f^{T}(x)J(x)\Delta{x}+\Delta{x}^{T}J^{T}(x)f(x)+\Delta{x}^{T}J^{T}(x)J(x)\Delta{x} ] =21[f(x)2+fT(x)J(x)Δx+ΔxTJT(x)f(x)+ΔxTJT(x)J(x)Δx]这里需要注意的是 Δ x T J T ( x ) f ( x ) = ( f T ( x ) J ( x ) Δ x ) T \Delta{x}^{T}J^{T}(x)f(x)=(f^{T}(x)J(x)\Delta{x})^{T} ΔxTJT(x)f(x)=(fT(x)J(x)Δx)T 而转置不改变值的大小, 两者可以合并, 得到:
1 2 ∣ ∣ f ( x ) + J ( x ) Δ x ∣ ∣ 2 = 1 2 [ ∣ f ( x ) ∣ ∣ 2 + 2 f T ( x ) J ( x ) Δ x + Δ x T J T ( x ) J ( x ) Δ x ] \frac{1}{2}||f(x)+J(x)\Delta{x}||^{2}=\frac{1}{2}[ |f(x)||^{2}+2f^{T}(x)J(x)\Delta{x}+\Delta{x}^{T}J^{T}(x)J(x)\Delta{x} ] 21f(x)+J(x)Δx2=21[f(x)2+2fT(x)J(x)Δx+ΔxTJT(x)J(x)Δx]求上式关于 ∆x 的导数,并令其为零:
2 J T ( x ) f ( x ) + 2 J T ( x ) J ( x ) Δ x = 0 2J^{T}(x)f(x)+2J^{T}(x)J(x)\Delta{x}=0 2JT(x)f(x)+2JT(x)J(x)Δx=0

这里需要注意的是:
Y = A ∗ X , d Y d X = A T Y=A*X, \frac{dY}{dX}=A^{T} Y=AX,dXdY=AT
Y = X ∗ A , d Y d X = A Y=X*A, \frac{dY}{dX}=A Y=XA,dXdY=A
d X T d X = I \frac{dX^{T}}{dX}=I dXdXT=I

可以得到如下方程组:
J T ( x ) J ( x ) Δ x = − J T ( x ) f ( x ) J^{T}(x)J(x)\Delta{x}=-J^{T}(x)f(x) JT(x)J(x)Δx=JT(x)f(x)注意,我们要求解的变量是 ∆x,因此这是一个线性方程组,我们称它为增量方程,也可以称为高斯牛顿方程或者正规方程.
其中 J ( x ) = f ′ ( x ) J(x)=f^{'}(x) J(x)=f(x)表示 f ( x ) f(x) f(x)的一阶导数,是雅克比矩阵. f ( x ) f(x) f(x)为x处的值

1.2 GN迭代算法步骤

  • 给定初始值 x 0 x_{0} x0, 即取 x = x 0 x=x_{0} x=x0.
  • 对于第k次迭代,期初一阶导数雅克比矩阵 J ( x k ) = f ′ ( x k ) J(x_{k})=f^{'}(x_{k}) J(xk)=f(xk), 以及目标函数(误差) f ( x k ) f(x_{k}) f(xk).
  • 求解增量方程: J T ( x k ) J ( x k ) Δ x k = − J T ( x k ) f ( x k ) J^{T}(x_{k})J(x_{k})\Delta{x_{k}}=-J^{T}(x_{k})f(x_{k}) JT(xk)J(xk)Δxk=JT(xk)f(xk), 将(2)的值带入方程,求出 Δ x k \Delta{x_{k}} Δxk.
  • Δ x k \Delta{x_{k}} Δxk足够小,停止迭代. 否则令 x k + 1 = x k + Δ x k x_{k+1}=x_{k}+\Delta{x_{k}} xk+1=xk+Δxk, 返回(2), 继续迭代计算.

1.3 优缺点

  • 优点: 高斯牛顿(Gauss-Newton)法是对牛顿法的一种改进,它用雅克比矩阵的乘积近似代替牛顿法中的二阶Hessian 矩阵,从而省略了求二阶Hessian 矩阵的计算,计算量降低.

  • 缺点1: 在高斯牛顿法中,用来近似Hessian矩阵的 J T J J^{T}J JTJ可能是奇异矩阵(不可逆)或者病态的,此时会导致方程无解,稳定性很差,算法不收敛.

  • 缺点2: 由于采用二阶泰勒展开来进行的推导,而泰勒展开只是在一个较小的范围内的近似,因此如果高斯牛顿法计算得到的步长较大的话,上述的近似将不再准确,也会导致算法不收敛.

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

Levenberg-Marquardt (LM)在一定程度上修正了高斯牛顿法的缺点,因此它比高斯牛顿法更加鲁棒,不过是以牺牲一定的收敛速度为代价–它的收敛速度比高斯牛顿法慢. 也被称为阻尼牛顿法.

2.1 基本原理

LM法加入一个正定对角阵 u I uI uI, 一定程度上修正了GN的缺点.

LM算法增量方程:

( J T ( x ) J ( x ) + u I ) Δ x = − J T ( x ) f ( x ) (J^{T}(x)J(x)+uI)\Delta{x}=-J^{T}(x)f(x) (JT(x)J(x)+uI)Δx=JT(x)f(x)其中 u ≥ 0 , u u\geq{0}, u u0,u表示信赖域半径.

  • u = 0 u=0 u=0时,LM退化为高斯牛顿法(GN)
  • u u u很大时,LM退化为一阶梯度下降法

LM法会在每一次迭代计算因子 ρ \rho ρ来判断泰勒近似是否良好,并根据因子 ρ \rho ρ,动态扩大或缩小信赖域半径 u u u.
ρ = 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, 则认为泰勒近似比较准确, 可以扩大信赖域半径 u u u
  • 若因子 ρ \rho ρ远小于1, 则认为泰勒近似结果较差, 可以缩小信赖域半径 u u u

2.2 LM迭代算法步骤

  • 给定初始值 x 0 x_{0} x0, 设置 u u u初始值 u 0 u_{0} u0
    A 0 = J T ( x 0 ) J ( x 0 ) A_{0}=J^{T}(x_{0})J(x_{0}) A0=JT(x0)J(x0) u 0 = τ max ⁡ i ( a i i 0 ) u_{0}=\tau \max_{i}(a_{ii}^{0}) u0=τimax(aii0)其中 τ \tau τ需要自己设定, a i i a_{ii} aii A 0 A_{0} A0的对角线元素.

  • 第k次迭代,根据前面的公式求出步长 Δ x k \Delta x_{k} Δxk, 并计算此时的 ρ k \rho_{k} ρk.

  • 根据 ρ k \rho_{k} ρk的取值来调整信赖域半径:

    • (1) 若 ρ k ≤ 0.25 \rho_{k}\leq0.25 ρk0.25,说明步子过大, 泰勒近似较差,应缩小信赖域半径, 取 u k + 1 = 1 2 u k u_{k+1}=\frac{1}{2}u_{k} uk+1=21uk
    • (2) 若 ρ k ≥ 0.75 \rho_{k}\geq0.75 ρk0.75,说明步子较小, 泰勒近似准确,应扩大信赖域半径, 取 u k + 1 = 2 u k u_{k+1}=2u_{k} uk+1=2uk
    • (3) 若 0.25 < ρ k < 0.75 0.25<\rho_{k}<0.75 0.25<ρk<0.75,说明 泰勒近似介于两者之间,应保持此时的信赖域半径, 取 u k + 1 = u k u_{k+1}=u_{k} uk+1=uk
  • Δ x k \Delta x_{k} Δxk足够小, 则停止迭代, 否则根据 ρ k \rho_{k} ρk大小判断 x k + 1 x_{k+1} xk+1应该如何更新. 计算出 x k + 1 x_{k+1} xk+1后返回(2), 继续进行迭代:

    • (1) 若 ρ k ≤ 0 \rho_{k}\leq0 ρk0,说明误差向着上升而非下降的趋势变化了(与最优化的目标相反),这说明这一步迈得错得“离谱”了,这时不应该走到下一点,而应“原地踏步”,即取 x k + 1 = x k x_{k+1}=x_{k} xk+1=xk
    • (2) 若 ρ k ≥ 0 \rho_{k}\geq0 ρk0,说明可以向下一步走, 取 x k + 1 = x k + Δ x k x_{k+1}=x_{k}+\Delta x_{k} xk+1=xk+Δxk

2.3 优缺点

  • 优点: 在一定程度上修正了高斯牛顿算法不收敛的缺点,同时具备高斯牛顿法和一阶梯度算法的特点, 因此它比高斯牛顿法更加鲁棒.
  • 缺点: 由于需要不断计算更新收敛域半径 u u u,不断变化梯度下降步长,会导致收敛速度较慢.

3. 手抄版

在这里插入图片描述

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值