码字不易,转发请注明原文链接
在讲Levenberg-Marquardt算法之前我想先谈下牛顿法和高斯牛顿法。
牛顿法
如果有一点数值计算知识的同学对牛顿迭代法并不陌生,先贴个经典例图来镇楼。
一般来说我们利用牛顿法来求f(x)=0的解。求解方法如下:
先对f(x)一阶泰勒展开:
f
(
x
0
+
Δ
)
=
f
(
x
0
)
+
f
′
(
x
0
)
Δ
=
0
(
1
)
f(x_0+\Delta)=f(x_0)+f'(x_0)\Delta=0 (1)
f(x0+Δ)=f(x0)+f′(x0)Δ=0 (1)
其中
Δ
=
x
−
x
0
\Delta=x-x_0
Δ=x−x0, 所以我们有
Δ
=
x
−
x
0
=
−
f
(
x
0
)
f
′
(
x
0
)
,
即
x
=
x
0
−
f
(
x
0
)
f
′
(
x
0
)
(
2
)
\Delta=x-x_0=-\frac{f(x_0)}{f'(x_0)},即x=x_0-\frac{f(x_0)}{f'(x_0)} (2)
Δ=x−x0=−f′(x0)f(x0),即x=x0−f′(x0)f(x0) (2)
由式(2)可知,当
Δ
\Delta
Δ 非常小时,我们可将
f
(
x
)
=
0
f(x)=0
f(x)=0 的解析解近似于
x
0
x_0
x0。但是由上图可知
x
0
x_0
x0 是任意的初始值,所以可能会导致初始
Δ
\Delta
Δ 非常大,因此可采用牛顿迭代公式逐步逼近解析解:
x
n
=
x
n
−
1
−
f
(
x
n
−
1
)
f
′
(
x
n
−
1
)
,
u
n
t
i
l
∣
x
n
−
x
n
−
1
∣
<
ϵ
(
3
)
x_n=x_{n-1}-\frac{f(x_{n-1})}{f'(x_{n-1})} ,\ until\ \ |x_n-x_{n-1}|< \epsilon (3)
xn=xn−1−f′(xn−1)f(xn−1), until ∣xn−xn−1∣<ϵ (3)
接下来求解最优化问题
m
i
n
f
(
x
)
(
4
)
min f(x) (4)
min f(x) (4)
牛顿法首先则是将问题转化为求
f
′
(
x
)
=
0
(
5
)
f'(x) = 0 (5)
f′(x)=0 (5)这个方程的根。
一阶展开:
f
′
(
x
)
≈
f
′
(
x
0
)
+
(
x
-
x
0
)
f
′
′
(
x
0
)
(
6
)
f '(x) ≈ f '(x_0)+(x-x_0)f ''(x0) (6)
f′(x)≈f′(x0)+(x-x0)f′′(x0) (6)
令
f
′
(
x
0
)
+
(
x
-
x
0
)
f
′
′
(
x
0
)
=
0
(
7
)
f'(x_0)+(x-x_0)f ''(x_0) = 0 (7)
f′(x0)+(x-x0)f′′(x0)=0 (7)
求
解
得
到
x
,
相
比
于
x
0
,
f
(
x
)
<
f
(
x
0
)
(
8
)
求解得到x,相比于x_0,f (x)<f(x0) (8)
求解得到x,相比于x0,f(x)<f(x0) (8)
高斯牛顿法
在讲牛顿法的时候,我们举的例子x是一维的,若如果我们遇到多维的x该如何办呢?这时我们就可以利用雅克比,海赛矩阵之类的来表示高维求导函数了。
比如
f
(
X
)
=
0
,
其
中
X
=
[
x
0
,
x
1
,
.
.
.
,
x
n
]
(
9
)
f(X)=0,其中X=[x_0,x_1,...,x_n] (9)
f(X)=0,其中X=[x0,x1,...,xn] (9)
所以我们有雅克比矩阵(表示一阶偏导):
J
f
=
[
∂
f
∂
x
0
⋯
∂
f
∂
x
n
]
(
10
)
J_f=\begin{bmatrix} \frac{\partial f}{\partial x_0}&\cdots&\frac{\partial f}{\partial x_n} \end{bmatrix} (10)
Jf=[∂x0∂f⋯∂xn∂f] (10)
有海赛矩阵(表示二阶偏导):
H
f
=
[
∂
2
f
∂
x
0
2
∂
2
f
∂
x
0
∂
x
1
.
.
.
∂
2
f
∂
x
0
∂
x
n
∂
2
f
∂
x
1
∂
x
0
∂
2
f
∂
x
1
2
.
.
.
∂
2
f
∂
x
1
∂
x
n
⋮
⋮
⋱
⋮
∂
2
f
∂
x
n
∂
x
0
∂
2
f
∂
x
n
∂
x
1
.
.
.
∂
2
f
∂
x
n
2
]
(
11
)
H_f=\begin{bmatrix}\frac{\partial^2f}{\partial x_0^2}&\frac{\partial^2f}{\partial x_0 \partial x_1}&...&\frac{\partial^2f}{\partial x_0 \partial x_n}\\ \frac{\partial^2f}{\partial x_1 \partial x_0}&\frac{\partial^2f}{\partial x_1^2}&...&\frac{\partial^2f}{\partial x_1 \partial x_n}\\\vdots&\vdots&\ddots&\vdots\\ \frac{\partial^2f}{\partial x_n \partial x_0}&\frac{\partial^2f}{\partial x_n \partial x_1}&...&\frac{\partial^2f}{\partial x_n^2} \end{bmatrix} (11)
Hf=⎣⎢⎢⎢⎢⎢⎡∂x02∂2f∂x1∂x0∂2f⋮∂xn∂x0∂2f∂x0∂x1∂2f∂x12∂2f⋮∂xn∂x1∂2f......⋱...∂x0∂xn∂2f∂x1∂xn∂2f⋮∂xn2∂2f⎦⎥⎥⎥⎥⎥⎤ (11)
由式(3)和式(7)可知,高维牛顿法解最优化问题又可写成:
X
n
+
1
=
X
n
−
H
f
(
x
n
)
−
1
∇
f
(
x
n
)
(
12
)
X_{n+1}=X_n-H_f(x_n)^{-1}\nabla f(x_n) (12)
Xn+1=Xn−Hf(xn)−1∇f(xn) (12)
注:
- 雅可比矩阵代替了低维情况中的一阶导
- Hessian矩阵代替了二阶导
- 求逆代替了除法
例:不妨设目标函数为:
s
(
x
)
=
∑
i
=
0
n
f
2
(
x
i
)
(
13
)
s(x)=\sum_{i=0}^nf^2(x_i) (13)
s(x)=i=0∑nf2(xi) (13)
所以梯度向量在方向上的分量:
g
j
=
2
∑
i
=
0
n
f
i
∂
f
i
∂
x
j
(
14
)
g_j=2\sum_{i=0}^nf_i\frac{\partial f_i}{\partial x_j} (14)
gj=2i=0∑nfi∂xj∂fi (14)
Hessian 矩阵的元素则直接在梯度向量的基础上求导:
H
j
k
=
2
∑
i
=
0
n
(
∂
f
i
∂
x
j
∂
f
i
∂
x
k
+
f
i
∂
2
f
i
∂
x
j
∂
x
k
)
(
15
)
H_{jk}=2\sum_{i=0}^n (\frac{\partial f_i}{\partial x_j}\frac{\partial f_i}{\partial x_k}+ f_i\frac{\partial^2 f_i}{\partial x_j\partial x_k}) (15)
Hjk=2i=0∑n(∂xj∂fi∂xk∂fi+fi∂xj∂xk∂2fi) (15)
高斯牛顿法的一个小技巧是,将二次偏导省略,于是:
H
j
k
≈
2
∑
i
=
0
n
J
i
j
J
i
k
(
16
)
H_jk\approx2\sum_{i=0}^nJ_{ij}J_{ik} (16)
Hjk≈2i=0∑nJijJik (16)
其中
J
i
j
表
示
雅
可
比
矩
阵
的
i
行
j
列
J_{ij} 表示雅可比矩阵的i行j列
Jij表示雅可比矩阵的i行j列。需要注意的是,式(10) 的雅可比矩阵只有一行是因为它只有一个多维函数
f
(
x
0
,
x
1
,
.
.
.
,
x
n
)
f(x_0,x_1,...,x_n)
f(x0,x1,...,xn)。而在式(15)中他有
n
+
1
n+1
n+1 个多维函数:
f
0
(
x
0
,
x
1
,
.
.
.
,
x
n
)
,
f
1
(
x
0
,
x
1
,
.
.
.
,
x
n
)
,
.
.
.
,
f
n
(
x
0
,
x
1
,
.
.
.
,
x
n
)
f_0(x_0,x_1,...,x_n),f_1(x_0,x_1,...,x_n),...,f_n(x_0,x_1,...,x_n)
f0(x0,x1,...,xn),f1(x0,x1,...,xn),...,fn(x0,x1,...,xn). 所以它的雅可比矩阵为:
J f = [ ∂ f 0 ∂ x 0 ⋯ ∂ f 0 ∂ x n ⋮ ⋱ ⋮ ∂ f n ∂ x 0 ⋯ ∂ f n ∂ x n ] ( 17 ) J_f=\begin{bmatrix} \frac{\partial f_0}{\partial x_0}&\cdots&\frac{\partial f_0}{\partial x_n}\\ \vdots&\ddots&\vdots\\ \frac{\partial f_n}{\partial x_0}&\cdots&\frac{\partial f_n}{\partial x_n} \end{bmatrix} (17) Jf=⎣⎢⎡∂x0∂f0⋮∂x0∂fn⋯⋱⋯∂xn∂f0⋮∂xn∂fn⎦⎥⎤ (17)
将(14)(16)改写成 矩阵相乘形式:
g
=
2
J
f
T
f
(
18
)
g=2J_f^Tf (18)
g=2JfTf (18)
H
≈
2
J
f
T
J
f
(
19
)
H\approx2J_f^TJ_f (19)
H≈2JfTJf (19)
代入牛顿法高维迭代方程的基本形式,得到高斯牛顿法迭代方程:
x
s
+
1
=
x
s
+
Δ
,
其
中
Δ
=
−
(
J
f
T
J
f
)
−
1
J
f
T
f
(
20
)
x^{s+1}=x^s+\Delta,其中\Delta=-(J_f^TJ_f)^{-1}J_f^Tf (20)
xs+1=xs+Δ,其中Δ=−(JfTJf)−1JfTf (20)
Levenberg-Marquardt算法
引用维基百科的一句话就是:
莱文贝格-马夸特方法(Levenberg–Marquardt algorithm)能提供数非线性最小化(局部最小)的数值解。此算法能借由执行时修改参数达到结合高斯-牛顿算法以及梯度下降法的优点,并对两者之不足作改善(比如高斯-牛顿算法之反矩阵不存在或是初始值离局部极小值太远)
在我看来,就是在高斯牛顿基础上修改了一点。
在高斯牛顿迭代法中,我们已经知道
Δ
=
−
(
J
f
T
J
f
)
−
1
J
f
T
f
(
21
)
\Delta=-(J_f^TJ_f)^{-1}J_f^Tf (21)
Δ=−(JfTJf)−1JfTf (21)
在莱文贝格-马夸特方法算法中则是
Δ
=
−
(
J
f
T
J
f
+
λ
I
)
−
1
J
f
T
f
(
22
)
\Delta=-(J_f^TJ_f+\lambda I)^{-1}J_f^Tf (22)
Δ=−(JfTJf+λI)−1JfTf (22)
在我看来好像就这点区别。至少我看的[维基百科][1]是这样的。
然后Levenberg-Marquardt方法的好处就是在于可以调节:
如果下降太快,使用较小的λ,使之更接近高斯牛顿法
如果下降太慢,使用较大的λ,使之更接近梯度下降法
在此我也把算法原论文贴出来吧:[Levenberg-Marquardt算法][2]
[1]:https://zh.wikipedia.org/wiki/%E8%8E%B1%E6%96%87%E8%B4%9D%E6%A0%BC%EF%BC%8D%E9%A9%AC%E5%A4%B8%E7%89%B9%E6%96%B9%E6%B3%95
[2]: http://www2.imm.dtu.dk/pubdb/views/edoc_download.php/3215/pdf/imm3215.pdf