前言
这篇文章是为了解释下面几个问题:
- Levenberg-Marquardt算法、Dog-Leg算法详细实现流程?
- Gauss-Newton算法为什么优于最速下降算法?
- 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+1∥≤∥aek∥∥ek+1∥≤O(∥ek∥2)∥ek+1∥/∥ek∥→0当∥ek∥比较小,并且0<a<1当∥ek∥比较小当k→∞
Levenberg-Marquardt算法流程
上面伪码中需要说明的有:
- 最小二乘问题形式如下:
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=1∑m(fi(x))2=21∥f(x)∥2=21f(x)Tf(x)(0) -
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)。 - 增益系数理解:
在"计算增益系数"公式中可以看出分子是 F ( x ) \mathbf{F(x)} F(x) 实际变化,而分母是其近似 L ( h ) \mathbf{L(h)} L(h) 的变化,因此该分数值主要是衡量了近似的好坏,分数值越大说明近似得越好,反之则近似得越差。 - 阻尼系数理解:
从更新阻尼系数 μ \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) 时,此混合算法越偏向于利用高斯牛顿法来计算增量,反之则更偏向于利用最速下降法来计算增量。 - 迭代停止条件
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算法流程
上面伪码中需要说明的有:
- 计算最速下降法方向
先计算相对增益:
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) α∣∣hsd∣∣F(x)−F(x+αhsd)=−∣∣hsd∣∣1hsdTF′(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) - 计算最速下降法步长
一阶泰勒展开:
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)≃21∥f(x)+αJ(x)hsd∥2=F(x)+αhsdTJ(x)Tf(x)+21α2∥J(x)hsd∥2
再令 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)hsd∥2hsdT∗J(x)Tf(x)=∥J(x)g∥2∥g∥2 - 计算狗腿法增量
- 增益系数、迭代终止条件等与LM算法一样
回答问题
- 上面的LM算法和DL算法的伪码流程已经非常清晰了,并对里面的计算部分进行了详细的推导计算说明
- 从上面表格对比来看,主要是高斯牛顿法收敛速度更快
- 高斯牛顿法的近似Hessian矩阵是半正定的,必然会存在计算不稳定不收敛的情况,但LM算法混合了最速下降法在里面,最速下降法有个非常显著的特性就是一定会往收敛方向收敛,因此LM算法能有效的改善高斯牛顿法的不稳定问题。该问题也可通过数学证明LM算法的系数矩阵是正定的,从而避免不稳定问题,可参考 关于Levenberg-Marquadt的一些求解和证明。
参考
METHOD FOR NON-LINEAR LEAST SQUARES PROBLEMS
梯度下降法和高斯牛顿法的区别在哪里,各自的优缺点呢?
关于Levenberg-Marquadt的一些求解和证明
视觉slam十四讲