Levenberg-Marquardt算法浅谈

码字不易,转发请注明原文链接

在讲Levenberg-Marquardt算法之前我想先谈下牛顿法和高斯牛顿法。

牛顿法


如果有一点数值计算知识的同学对牛顿迭代法并不陌生,先贴个经典例图来镇楼。
这里写图片描述
一般来说我们利用牛顿法使用来求f(x)=0的解。求解方法如下:
先对f(x)一阶泰勒展开得
f ( x + Δ ) = f ( x ) + f ( x ) Δ = 0

所以我们有
Δ = x x 0 = f ( x 0 ) f ( x 0 ) , x = x 0 f ( x 0 ) f ( x 0 )

因此也就得到了我们的牛顿迭代公式:
x n = x n 1 f ( x n 1 ) f ( x n 1 )

求解最优化问题
m i n   f ( x )

牛顿法首先则是将问题转化为求
f ( x ) = 0
这个方程的根。
一阶展开:
f ( x ) f ( x 0 ) + ( x x 0 ) f ( x 0 )

f ( x 0 ) + ( x x 0 ) f ( x 0 ) = 0

x x 0 f ( x ) < f ( x 0 )

高斯牛顿法


在讲牛顿法的时候,我们举的例子x是一维的,若如果我们遇到多维的x该如何办呢?这时我们就可以利用雅克比,海赛矩阵之类的来表示高维求导函数了。
比如
f ( X ) = 0 , X = [ x 0 , x 1 , . . . , x n ]

所以我们有雅克比矩阵:
J f = [ f x 0 f x n f x 0 f x n ]

有海赛矩阵:
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 ]

所以高维牛顿法解最优化问题又可写成:

X n + 1 = X n H f ( x n ) 1 f ( x n )

梯度 代替了低维情况中的一阶导
Hessian矩阵代替了二阶导
求逆代替了除法
例:不妨设目标函数为:
s ( x ) = i = 0 n f 2 ( x i )

所以梯度向量在方向上的分量:
g j = 2 i = 0 n f i f i x j         ( 1 )

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 )

高斯牛顿法的一个小技巧是,将二次偏导省略,于是:
H j k i = 0 n J i j J i k             ( 2 )

其中 J i j 为雅克比矩阵中的第i行j列元素
将(1)(2)改写成 矩阵相乘形式:
g = 2 J f T f

H 2 J f T J f

代入牛顿法高维迭代方程的基本形式,得到高斯牛顿法迭代方程:
x s + 1 = x s + Δ , Δ = ( J f T J f ) 1 J f T f

Levenberg-Marquardt算法


引用维基百科的一句话就是:

莱文贝格-马夸特方法(Levenberg–Marquardt algorithm)能提供数非线性最小化(局部最小)的数值解。此算法能借由执行时修改参数达到结合高斯-牛顿算法以及梯度下降法的优点,并对两者之不足作改善(比如高斯-牛顿算法之反矩阵不存在或是初始值离局部极小值太远)

在我看来,就是在高斯牛顿基础上修改了一点。
在高斯牛顿迭代法中,我们已经知道

Δ = ( J f T J f ) 1 J f T f

在莱文贝格-马夸特方法算法中则是
Δ = ( J f T J f + λ I ) 1 J f T f

在我看来好像就这点区别。至少我看的 维基百科是这样的。
然后Levenberg-Marquardt方法的好处就是在于可以调节:
如果下降太快,使用较小的λ,使之更接近高斯牛顿法
如果下降太慢,使用较大的λ,使之更接近梯度下降法

在此我也把算法原论文贴出来吧:Levenberg-Marquardt算法

猜你喜欢

转载自blog.csdn.net/liu14lang/article/details/53991897