目录
VSLAM学习(一) 三维运动、相机模型、SLAM模型
VSLAM学习(二) 非线性优化
VSLAM学习(三) 单目相机位姿估计
VSLAM学习(四) Bundle Adjustment
最小二乘是一种求参数优化损失的方法,不了解的可以去看我的另一篇博文:【线性回归与最小二乘】
例如,
多维高斯分布概率密度: x ∼ N ( μ , Σ ) \boldsymbol x\sim N(\boldsymbol \mu,\bold \Sigma) x∼N(μ,Σ),其中 x , μ ∈ R n , Σ ∈ R n × n \boldsymbol x,\boldsymbol \mu\in \mathbb{R}^n, \bold \Sigma\in \mathbb{R}^{n\times n} x,μ∈Rn,Σ∈Rn×n
f ( x ) = 1 ( 2 π ) n d e t ( Σ ) e x p ( − 1 2 ( x − μ ) T Σ − 1 ( x − μ ) ) f(\boldsymbol x)=\frac{1}{\sqrt{(2\pi)^ndet(\bold \Sigma)}}\mathrm{exp}\Big(-\frac{1}{2}(\boldsymbol x-\boldsymbol \mu)^T\mathbf{\Sigma}^{-1}(\boldsymbol x-\boldsymbol \mu)\Big) f(x)=(2π)ndet(Σ)1exp(−21(x−μ)TΣ−1(x−μ))
在优化中一般使用其负对数形式:
− l n [ f ( x ) ] = C + 1 2 ( x − μ ) T Σ − 1 ( x − μ ) -ln[f(\boldsymbol x)]=\boldsymbol C+\frac{1}{2}(\boldsymbol x-\boldsymbol \mu)^T\mathbf{\Sigma}^{-1}(\boldsymbol x-\boldsymbol \mu) −ln[f(x)]=C+21(x−μ)TΣ−1(x−μ)
其中二次型 1 2 ( x − μ ) T Σ − 1 ( x − μ ) \displaystyle{\frac{1}{2}(\boldsymbol x-\boldsymbol \mu)^T\mathbf{\Sigma}^{-1}(\boldsymbol x-\boldsymbol \mu)} 21(x−μ)TΣ−1(x−μ)称为马氏距离,就是一种最小二乘项。
要求 f ( x ) f(\boldsymbol{x}) f(x)的最大值,即是要求马氏距离的最小值。
牛顿法是一种在实数域和复数域上近似求解方程的方法,原理大致如下
以最简单的一元函数为例,若要求一元方程 f ( x ) = 0 f(x)=0 f(x)=0的解,可先随机选取一个初值值 x 0 x_0 x0,但显然 f ( x 0 ) ≠ 0 f(x_0)≠0 f(x0)=0,那么我们对函数 f ( x ) f(x) f(x)关于 x 0 x_0 x0进行一阶泰勒展开:
f ( x 1 ) ≈ f ( x 0 ) + f ′ ( x 0 ) ( x 1 − x 0 ) f(x_1)≈f(x_0)+f'(x_0)(x_1-x_0) f(x1)≈f(x0)+f′(x0)(x1−x0)
我们希望找到 f ( x 1 ) = 0 f(x_1)=0 f(x1)=0,即
f ( x 0 ) + f ′ ( x 0 ) ( x 1 − x 0 ) = 0 f(x_0)+f'(x_0)(x_1-x_0)=0 f(x0)+f′(x0)(x1−x0)=0
所以有
x 1 = x 0 − f ( x 0 ) f ′ ( x 0 ) x_1=x_0-\frac{f(x_0)}{f'(x_0)} x1=x0−f′(x0)f(x0)
此为一轮迭代
之后可以重复以上方法往下找 x 2 , x 3 , ⋅ ⋅ ⋅ x_2,x_3,··· x2,x3,⋅⋅⋅,直到误差允许的范围内为止
过程大致如下图所示
假如所求方程为 x 2 − 1 = 0 x^2-1=0 x2−1=0,那么此时的迭代公式为
x 1 = x 0 − f ( x 0 ) f ′ ( x 0 ) = x 0 − x 0 2 − 1 2 x 0 = x 0 2 + 1 2 x 0 x_1=x_0-\frac{f(x_0)}{f'(x_0)}=x_0-\frac{x_0^2-1}{2x_0}=\frac{x_0}{2}+\frac{1}{2x_0} x1=x0−f′(x0)f(x0)=x0−2x0x02−1=2x0+2x01
但若我取初值 x 0 = 0 x_0=0 x0=0,会导迭代时 x 1 → ∞ x_1\rightarrow\infty x1→∞,这样牛顿法是不是就失效了?
回顾滤波器中的贝叶斯法则:
P ( x │ z ) = P ( z ∣ x ) P ( x ) P ( z ) ∝ P ( z ∣ x ) P ( x ) P(x│z)=\frac{P(z|x)P(x)}{P(z)}\propto P(z|x)P(x) P(x│z)=P(z)P(z∣x)P(x)∝P(z∣x)P(x)
现在目标是要去求解状态变量(这里将待求的位姿信息和路标信息全部整合到一个变量中) x = { x 1 , ⋅ ⋅ ⋅ , x n , y 1 , ⋅ ⋅ ⋅ , y m } \boldsymbol x={\{x_1,···,x_n,y_1,···,y_m\}} x={x1,⋅⋅⋅,xn,y1,⋅⋅⋅,ym}的值
由于 P ( x │ z ) P(x│z) P(x│z)比较难直接表示,所以要借助两种办法
x M A P ∗ = arg max P ( x ∣ z ) = arg max P ( z ∣ x ) P ( x ) \boldsymbol x_{MAP}^*=\arg\max P(x|z)=\arg\max P(z|x)P(x) xMAP∗=argmaxP(x∣z)=argmaxP(z∣x)P(x)
2) 最大似然估计 (Maximize Likelhood Estimation)
x M L E ∗ = arg max P ( z ∣ x ) \boldsymbol x_{MLE}^*=\arg\max P(z|x) xMLE∗=argmaxP(z∣x)
来求出 x \boldsymbol x x的状况
先以最简单的形式来举例,假设噪声都是高斯噪声:
v k , j ∼ N ( 0 , Q k , j ) \boldsymbol v_{k,j}\sim N(\boldsymbol 0,\boldsymbol Q_{k,j}) vk,j∼N(0,Qk,j)
根据观测方程
z k , j = h ( y j , x k ) + v k , j \boldsymbol z_{k,j}=h(\boldsymbol y_j,\boldsymbol x_k)+\boldsymbol v_{k,j} zk,j=h(yj,xk)+vk,j
于是
z − h ( x ) ∼ N ( 0 , Q ) o r z ∼ N ( h ( x ) , Q ) o r P ( z ∣ x ) = N ( h ( x ) , Q ) \boldsymbol z-h(\boldsymbol x)\sim N(0,\boldsymbol Q) \\ or \\ \boldsymbol z\sim N(h(\boldsymbol x),\boldsymbol Q) \\ or \\ \mathrm{P}(\boldsymbol z|\boldsymbol x)=N(h(\boldsymbol x),\boldsymbol Q) z−h(x)∼N(0,Q)orz∼N(h(x),Q)orP(z∣x)=N(h(x),Q)
求解最大似然估计:
x ∗ = arg max P ( z ∣ x ) = arg min ( ( z − h ( x ) ) T Q − 1 ( z − h ( x ) ) ) = arg min ( v T Q − 1 v ) \begin{aligned} \boldsymbol x^*&=\arg\max P(z|x) \\ &=\arg\min\Bigg(\Big(\boldsymbol z-h(\boldsymbol x)\Big)^T\bold Q^{-1}\Big(\boldsymbol z-h(\boldsymbol x)\Big)\Bigg) \\ &=\arg\min(\boldsymbol v^T\bold Q^{-1}\boldsymbol v) \end{aligned} x∗=argmaxP(z∣x)=argmin((z−h(x))TQ−1(z−h(x)))=argmin(vTQ−1v)
说明求后验概率最大化等价于求误差的最小二乘
对于slam模型的两个方程的噪声项(之后记为误差项)
e u , k = x k − f ( x k − 1 , u k ) e z , k , j = z k , j − h ( y j , x k ) \begin{aligned} \boldsymbol e_{\boldsymbol u,k}&=\boldsymbol x_k-f(\boldsymbol x_{k-1},\boldsymbol u_k) \\ \boldsymbol e_{\boldsymbol z,k,j}&=\boldsymbol z_{k,j}-h(\boldsymbol y_j,\boldsymbol x_k) \end{aligned} eu,kez,k,j=xk−f(xk−1,uk)=zk,j−h(yj,xk)
对所有误差的马氏距离求和(构造惩罚函数):
min J ( x , y ) = ∑ k e u , k T R k − 1 e u , k + ∑ k ∑ j e z , k , j T Q k , j − 1 e z , k , j \min J(\boldsymbol x, \boldsymbol y)=\sum_k\boldsymbol e_{\boldsymbol u,k}^T\boldsymbol R_k^{-1}\boldsymbol e_{\boldsymbol u,k}+\sum_k\sum_j\boldsymbol e_{\boldsymbol z,k,j}^T\boldsymbol Q_{k,j}^{-1}\boldsymbol e_{\boldsymbol z,k,j} minJ(x,y)=k∑eu,kTRk−1eu,k+k∑j∑ez,k,jTQk,j−1ez,k,j
对于求解最小二乘问题的极值相当于也是利用迭代的思想去逼近最优解
min x F ( x ) = 1 2 ∥ f ( x ) ∥ 2 2 \min \limits_{\boldsymbol x} F(\boldsymbol x)=\frac{1}{2}\|f(\boldsymbol x)\|^2_2 xminF(x)=21∥f(x)∥22
将目标函数 F ( x ) F(\boldsymbol x) F(x)在 x k x_k xk附近作一阶泰勒展开
F ( x + Δ x ) ≈ F ( x ) + J ( x ) Δ x F(\boldsymbol x+\Delta\boldsymbol x)≈F(\boldsymbol x)+\boldsymbol J(\boldsymbol x)\Delta\boldsymbol x F(x+Δx)≈F(x)+J(x)Δx
其中 J \boldsymbol J J为Jacobian矩阵
J ( x ) = D x F ( x ) = ∇ x T F ( x ) = ∂ F ( x ) ∂ x T = ( ∂ F ( x ) ∂ x 1 , ∂ F ( x ) ∂ x 2 , ⋅ ⋅ ⋅ , ∂ F ( x ) ∂ x n ) \begin{aligned} \boldsymbol J(\boldsymbol x)&=\mathrm D_{\boldsymbol x}F(\boldsymbol x)=\nabla^{\mathrm T}_{\boldsymbol x}F(\boldsymbol x)=\frac{\partial F(\boldsymbol x)}{\partial\boldsymbol x^{\mathrm T}} \\ &=\Big(\frac{\partial F(\boldsymbol x)}{\partial x_1},\frac{\partial F(\boldsymbol x)}{\partial x_2},···,\frac{\partial F(\boldsymbol x)}{\partial x_n}\Big) \end{aligned} J(x)=DxF(x)=∇xTF(x)=∂xT∂F(x)=(∂x1∂F(x),∂x2∂F(x),⋅⋅⋅,∂xn∂F(x))
取梯度反方向,做梯度下降
Δ x ∗ = − J T ( x ) \Delta\boldsymbol x^*=-\boldsymbol J^{\mathrm T}(\boldsymbol x) Δx∗=−JT(x)
这只是确定了方向,一般情况下,还需确定一个步长
记步长为 α ≥ 0 \alpha\ge0 α≥0,根据迭代
x k + 1 = x k + α Δ x ∗ \boldsymbol x_{k+1}=\boldsymbol x_{k}+\alpha\Delta\boldsymbol x^* xk+1=xk+αΔx∗
所以目标就是求
min α F ( x k + 1 ) = min α F ( x k + α Δ x ∗ ) \min\limits_{\alpha}F(\boldsymbol x_{k+1})=\min\limits_{\alpha}F(\boldsymbol x_{k}+\alpha\Delta\boldsymbol x^*) αminF(xk+1)=αminF(xk+αΔx∗)
可以直接求驻点来解得 α \alpha α
φ ( α ) = F ( x k + α Δ x ∗ ) φ ′ ( α ) = 0 \varphi(\alpha)=F(\boldsymbol x_{k}+\alpha\Delta\boldsymbol x^*) \\ \varphi'(\alpha)=0 φ(α)=F(xk+αΔx∗)φ′(α)=0
方法特点:
贪心算法,两次寻路方向正交,产生ZigZag现象(走锯齿路线),导致迭代次数增加
将目标函数 F ( x ) F(\boldsymbol x) F(x)在 x x x附近作二阶泰勒展开
F ( x + Δ x ) ≈ F ( x ) + J ( x ) Δ x + 1 2 Δ x T H ( x ) Δ x F(\boldsymbol x+\Delta\boldsymbol x)≈F(\boldsymbol x)+\boldsymbol J(\boldsymbol x)\Delta\boldsymbol x+\frac{1}{2}\Delta\boldsymbol x^{\mathrm T}\boldsymbol H(\boldsymbol x)\Delta\boldsymbol x F(x+Δx)≈F(x)+J(x)Δx+21ΔxTH(x)Δx
其中 H \boldsymbol H H为Hessian矩阵
H ( x ) = ∇ x 2 F ( x ) = = ∂ 2 F ( x ) ∂ x ∂ x T = ( ∂ 2 F ( x ) ∂ x 1 2 … ∂ 2 F ( x ) ∂ x 1 ∂ x n ⋮ ⋱ ⋮ ∂ 2 F ( x ) ∂ x n ∂ x 1 … ∂ 2 F ( x ) ∂ x n 2 ) \begin{aligned} \boldsymbol H(\boldsymbol x)&=\nabla^2_{\boldsymbol x}F(\boldsymbol x)==\frac{\partial^2 F(\boldsymbol x)}{\partial\boldsymbol x\partial\boldsymbol x^{\mathrm T}} \\ &= \begin{pmatrix} \displaystyle{\frac{\partial^2 F(\boldsymbol x)}{\partial x_1^2}} & \dots & \displaystyle{\frac{\partial^2 F(\boldsymbol x)}{\partial x_1\partial x_n}} \\ \vdots & \ddots & \vdots \\ \displaystyle{\frac{\partial^2 F(\boldsymbol x)}{\partial x_n\partial x_1}} & \dots & \displaystyle{\frac{\partial^2 F(\boldsymbol x)}{\partial x_n^2}} \end{pmatrix} \end{aligned} H(x)=∇x2F(x)==∂x∂xT∂2F(x)=⎝⎜⎜⎜⎜⎜⎛∂x12∂2F(x)⋮∂xn∂x1∂2F(x)…⋱…∂x1∂xn∂2F(x)⋮∂xn2∂2F(x)⎠⎟⎟⎟⎟⎟⎞
要求函数 F ( x ) F(\boldsymbol x) F(x)的极值,也就是求驻点,即 F ′ ( x ) = 0 F'(\boldsymbol x)=0 F′(x)=0的点
将上面的二阶泰勒展开式对 Δ x \Delta\boldsymbol x Δx求导,得
F ′ ( x + Δ x ) ≈ J T ( x ) + H ( x ) Δ x F'(\boldsymbol x+\Delta\boldsymbol x)≈ \boldsymbol J^{\mathrm T}(\boldsymbol x)+\boldsymbol H(\boldsymbol x)\Delta\boldsymbol x F′(x+Δx)≈JT(x)+H(x)Δx
令一阶导数等于0,得
H Δ x = − J T \boldsymbol H\Delta\boldsymbol x=-\boldsymbol J^{\mathrm T} HΔx=−JT
若 H H H可逆,则可得到牛顿迭代公式为
x k + 1 = x k − H − 1 J T \boldsymbol x_{k+1}=\boldsymbol x_k-\boldsymbol H^{-1}\boldsymbol J^{\mathrm T} xk+1=xk−H−1JT
方法缺点:
求解Hessian矩阵 H \boldsymbol H H过于复杂
牛顿法是直接对二范数 ∥ f ( x + Δ x ) ∥ 2 2 \|f(\boldsymbol x+\Delta\boldsymbol x)\|^2_2 ∥f(x+Δx)∥22进行泰勒展开
而高斯-牛顿法是先对函数作泰勒展开,之后再求二范数
f ( x + Δ x ) ≈ f ( x ) + J ( x ) Δ x Δ x ∗ = arg min Δ x 1 2 ∥ f ( x ) + J ( x ) Δ x ∥ 2 f(\boldsymbol x+\Delta\boldsymbol x)≈f(\boldsymbol x)+\boldsymbol J(\boldsymbol x)\Delta\boldsymbol x \\ \Delta\boldsymbol x^*=\arg\min\limits_{\Delta\boldsymbol x}\frac{1}{2}\Big\|f(\boldsymbol x)+\boldsymbol J(\boldsymbol x)\Delta\boldsymbol x\Big\|^2 f(x+Δx)≈f(x)+J(x)ΔxΔx∗=argΔxmin21∥∥∥f(x)+J(x)Δx∥∥∥2
展开待优化式:
1 2 ∥ f ( x ) + J Δ x ∥ 2 = 1 2 ( f ( x ) + J Δ x ) T ( f ( x ) + J Δ x ) = 1 2 ( ∥ f ( x ) ∥ 2 2 + 2 f T ( x ) J Δ x + Δ x T J T J Δ x ) \begin{aligned} \frac{1}{2}\Big\|f(\boldsymbol x)+\boldsymbol J\Delta\boldsymbol x\Big\|^2&=\frac{1}{2}\Big(f(\boldsymbol x)+\boldsymbol J\Delta\boldsymbol x\Big)^{\mathrm T}\Big(f(\boldsymbol x)+\boldsymbol J\Delta\boldsymbol x\Big) \\ &=\frac{1}{2}\Big(\|f(\boldsymbol x)\|^2_2+2f^{\mathrm T}(\boldsymbol x)\boldsymbol J\Delta\boldsymbol x+\Delta\boldsymbol x^{\mathrm T}\boldsymbol J^{\mathrm T}\boldsymbol J\Delta\boldsymbol x\Big) \end{aligned} 21∥∥∥f(x)+JΔx∥∥∥2=21(f(x)+JΔx)T(f(x)+JΔx)=21(∥f(x)∥22+2fT(x)JΔx+ΔxTJTJΔx)
求导求驻点
J T f + J T J Δ x = 0 J T J Δ x = − J f \boldsymbol J^{\mathrm T}f+\boldsymbol J^{\mathrm T}\boldsymbol J\Delta\boldsymbol x=0 \\ \boldsymbol J^{\mathrm T}\boldsymbol J\Delta\boldsymbol x=-\boldsymbol Jf JTf+JTJΔx=0JTJΔx=−Jf
记 J T J = H , − J T f = g \boldsymbol J^{\mathrm T}\boldsymbol J=\boldsymbol H,-\boldsymbol J^{\mathrm T}f=\boldsymbol g JTJ=H,−JTf=g,即得到增量方程
H Δ x = g \boldsymbol H\Delta\boldsymbol x=\boldsymbol g HΔx=g
计算 J T J \boldsymbol{J}^{\mathrm T}\boldsymbol{J} JTJ比牛顿法计算Hessian矩阵要容易的多,但是 J T J \boldsymbol{J}^{\mathrm T}\boldsymbol{J} JTJ是半正定的,不一定可逆
上面两种优化都属于线性搜索(Line Search)方式
而这里的LM方法属于置信区域(Trust Region)模式
记
ρ = f ( x + Δ x ) − f ( x ) J ( x ) Δ x \rho = \frac{f(\boldsymbol x+\Delta\boldsymbol x)-f(\boldsymbol x)}{\boldsymbol J(x)\Delta\boldsymbol x} ρ=J(x)Δxf(x+Δx)−f(x)
即实际下降与一阶近似下降的比值
LM方法确定迭代增量的时候,将增量约束与此范围之内:
min Δ x 1 2 ∥ f ( x + J ( x ) Δ x ) ∥ 2 , s . t . ∥ D Δ x ∥ 2 ≤ μ \min\limits_{\Delta\boldsymbol x}\frac{1}{2}\|f(\boldsymbol x+\boldsymbol J(\boldsymbol x)\Delta\boldsymbol x)\|^2 , \quad\quad\quad s.t.\|\boldsymbol D\Delta\boldsymbol x\|^2≤\mu Δxmin21∥f(x+J(x)Δx)∥2,s.t.∥DΔx∥2≤μ
其中 μ \mu μ是信赖区域半径(初始随机取值), D \boldsymbol D D是区域形状
确定增量前,先要计算 ρ \rho ρ
对于区域形状 D \boldsymbol D D,Levenberg和Marquardt提出的有所不同
所以整个问题相当于求解一个条件极值
可以使用拉格朗日乘数法
min Δ x 1 2 ( ∥ f ( x + J ( x ) Δ x ) ∥ 2 + λ ∥ D Δ x ∥ 2 ) \min\limits_{\Delta\boldsymbol x}\frac{1}{2}\Big(\|f(\boldsymbol x+\boldsymbol J(\boldsymbol x)\Delta\boldsymbol x)\|^2+\lambda\|\boldsymbol D\Delta\boldsymbol x\|^2\Big) Δxmin21(∥f(x+J(x)Δx)∥2+λ∥DΔx∥2)
还是求解增量方程
有
( J T J + λ D T D ) Δ x = − J f o r ( H + λ D T D ) Δ x = g \big(\boldsymbol J^{\mathrm T}\boldsymbol J+\lambda\boldsymbol D^{\mathrm T}\boldsymbol D\big)\Delta\boldsymbol x=-\boldsymbol Jf \\ or \\ \big(\boldsymbol H+\lambda\boldsymbol D^{\mathrm T}\boldsymbol D\big)\Delta\boldsymbol x=\boldsymbol g (JTJ+λDTD)Δx=−Jfor(H+λDTD)Δx=g
可以看出,就是比G-N方法多了一个 λ D T D \lambda\boldsymbol D^{\mathrm T}\boldsymbol D λDTD
以Levenberg为例( D = I \boldsymbol D=\boldsymbol I D=I)
增量方程即为
( H + λ I ) Δ x = g \big(\boldsymbol H+\lambda\boldsymbol I\big)\Delta\boldsymbol x=\boldsymbol g (H+λI)Δx=g
这相当于给矩阵 H \boldsymbol H H增加了它的正定性,并且:
所以可以将LM方法看做是一阶法与二阶法的一个混合折中