SLAM中非线性优化问题求解方法

前言

这篇文章是为了解释下面几个问题:

  1. Levenberg-Marquardt算法、Dog-Leg算法详细实现流程?
  2. Gauss-Newton算法为什么优于最速下降算法?
  3. Levenberg-Marquardt算法为什么优于Gauss-Newton算法?

简单对比

算法类型优点缺点
最速下降法一定能收敛线性收敛
牛顿法二阶收敛需要计算复杂的Hessian矩阵、Hessian矩阵半正定会带来增量求解的不稳定或不收敛
高斯牛顿法正常线性收敛,当目标函数值为0时二阶收敛近似的Hessian矩阵半正定,会带来增量求解的不稳定和不收敛
列文伯格-马夸尔特法解决高斯牛顿法Hessian矩阵半正定问题,能以较稳定较快速的方法收敛到局部最优值一般为线性收敛
狗腿法能较稳较快的收敛到局部最优值,在参考文献中有通过例子说明该方法在求解非线性方程组时在速度上优于LM法一般为线性收敛

上面表格中出现了线性收敛、二阶收敛等收敛性名词,其定义如下:
线 性 收 敛 : ∥ e k + 1 ∥ ≤ ∥ a e k ∥ 当 ∥ e k ∥ 比 较 小 , 并 且 0 < a < 1 二 阶 收 敛 : ∥ e k + 1 ∥ ≤ O ( ∥ e k ∥ 2 ) 当 ∥ e k ∥ 比 较 小 超 线 性 收 敛 : ∥ e k + 1 ∥ / ∥ e k ∥ → 0 当 k → ∞ \begin{matrix} 线性收敛: & \left\| \mathbf{e}_{k+1} \right\| \le \left\| a\mathbf{e}_{k} \right\| & 当 \left\| \mathbf{e}_{k} \right\|比较小,并且 0 < a < 1\\ 二阶收敛: & \left\| \mathbf{e}_{k+1} \right\| \le O(\left\| \mathbf{e}_{k} \right\|^{2} )& 当 \left\| \mathbf{e}_{k} \right\|比较小\\ 超线性收敛: & \left\| \mathbf{e}_{k+1} \right\| / \left\| \mathbf{e}_{k} \right\|\to0 & 当 k\to\infty \end{matrix} 线::线:ek+1aekek+1O(ek2)ek+1/ek0ek0<a<1ekk

Levenberg-Marquardt算法流程

在这里插入图片描述
上面伪码中需要说明的有:

  1. 最小二乘问题形式如下:
    F ( x ) = 1 2 ∑ i = 1 m ( f i ( x ) ) 2 = 1 2 ∥ f ( x ) ∥ 2 = 1 2 f ( x ) T f ( x ) (0) \mathbf{F(x)} = \frac{1}{2}\sum_{i=1}^{m}(\mathbf{f}_{i}(\mathbf{x}))^{2} = \frac{1}{2}\left\| \mathbf{f(x)} \right\|^{2} = \frac{1}{2}\mathbf{f(x)}^{T}\mathbf{f(x)} \tag{0} F(x)=21i=1m(fi(x))2=21f(x)2=21f(x)Tf(x)(0)
  2. L ( h ) \mathbf{L(h)} L(h)的形式如下:
    F ( x + h ) ≃ L ( h ) = F ( x ) + h T J T f + 1 2 h T J T J h (1) \mathbf{F(x+h)} \simeq \mathbf{L(h)} = \mathbf{F(x)} + \mathbf{h}^{T}\mathbf{J}^{T}\mathbf{f} + \frac{1}{2}\mathbf{h}^{T}\mathbf{J}^{T}\mathbf{J}\mathbf{h} \tag{1} F(x+h)L(h)=F(x)+hTJTf+21hTJTJh(1)
    其中 J ( x ) \mathbf{J(x)} J(x) f ( x ) \mathbf{f(x)} f(x) 相对于 x \mathbf{x} x 的雅克比矩阵,可以看出 L ( h ) \mathbf{L(h)} L(h) 其实就是 F ( x ) \mathbf{F(x)} F(x) x \mathbf{x} x 处的近似二阶泰勒展开,用 J T J \mathbf{J}^{T}\mathbf{J} JTJ 近似代替 Hessian矩阵 F ′ ′ ( x ) \mathbf{F''(x)} F(x)
  3. 增益系数理解:
    在"计算增益系数"公式中可以看出分子是 F ( x ) \mathbf{F(x)} F(x) 实际变化,而分母是其近似 L ( h ) \mathbf{L(h)} L(h) 的变化,因此该分数值主要是衡量了近似的好坏,分数值越大说明近似得越好,反之则近似得越差。
  4. 阻尼系数理解:
    从更新阻尼系数 μ \mu μ 的过程来看,其值随着增益系数 ρ \rho ρ 的增大而不断减小,结合增益系数理解部分内容,可以看出二阶泰勒近似得越好,则减小 μ \mu μ ,反之则增大 μ \mu μ
    再从求解线性方程过程中的线性方程角度来看,当 μ \mu μ 逐渐变大到极大时,此时增量 h l m = − g / μ \mathbf{h}_{lm}=-\mathbf{g}/\mu hlm=g/μ,此为最速下降法计算增量过程,也就是说此时LM法变成了最速下降法。而当 μ \mu μ 逐渐变小到极小时,线性方程则近似为 A h l m = − g \mathbf{Ah}_{lm}=-\mathbf{g} Ahlm=g,此为高斯牛顿法增量计算过程,也就是说此时LM法变成了高斯牛顿法。
    综合以上来看,LM算法是高斯牛顿法和最速下降法结合的一个混合算法,当二阶近似结果越接近真实 F ( x ) \mathbf{F(x)} F(x) 时,此混合算法越偏向于利用高斯牛顿法来计算增量,反之则更偏向于利用最速下降法来计算增量。
  5. 迭代停止条件
    LM算法迭代停止条件有三个,分别是函数值 g \mathbf{g} g 的范数小于给定的阈值 ε 1 \varepsilon_{1} ε1, 迭代次数超过给定阈值 k m a x k_{max} kmax,迭代获得的增量范数小于给定阈值 ε 2 ( ∥ x ∥ + ε 2 ) \varepsilon_{2}(\left\| \mathbf{x} \right\| + \varepsilon_{2}) ε2(x+ε2)。此三个阈值都是结合实际处理问题来人为设定的。

Dog-Leg算法流程

在这里插入图片描述

上面伪码中需要说明的有:

  1. 计算最速下降法方向
    先计算相对增益:
    F ( x ) − F ( x + α h s d ) α ∣ ∣ h s d ∣ ∣ = − 1 ∣ ∣ h s d ∣ ∣ h s d T F ′ ( x ) = − ∣ ∣ F ′ ( x ) ∣ ∣ c o s ( θ ) \frac{\mathbf{F(x)}-\mathbf{F(x+\alpha\mathbf{h}_{sd})}}{\alpha ||\mathbf{h}_{sd}||} = -\frac{1}{||\mathbf{h}_{sd}||}\mathbf{h}_{sd}^{T}\mathbf{F'(x)}=-||\mathbf{F'(x)}||cos(\theta) αhsdF(x)F(x+αhsd)=hsd1hsdTF(x)=F(x)cos(θ)
    式中 θ \theta θ 角是向量 h s d \mathbf{h}_{sd} hsd和一阶导数 F ′ ( x ) \mathbf{F'(x)} F(x) 之间的夹角,可以看出当两者方向相反时,即 θ \theta θ 最大时,相对增益最大,也就是下降速度最快的方向,所以:
    h s d = − F ′ ( x ) \mathbf{h}_{sd} = -\mathbf{F}'(\mathbf{x}) hsd=F(x)
  2. 计算最速下降法步长
    一阶泰勒展开:
    F ( x + α h s d ) ≃ 1 2 ∥ f ( x ) + α J ( x ) h s d ∥ 2 = F ( x ) + α h s d T J ( x ) T f ( x ) + 1 2 α 2 ∥ J ( x ) h s d ∥ 2 \begin{aligned} \mathbf{F}(\mathbf{x}+\alpha\mathbf{h}_{sd}) &\simeq \frac{1}{2}\left\| \mathbf{f(x)}+\alpha\mathbf{J(x)}\mathbf{h}_{sd}\right\|^{2} \\ &= \mathbf{F(x)} + \alpha\mathbf{h}_{sd}^{T}\mathbf{J(x)}^{T}\mathbf{f(x)} + \frac{1}{2}\alpha^{2}\left\| \mathbf{J(x)h}_{sd} \right\|^{2} \end{aligned} F(x+αhsd)21f(x)+αJ(x)hsd2=F(x)+αhsdTJ(x)Tf(x)+21α2J(x)hsd2
    再令 F ( x + α h s d ) \mathbf{F}(\mathbf{x}+\alpha\mathbf{h}_{sd}) F(x+αhsd) 相对于 α \alpha α 的导数为0,可得:
    α = − h s d T ∗ J ( x ) T f ( x ) ∥ J ( x ) h s d ∥ 2 = ∥ g ∥ 2 ∥ J ( x ) g ∥ 2 \alpha = -\frac{\mathbf{h}_{sd}^{T} * \mathbf{J(x)}^{T}\mathbf{f(x)}}{\left\| \mathbf{J(x)h}_{sd} \right\|^{2}} = \frac{\left\| \mathbf{g} \right\|^{2}}{\left\|\mathbf{J(x)g}\right\|^{2}} α=J(x)hsd2hsdTJ(x)Tf(x)=J(x)g2g2
  3. 计算狗腿法增量
    在这里插入图片描述
  4. 增益系数、迭代终止条件等与LM算法一样

回答问题

  1. 上面的LM算法和DL算法的伪码流程已经非常清晰了,并对里面的计算部分进行了详细的推导计算说明
  2. 从上面表格对比来看,主要是高斯牛顿法收敛速度更快
  3. 高斯牛顿法的近似Hessian矩阵是半正定的,必然会存在计算不稳定不收敛的情况,但LM算法混合了最速下降法在里面,最速下降法有个非常显著的特性就是一定会往收敛方向收敛,因此LM算法能有效的改善高斯牛顿法的不稳定问题。该问题也可通过数学证明LM算法的系数矩阵是正定的,从而避免不稳定问题,可参考 关于Levenberg-Marquadt的一些求解和证明

参考

METHOD FOR NON-LINEAR LEAST SQUARES PROBLEMS
梯度下降法和高斯牛顿法的区别在哪里,各自的优缺点呢?
关于Levenberg-Marquadt的一些求解和证明
视觉slam十四讲

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值