参考博客
参考博客: https://blog.csdn.net/heshaofeng2ly/article/details/105812746#3GN_50
参考博客:LM算法流程
数学基础(泰勒展开)
泰勒展开公式:
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)在 x0处的 n阶泰勒展开.
1. 高斯牛顿法(GN法)
Gauss Newton 是最优化算法里面最简单的方法之一。它的思想是将f(x) 进行一阶的泰勒展开.
1.1 基本原理
待优化的目标函数: ∣∣f(x+Δx)∣∣2
将目标函数中f(x+Δx) 进行一阶泰勒展开可得:
f(x+Δx)≈f(x)+f′(x)Δx
取J(x)=f′(x),J(x)表示f(x)的一阶导数,是雅克比矩阵.
目的: 通过不断寻找下降矢量Δx, 使目标函数∣∣f(x+Δx)∣∣2达到最小值, 变为线性的最小二乘问题:
Δx∗=Δxargmin21∣∣f(x+Δx)∣∣2=Δxargmin21∣∣f(x)+J(x)Δx∣∣2将其展开:
21∣∣f(x)+J(x)Δx∣∣2=21[f(x)+J(x)Δx]T[f(x)+J(x)Δx]=21[∣f(x)∣∣2+fT(x)J(x)Δx+ΔxTJT(x)f(x)+ΔxTJT(x)J(x)Δx]这里需要注意的是ΔxTJT(x)f(x)=(fT(x)J(x)Δx)T 而转置不改变值的大小, 两者可以合并, 得到:
21∣∣f(x)+J(x)Δx∣∣2=21[∣f(x)∣∣2+2fT(x)J(x)Δx+ΔxTJT(x)J(x)Δx]求上式关于 ∆x 的导数,并令其为零:
2JT(x)f(x)+2JT(x)J(x)Δx=0
这里需要注意的是:
Y=A∗X,dXdY=AT
Y=X∗A,dXdY=A
dXdXT=I
可以得到如下方程组:
JT(x)J(x)Δx=−JT(x)f(x)注意,我们要求解的变量是 ∆x,因此这是一个线性方程组,我们称它为增量方程,也可以称为高斯牛顿方程或者正规方程.
其中J(x)=f′(x)表示f(x)的一阶导数,是雅克比矩阵.f(x)为x处的值
1.2 GN迭代算法步骤
- 给定初始值x0, 即取x=x0.
- 对于第k次迭代,期初一阶导数雅克比矩阵J(xk)=f′(xk), 以及目标函数(误差)f(xk).
- 求解增量方程: JT(xk)J(xk)Δxk=−JT(xk)f(xk), 将(2)的值带入方程,求出Δxk.
- 若Δxk足够小,停止迭代. 否则令xk+1=xk+Δxk, 返回(2), 继续迭代计算.
1.3 优缺点
-
优点: 高斯牛顿(Gauss-Newton)法是对牛顿法的一种改进,它用雅克比矩阵的乘积近似代替牛顿法中的二阶Hessian 矩阵,从而省略了求二阶Hessian 矩阵的计算,计算量降低.
-
缺点1: 在高斯牛顿法中,用来近似Hessian矩阵的JTJ可能是奇异矩阵(不可逆)或者病态的,此时会导致方程无解,稳定性很差,算法不收敛.
-
缺点2: 由于采用二阶泰勒展开来进行的推导,而泰勒展开只是在一个较小的范围内的近似,因此如果高斯牛顿法计算得到的步长较大的话,上述的近似将不再准确,也会导致算法不收敛.
2. 列文伯格-马夸特法(LM法)
Levenberg-Marquardt (LM)在一定程度上修正了高斯牛顿法的缺点,因此它比高斯牛顿法更加鲁棒,不过是以牺牲一定的收敛速度为代价–它的收敛速度比高斯牛顿法慢. 也被称为阻尼牛顿法.
2.1 基本原理
LM法加入一个正定对角阵uI, 一定程度上修正了GN的缺点.
LM算法增量方程:
(JT(x)J(x)+uI)Δx=−JT(x)f(x)其中u≥0,u表示信赖域半径.
- 当u=0时,LM退化为高斯牛顿法(GN)
- 当u很大时,LM退化为一阶梯度下降法
LM法会在每一次迭代计算因子ρ来判断泰勒近似是否良好,并根据因子ρ,动态扩大或缩小信赖域半径u.
ρ=J(x)Δxf(x+Δx)−f(x)
- 若因子ρ接近于1, 则认为泰勒近似比较准确, 可以扩大信赖域半径u
- 若因子ρ远小于1, 则认为泰勒近似结果较差, 可以缩小信赖域半径u
2.2 LM迭代算法步骤
-
给定初始值x0, 设置u初始值u0
A0=JT(x0)J(x0)u0=τimax(aii0)其中τ需要自己设定, aii为A0的对角线元素.
-
第k次迭代,根据前面的公式求出步长Δxk, 并计算此时的ρk.
-
根据ρk的取值来调整信赖域半径:
- (1) 若ρk≤0.25,说明步子过大, 泰勒近似较差,应缩小信赖域半径, 取uk+1=21uk
- (2) 若ρk≥0.75,说明步子较小, 泰勒近似准确,应扩大信赖域半径, 取uk+1=2uk
- (3) 若0.25<ρk<0.75,说明 泰勒近似介于两者之间,应保持此时的信赖域半径, 取uk+1=uk
-
若Δxk足够小, 则停止迭代, 否则根据ρk大小判断xk+1应该如何更新. 计算出xk+1后返回(2), 继续进行迭代:
- (1) 若ρk≤0,说明误差向着上升而非下降的趋势变化了(与最优化的目标相反),这说明这一步迈得错得“离谱”了,这时不应该走到下一点,而应“原地踏步”,即取xk+1=xk
- (2) 若ρk≥0,说明可以向下一步走, 取xk+1=xk+Δxk
2.3 优缺点
- 优点: 在一定程度上修正了高斯牛顿算法不收敛的缺点,同时具备高斯牛顿法和一阶梯度算法的特点, 因此它比高斯牛顿法更加鲁棒.
- 缺点: 由于需要不断计算更新收敛域半径u,不断变化梯度下降步长,会导致收敛速度较慢.
3. 手抄版