Levenberg-Marquardt算法浅谈

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

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

牛顿法

如果有一点数值计算知识的同学对牛顿迭代法并不陌生,先贴个经典例图来镇楼。

图(1)

一般来说我们利用牛顿法来求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 Δ=xx0, 所以我们有
Δ = 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) Δ=xx0=f(x0)f(x0),x=x0f(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=xn1f(xn1)f(xn1), until  xnxn1<ϵ    (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)+(xx0)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)+(xx0)f(x0)=0    (7)
求 解 得 到 x , 相 比 于 x 0 , f ( x ) < f ( x 0 )         ( 8 ) 求解得到x,相比于x_0,f (x)<f(x0)    (8) xx0f(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=[x0fxnf]    (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=x022fx1x02fxnx02fx0x12fx122fxnx12f.........x0xn2fx1xn2fxn22f    (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=XnHf(xn)1f(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=0nf2(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=0nfixjfi    (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=0n(xjfixkfi+fixjxk2fi)    (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) Hjk2i=0nJijJik    (16)
其中 J i j 表 示 雅 可 比 矩 阵 的 i 行 j 列 J_{ij} 表示雅可比矩阵的i行j列 Jijij。需要注意的是,式(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=x0f0x0fnxnf0xnfn    (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) H2JfTJf    (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

  • 91
    点赞
  • 353
    收藏
    觉得还不错? 一键收藏
  • 24
    评论
LM算法,全称为Levenberg-Marquard算法,它可用于解决非线性最小二乘问题,多用于曲线拟合等场合。 LM算法的实现并不算难,它的关键是用模型函数 f 对待估参数向量 p 在其邻域内做线性近似,忽略掉二阶以上的导数项,从而转化为线性最小二乘问题,它具有收敛速度快等优点。LM算法属于一种“信赖域法”——所谓的信赖域法,此处稍微解释一下:在最优化算法中,都是要求一个函数的极小值,每一步迭代中,都要求目标函数值是下降的,而信赖域法,顾名思义,就是从初始点开始,先假设一个可以信赖的最大位移 s ,然后在以当前点为中心,以 s 为半径的区域内,通过寻找目标函数的一个近似函数(二次的)的最优点,来求解得到真正的位移。在得到了位移之后,再计算目标函数值,如果其使目标函数值的下降满足了一定条件,那么就说明这个位移是可靠的,则继续按此规则迭代计算下去;如果其不能使目标函数值的下降满足一定的条件,则应减小信赖域的范围,再重新求解。 事实上,你从所有可以找到的资料里看到的LM算法的说明,都可以找到类似于“如果目标函数值增大,则调整某系数再继续求解;如果目标函数值减小,则调整某系数再继续求解”的迭代过程,这种过程与上面所说的信赖域法是非常相似的,所以说LM算法是一种信赖域法。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值