前言
最优化方法应用广泛,但在实现原理上大同小异。作者在学习高翔博士的视觉SLAM十四讲的过程中对其第六章非线性最小二乘求解所涉及到的最优化方法(最速下降、牛顿法、高斯牛顿法、LM算法)进行了简要总结如下:
最速下降法(梯度下降/一阶导数法)
作者在最速下降法解析(理解笔记)中曾经介绍过最速下降法的实现过程,并列举了一个小例子。在这里,为了文章整体的完整性,我们再重新叙述一下,大家也可以参考。
假设我们希望求解一个最小二乘问题:
min
x
=
1
2
∥
f
(
x
)
∥
2
2
\min_{x} = \frac{1}{2}\begin{Vmatrix}f(x)\end{Vmatrix}^2_2
xmin=21
f(x)
22
把上式在
x
x
x处进行泰勒展开:
∥
f
(
x
+
Δ
x
)
∥
2
2
=
∥
f
(
x
)
∥
2
2
+
J
(
x
)
Δ
x
+
1
2
Δ
x
T
H
(
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)分别为关于变量
x
x
x的雅克比矩阵(一阶导数)和海塞矩阵(二阶导数)。
在梯度下降法中,我们只考虑在
x
x
x处的一阶梯度。则上式变为:
∥
f
(
x
+
Δ
x
)
∥
2
2
=
∥
f
(
x
)
∥
2
2
+
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^*
λ∗。
建议读者去最速下降法解析(理解笔记)看一下实际使用过程中的例子。
牛顿法(二阶导数法)
这里我们保留在
x
x
x处的二阶展开项:
∥
f
(
x
+
Δ
x
)
∥
2
2
=
∥
f
(
x
)
∥
2
2
+
J
(
x
)
Δ
x
+
1
2
Δ
x
T
H
(
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
∗
=
a
r
c
m
i
n
(
∥
f
(
x
)
∥
2
2
+
J
(
x
)
Δ
x
+
1
2
Δ
x
T
H
(
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
)
Δ
x
J(x)+ H(x)\Delta x
J(x)+H(x)Δx
令其导数为0:
J
(
x
)
+
H
(
x
)
Δ
x
=
0
J(x)+ H(x)\Delta x=0
J(x)+H(x)Δx=0
则取得极小值,解出增量为:
Δ
x
=
−
H
(
x
)
−
1
J
(
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
)
2
f(x)^2
f(x)2),展开形式如下:
f
(
x
+
Δ
x
)
≈
f
(
x
)
+
J
(
x
)
Δ
x
f(x+\Delta x)\approx f(x)+J(x)\Delta x
f(x+Δx)≈f(x)+J(x)Δx
这里的J(x)也是雅克比矩阵,与前述不同的是这里是
f
(
x
)
f(x)
f(x)对变量
x
x
x的导数。
由此,当前我们的目标变成了:寻找一个增量
Δ
x
\Delta x
Δx,使得
∥
f
(
x
+
Δ
x
)
∥
2
2
\begin{Vmatrix}f(x+\Delta x)\end{Vmatrix}^2_2
f(x+Δx)
22的值达到最小。即求解下述关系:
Δ
x
∗
=
a
r
g
min
Δ
x
(
1
2
∥
f
(
x
)
+
J
(
x
)
Δ
x
∥
2
2
)
\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)
展开上式:
1
2
∥
f
(
x
)
+
J
(
x
)
Δ
x
∥
2
2
=
1
2
(
f
(
x
)
+
J
(
x
)
Δ
x
)
T
(
f
(
x
)
+
J
(
x
)
Δ
x
)
=
1
2
(
∥
f
(
x
)
∥
2
2
+
2
f
(
x
)
T
J
(
x
)
Δ
x
+
Δ
x
T
J
(
x
)
T
J
(
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
)
T
f
(
x
)
+
J
(
x
)
T
J
(
x
)
Δ
x
=
0
J(x)^Tf(x)+J(x)^{T}J(x)\Delta x=0
J(x)Tf(x)+J(x)TJ(x)Δx=0
即:
J
(
x
)
T
J
(
x
)
Δ
x
=
−
J
(
x
)
T
f
(
x
)
J(x)^{T}J(x)\Delta x=-J(x)^Tf(x)
J(x)TJ(x)Δx=−J(x)Tf(x)
上式是一个线性方程组,被称为增量方程,也可以称为高斯牛顿方程或者正规方程。把左边的系数即为
H
H
H,右侧记为
g
g
g,则上式转换为:
H
Δ
x
=
g
Δ
x
=
H
−
1
g
H\Delta x=g \\ \Delta x=H^{-1}g
HΔx=gΔx=H−1g
这里的
H
H
H即为牛顿法里海塞矩阵的近似,省略了计算二阶导数的过程。
上述过程中我们使用了 J ( x ) T J ( x ) J(x)^{T}J(x) J(x)TJ(x)的逆,但是 J ( x ) T J ( 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
Δ
x
k
=
1
2
∥
f
(
x
k
)
+
J
(
x
k
)
Δ
x
k
∥
2
2
+
λ
2
∥
D
Δ
x
∥
2
2
\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
Δxkmin=21
f(xk)+J(xk)Δxk
22+2λ
DΔx
22
使用类似于高斯牛顿法中的过程,对上式进行求导,然后使其导数为0,得到的增量方程为:
(
H
+
λ
D
T
D
)
Δ
x
=
g
(H+\lambda D^TD)\Delta x=g
(H+λDTD)Δx=g
与高斯牛顿法相比,我们可以发现多出来一项
λ
D
T
D
\lambda D^TD
λDTD,简化记
D
=
I
D=I
D=I则上式变为:
(
H
+
λ
I
)
Δ
x
=
g
(H+\lambda I)\Delta x=g
(H+λI)Δx=g
可以由上式观察到,当参数
λ
\lambda
λ的值比较大时,则LM算法接近为最速下降法,而
λ
\lambda
λ的值较小时则近似于高斯牛顿法。