参考博客: https://blog.csdn.net/heshaofeng2ly/article/details/105812746#3GN_50
参考博客:LM算法流程
泰勒展开公式:
f ( x ) = f ( x 0 ) 0 ! + f ′ ( x 0 ) 1 ! ( x − x 0 ) + f ′ ′ ( x 0 ) 2 ! ( x − x 0 ) 2 + . . . . . . + f ( n ) ( x 0 ) n ! ( x − x 0 ) n f(x)=\frac{f(x_{0})}{0!}+ \frac{f^{'}(x_{0})}{1!}(x-x_{0})+\frac{f^{''}(x_{0})}{2!}(x-x_{0})^{2}+......+\frac{f^{(n)}(x_{0})}{n!}(x-x_{0})^{n} f(x)=0!f(x0)+1!f′(x0)(x−x0)+2!f′′(x0)(x−x0)2+......+n!f(n)(x0)(x−x0)n
该式表示 f ( x ) f(x) f(x)在 x 0 x_{0} x0处的 n n n阶泰勒展开.
Gauss Newton 是最优化算法里面最简单的方法之一。它的思想是将 f ( x ) f(x) f(x) 进行一阶的泰勒展开.
待优化的目标函数: ∣ ∣ f ( x + Δ x ) ∣ ∣ 2 ||f(x+\Delta{x})||^{2} ∣∣f(x+Δx)∣∣2
将目标函数中 f ( x + Δ x ) f(x+\Delta{x}) f(x+Δx) 进行一阶泰勒展开可得:
f ( x + Δ x ) ≈ f ( x ) + f ′ ( x ) Δ x f(x+\Delta{x})\approx{f(x)+f^{'}(x)\Delta{x}} f(x+Δx)≈f(x)+f′(x)Δx
取 J ( x ) = f ′ ( x ) , J ( x ) J(x)=f^{'}(x), J(x) J(x)=f′(x),J(x)表示 f ( x ) f(x) f(x)的一阶导数,是雅克比矩阵.
目的: 通过不断寻找下降矢量 Δ x \Delta{x} Δx, 使目标函数 ∣ ∣ f ( x + Δ x ) ∣ ∣ 2 ||f(x+\Delta{x})||^{2} ∣∣f(x+Δx)∣∣2达到最小值, 变为线性的最小二乘问题:
Δ x ∗ = arg min Δ x 1 2 ∣ ∣ f ( x + Δ x ) ∣ ∣ 2 = arg min Δ x 1 2 ∣ ∣ f ( x ) + J ( x ) Δ x ∣ ∣ 2 \Delta{x}^{*}=\argmin_{\Delta{x}}\frac{1}{2}||f(x+\Delta{x})||^{2}=\argmin_{\Delta{x}}\frac{1}{2}||f(x)+J(x)\Delta{x}||^{2} Δx∗=Δxargmin21∣∣f(x+Δx)∣∣2=Δxargmin21∣∣f(x)+J(x)Δx∣∣2将其展开:
1 2 ∣ ∣ f ( x ) + J ( x ) Δ x ∣ ∣ 2 = 1 2 [ f ( x ) + J ( x ) Δ x ] T [ f ( x ) + J ( x ) Δ x ] \frac{1}{2}||f(x)+J(x)\Delta{x}||^{2}=\frac{1}{2}[f(x)+J(x)\Delta{x}]^{T}[f(x)+J(x)\Delta{x}] 21∣∣f(x)+J(x)Δx∣∣2=21[f(x)+J(x)Δx]T[f(x)+J(x)Δx] = 1 2 [ ∣ f ( x ) ∣ ∣ 2 + f T ( x ) J ( x ) Δ x + Δ x T J T ( x ) f ( x ) + Δ x T J T ( x ) J ( x ) Δ x ] =\frac{1}{2}[ |f(x)||^{2}+f^{T}(x)J(x)\Delta{x}+\Delta{x}^{T}J^{T}(x)f(x)+\Delta{x}^{T}J^{T}(x)J(x)\Delta{x} ] =21[∣f(x)∣∣2+fT(x)J(x)Δx+ΔxTJT(x)f(x)+ΔxTJT(x)J(x)Δx]这里需要注意的是 Δ x T J T ( x ) f ( x ) = ( f T ( x ) J ( x ) Δ x ) T \Delta{x}^{T}J^{T}(x)f(x)=(f^{T}(x)J(x)\Delta{x})^{T} ΔxTJT(x)f(x)=(fT(x)J(x)Δx)T 而转置不改变值的大小, 两者可以合并, 得到:
1 2 ∣ ∣ f ( x ) + J ( x ) Δ x ∣ ∣ 2 = 1 2 [ ∣ f ( x ) ∣ ∣ 2 + 2 f T ( x ) J ( x ) Δ x + Δ x T J T ( x ) J ( x ) Δ x ] \frac{1}{2}||f(x)+J(x)\Delta{x}||^{2}=\frac{1}{2}[ |f(x)||^{2}+2f^{T}(x)J(x)\Delta{x}+\Delta{x}^{T}J^{T}(x)J(x)\Delta{x} ] 21∣∣f(x)+J(x)Δx∣∣2=21[∣f(x)∣∣2+2fT(x)J(x)Δx+ΔxTJT(x)J(x)Δx]求上式关于 ∆x 的导数,并令其为零:
2 J T ( x ) f ( x ) + 2 J T ( x ) J ( x ) Δ x = 0 2J^{T}(x)f(x)+2J^{T}(x)J(x)\Delta{x}=0 2JT(x)f(x)+2JT(x)J(x)Δx=0
这里需要注意的是:
Y = A ∗ X , d Y d X = A T Y=A*X, \frac{dY}{dX}=A^{T} Y=A∗X,dXdY=AT
Y = X ∗ A , d Y d X = A Y=X*A, \frac{dY}{dX}=A Y=X∗A,dXdY=A
d X T d X = I \frac{dX^{T}}{dX}=I dXdXT=I
可以得到如下方程组:
J T ( x ) J ( x ) Δ x = − J T ( x ) f ( x ) J^{T}(x)J(x)\Delta{x}=-J^{T}(x)f(x) JT(x)J(x)Δx=−JT(x)f(x)注意,我们要求解的变量是 ∆x,因此这是一个线性方程组,我们称它为增量方程,也可以称为高斯牛顿方程或者正规方程.
其中 J ( x ) = f ′ ( x ) J(x)=f^{'}(x) J(x)=f′(x)表示 f ( x ) f(x) f(x)的一阶导数,是雅克比矩阵. f ( x ) f(x) f(x)为x处的值
优点: 高斯牛顿(Gauss-Newton)法是对牛顿法的一种改进,它用雅克比矩阵的乘积近似代替牛顿法中的二阶Hessian 矩阵,从而省略了求二阶Hessian 矩阵的计算,计算量降低.
缺点1: 在高斯牛顿法中,用来近似Hessian矩阵的 J T J J^{T}J JTJ可能是奇异矩阵(不可逆)或者病态的,此时会导致方程无解,稳定性很差,算法不收敛.
缺点2: 由于采用二阶泰勒展开来进行的推导,而泰勒展开只是在一个较小的范围内的近似,因此如果高斯牛顿法计算得到的步长较大的话,上述的近似将不再准确,也会导致算法不收敛.
Levenberg-Marquardt (LM)在一定程度上修正了高斯牛顿法的缺点,因此它比高斯牛顿法更加鲁棒,不过是以牺牲一定的收敛速度为代价–它的收敛速度比高斯牛顿法慢. 也被称为阻尼牛顿法.
LM法加入一个正定对角阵 u I uI uI, 一定程度上修正了GN的缺点.
LM算法增量方程:
( J T ( x ) J ( x ) + u I ) Δ x = − J T ( x ) f ( x ) (J^{T}(x)J(x)+uI)\Delta{x}=-J^{T}(x)f(x) (JT(x)J(x)+uI)Δx=−JT(x)f(x)其中 u ≥ 0 , u u\geq{0}, u u≥0,u表示信赖域半径.
LM法会在每一次迭代计算因子 ρ \rho ρ来判断泰勒近似是否良好,并根据因子 ρ \rho ρ,动态扩大或缩小信赖域半径 u u u.
ρ = 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)
给定初始值 x 0 x_{0} x0, 设置 u u u初始值 u 0 u_{0} u0
A 0 = J T ( x 0 ) J ( x 0 ) A_{0}=J^{T}(x_{0})J(x_{0}) A0=JT(x0)J(x0) u 0 = τ max i ( a i i 0 ) u_{0}=\tau \max_{i}(a_{ii}^{0}) u0=τimax(aii0)其中 τ \tau τ需要自己设定, a i i a_{ii} aii为 A 0 A_{0} A0的对角线元素.
第k次迭代,根据前面的公式求出步长 Δ x k \Delta x_{k} Δxk, 并计算此时的 ρ k \rho_{k} ρk.
根据 ρ k \rho_{k} ρk的取值来调整信赖域半径:
若 Δ x k \Delta x_{k} Δxk足够小, 则停止迭代, 否则根据 ρ k \rho_{k} ρk大小判断 x k + 1 x_{k+1} xk+1应该如何更新. 计算出 x k + 1 x_{k+1} xk+1后返回(2), 继续进行迭代: