- 本节把机器人状态估计问题(已知观测z、输入u,求定位x、建图y)转化为最小二乘问题进行优化.
- 最小二乘问题可采用求导(解析解)或迭代(数值解)来解决。在评价函数为为非线性(指凸函数)时,一般采用迭代方式(凸优化),具体有一阶梯度下降法(直速下降法),二阶梯度下降法(牛顿法、高斯牛顿法G-N、列文伯格-马夸尔特法L-M).
- 本节涉及到向量求导、贝叶斯法则、条件概率、高斯分布、拉格朗日乘数法等基础数学知识…
视觉SLAM学习打卡【6】-非线性优化
一、数学基础
1.矩阵求导
矩阵or向量求导只是批量求导数的一种方式,本质还是矩阵or向量中的标量之间在求导数,只不过是借助矩阵or向量的形式,同时对多个因变量关于自变量求导.
本节只涉及到 scale-vector 和 vector-vector.
- 两种布局
a. 分子布局:偏导后得出矩阵的行数是和分子的维度一致
∂ y ∂ x = [ ∂ y ∂ x 1 ∂ y ∂ x 2 ⋯ ∂ y ∂ x n ] . ∂ y ∂ x = [ ∂ y 1 ∂ x ∂ y 2 ∂ x ⋮ ∂ y m ∂ x ] . ∂ y ∂ x = [ ∂ y 1 ∂ x 1 ∂ y 1 ∂ x 2 ⋯ ∂ y 1 ∂ x n ∂ y 2 ∂ x 1 ∂ y 2 ∂ x 2 ⋯ ∂ y 2 ∂ x n ⋮ ⋮ ⋱ ⋮ ∂ y m ∂ x 1 ∂ y m ∂ x 2 ⋯ ∂ y m ∂ x n ] ∂ y ∂ X = [ ∂ y ∂ x 11 ∂ y ∂ x 21 ⋯ ∂ y ∂ x p 1 ∂ y ∂ x 12 ∂ y ∂ x 22 ⋯ ∂ y ∂ x p 2 ⋮ ⋮ ⋱ ⋮ ∂ y ∂ x 1 q ∂ y ∂ x 2 q ⋯ ∂ y ∂ x p q ] \begin{aligned} &\frac{\partial y}{\partial\mathbf{x}} \left.=\left[\begin{array}{cccc}\frac{\partial y}{\partial x_1}&\frac{\partial y}{\partial x_2}&\cdots&\frac{\partial y}{\partial x_n}\end{array}\right.\right]. \\ &\frac{\partial\mathbf{y}}{\partial x} \left.=\left[\begin{array}{c}\frac{\partial y_1}{\partial x}\\\frac{\partial y_2}{\partial x}\\\vdots\\\frac{\partial y_m}{\partial x}\end{array}\right.\right]. \\ &\frac{\partial\mathbf{y}}{\partial\mathbf{x}} =\begin{bmatrix}\frac{\partial y_1}{\partial x_1}&\frac{\partial y_1}{\partial x_2}&\cdots&\frac{\partial y_1}{\partial x_n}\\\frac{\partial y_2}{\partial x_1}&\frac{\partial y_2}{\partial x_2}&\cdots&\frac{\partial y_2}{\partial x_n}\\\vdots&\vdots&\ddots&\vdots\\\frac{\partial y_m}{\partial x_1}&\frac{\partial y_m}{\partial x_2}&\cdots&\frac{\partial y_m}{\partial x_n}\end{bmatrix} \\ &\frac{\partial y}{\partial\mathbf{X}} \left.=\left[\begin{matrix}\frac{\partial y}{\partial x_{11}}&\frac{\partial y}{\partial x_{21}}&\cdots&\frac{\partial y}{\partial x_{p1}}\\\frac{\partial y}{\partial x_{12}}&\frac{\partial y}{\partial x_{22}}&\cdots&\frac{\partial y}{\partial x_{p2}}\\\vdots&\vdots&\ddots&\vdots\\\frac{\partial y}{\partial x_{1q}}&\frac{\partial y}{\partial x_{2q}}&\cdots&\frac{\partial y}{\partial x_{pq}}\end{matrix}\right.\right] \end{aligned} ∂x∂y=[∂x1∂y∂x2∂y⋯∂xn∂y].∂x∂y= ∂x∂y1∂x∂y2⋮∂x∂ym .∂x∂y= ∂x1∂y1∂x1∂y2⋮∂x1∂ym∂x2∂y1∂x2∂y2⋮∂x2∂ym⋯⋯⋱⋯∂xn∂y1∂xn∂y2⋮∂xn∂ym ∂X∂y= ∂x11∂y∂x12∂y⋮∂x1q∂y∂x21∂y∂x22∂y⋮∂x2q∂y⋯⋯⋱⋯∂xp1∂y∂xp2∂y⋮∂xpq∂y
其中, ∂ y ∂ x p × q \frac{\partial y}{\partial x_{p\times q}} ∂xp×q∂y可看作:
∂ y ∂ x p × q = [ ∂ y ∂ x 1 i ⋯ ∂ y ∂ x p i ] \frac{\partial y}{\partial x_{p\times q}}=[\frac{\partial y}{\partial x_{1i}}\cdots\frac{\partial y}{\partial x_{pi}}] ∂xp×q∂y=[∂x1i∂y⋯∂xpi∂y]
b. 分母布局:偏导后得出矩阵的行数是和分母的维度一致
∂ y ∂ x = [ ∂ y ∂ x 1 ∂ y ∂ x 2 ⋮ ∂ y ∂ x n ] . ∂ y ∂ x = [ ∂ y 1 ∂ x ∂ y 2 ∂ x ⋯ ∂ y m ∂ x ] . ∂ y ∂ x = [ ∂ y 1 ∂ x 1 ∂ y 2 ∂ x 1 ⋯ ∂ y m ∂ x 1 ∂ y 1 ∂ x 2 ∂ y 2 ∂ x 2 ⋯ ∂ y m ∂ x 2 ⋮ ⋮ ⋱ ⋮ ∂ y 1 ∂ x n ∂ y 2 ∂ x n ⋯ ∂ y m ∂ x n ] ∂ y ∂ X = [ ∂ y ∂ x 11 ∂ y ∂ x 12 ⋯ ∂ y ∂ x 1 q ∂ y ∂ x 21 ∂ y ∂ x 22 ⋯ ∂ y ∂ x 2 q ⋮ ⋮ ⋱ ⋮ ∂ y ∂ x p 1 ∂ y ∂ x p 2 ⋯ ∂ y ∂ x p q ] \begin{aligned} &\frac{\partial y}{\partial\mathbf{x}} \left.=\left[\begin{array}{l}\frac{\partial y}{\partial x_1}\\\frac{\partial y}{\partial x_2}\\\vdots\\\frac{\partial y}{\partial x_n}\end{array}\right.\right]. \\ &\frac{\partial\mathbf{y}}{\partial x} \left.=\left[\begin{array}{cccc}\frac{\partial y_1}{\partial x}&\frac{\partial y_2}{\partial x}&\cdots&\frac{\partial y_m}{\partial x}\end{array}\right.\right]. \\ &\frac{\partial\mathbf{y}}{\partial\mathbf{x}} =\begin{bmatrix}\frac{\partial y_1}{\partial x_1}&\frac{\partial y_2}{\partial x_1}&\cdots&\frac{\partial y_m}{\partial x_1}\\\frac{\partial y_1}{\partial x_2}&\frac{\partial y_2}{\partial x_2}&\cdots&\frac{\partial y_m}{\partial x_2}\\\vdots&\vdots&\ddots&\vdots\\\frac{\partial y_1}{\partial x_n}&\frac{\partial y_2}{\partial x_n}&\cdots&\frac{\partial y_m}{\partial x_n}\end{bmatrix} \\ &\frac{\partial y}{\partial\mathbf{X}} =\begin{bmatrix}\frac{\partial y}{\partial x_{11}}&\frac{\partial y}{\partial x_{12}}&\cdots&\frac{\partial y}{\partial x_{1q}}\\\frac{\partial y}{\partial x_{21}}&\frac{\partial y}{\partial x_{22}}&\cdots&\frac{\partial y}{\partial x_{2q}}\\\vdots&\vdots&\ddots&\vdots\\\frac{\partial y}{\partial x_{p1}}&\frac{\partial y}{\partial x_{p2}}&\cdots&\frac{\partial y}{\partial x_{pq}}\end{bmatrix} \end{aligned} ∂x∂y= ∂x1∂y∂x2∂y⋮∂xn∂y .∂x∂y=[∂x∂y1∂x∂y2⋯∂x∂ym].∂x∂y= ∂x1∂y1∂x2∂y1⋮∂xn∂y1∂x1∂y2∂x2∂y2⋮∂xn∂y2⋯⋯⋱⋯∂x1∂ym∂x2∂ym⋮∂xn∂ym ∂X∂y= ∂x11∂y∂x21∂y⋮∂xp1∂y∂x12∂y∂x22∂y⋮∂xp2∂y⋯⋯⋱⋯∂x1q∂y∂x2q∂y⋮∂xpq∂y
其中, ∂ y ∂ x p × q \frac{\partial y}{\partial x_{p\times q}} ∂xp×q∂y可看作:
∂ y ∂ x p × q = [ ∂ y ∂ x 1 i ⋮ ∂ y ∂ x p i ] \left.\frac{\partial y}{\partial x_{p\times q}}=\left[\begin{matrix}\frac{\partial y}{\partial x_{1i}}\\\varvdots\\\frac{\partial y}{\partial x_{pi}}\end{matrix}\right.\right] ∂xp×q∂y= ∂x1i∂y⋮∂xpi∂y
c. 分子布局 = 分母布局 ^T - 求导规律
a. 常量可提到导数外
∂ a u ∂ x = a ∂ u ∂ x \frac{\partial a\mathbf{u}}{\partial\mathbf{x}}=a\frac{\partial\mathbf{u}}{\partial\mathbf{x}} ∂x∂au=a∂x∂u
b. 分子线性组合可拆开
∂ ( u + v ) ∂ x = ∂ u ∂ x + ∂ v ∂ x \frac{\partial\mathbf{(u+v)}}{\partial \mathbf{x}}=\frac{\partial \mathbf{u}}{\partial\mathbf{ x}}+\frac{\partial \mathbf{v}}{\partial\mathbf{ x}} ∂x∂(u+v)=∂x∂u+∂x∂v
c. 转置符号可以提出来
∂ F T ∂ x = ( ∂ F ∂ x T ) T \frac{\partial\boldsymbol{F}^\mathrm{T}}{\partial\boldsymbol{x}}=\left(\frac{\partial\boldsymbol{F}}{\partial\boldsymbol{x}^\mathrm{T}}\right)^\mathrm{T} ∂x∂FT=(∂xT∂F)T - 两个重要的结论
a. ∂ A y → ∂ y → = A T \frac{\partial A\overrightarrow{y}}{\partial\overrightarrow{y}}=A^T ∂y∂Ay=AT
b. ∂ y ⃗ T A y ⃗ ∂ y ⃗ = ( A + A T ) y ⃗ \frac{\partial\vec{y}^TA\vec{y}}{\partial\vec{y}}=(A+A^T){\vec{y}} ∂y∂yTAy=(A+AT)y
若A为对称矩阵,则 ∂ y ⃗ T A y ⃗ ∂ y ⃗ = ( A + A T ) y ⃗ = 2 A y ⃗ \frac{\partial\vec{y}^TA\vec{y}}{\partial\vec{y}}=(A+A^T){\vec{y}}=2A{\vec{y}} ∂y∂yTAy=(A+AT)y=2Ay - 查表
矩阵求导涉及到谁左谁右的问题,具体法则可参考Matrix_calculus 的 wiki 网站
2.贝叶斯法则
p ( A / B ) = P ( B / A ) P ( A ) P ( B ) p(A/B)=\frac{P(B/A)P(A)}{P(B)} p(A/B)=P(B)P(B/A)P(A)
- P(A|B)是已知B发生后A的条件概率,也由于得自B的取值而被称作A的后验概率.
- P(B|A)称为似然.
- P(A)是A的先验概率或边缘概率。之所以称为"先验"是因为它不考虑任何B方面的因素.
- P(B)是B的先验概率或边缘概率,也作标准化常量(normalized constant).
- Bayes法则可表述为:
后验概率 = (似然度 * 先验概率)/标准化常量.
也就是说,后验概率与先验概率和似然度的乘积成正比.
3.拉格朗日乘数法
- 设给定二元函数z=ƒ(x,y)和附加条件φ(x,y)=0.
- 为寻找z=ƒ(x,y)在附加条件下的极值点,先做拉格朗日函数 F ( x , y , λ ) = f ( x , y ) + λ φ ( x , y ) F\left(x,y,\lambda\right)=f(x,y)+\lambda\varphi(x,y) F(x,y,λ)=f(x,y)+λφ(x,y),其中λ为参数.
- 令F(x,y,λ)对x和y和λ的一阶偏导数等于零,即
F x ′ = f x ′ ( x , y ) + λ φ x ′ ( x , y ) = 0 F y ′ = f y ′ ( x , y ) + λ φ y ′ ( x , y ) = 0 F λ ′ = φ ( x , y ) = 0 \begin{array}{ll}\mathrm{F'_x=f'_x(x,y)+\lambda\varphi'_x(x,y)=0}\\\\\mathrm{F'_y=f'_y(x,y)+\lambda\varphi'_y(x,y)=0}\\\\\mathrm{F'_\lambda=\varphi(x,y)=0}\end{array} Fx′=fx′(x,y)+λφx′(x,y)=0Fy′=fy′(x,y)+λφy′(x,y)=0Fλ′=φ(x,y)=0 - 由上述方程组解出x,y及λ,如此求得的(x,y),就是函数z=ƒ(x,y)在附加条件φ(x,y)=0下的可能极值点.
4.多元高斯分布
一般标量服从高斯分布的概率密度函数为:
f ( x ) = 1 2 π σ exp [ − ( x − μ ) 2 2 σ 2 ] f(x)=\frac1{\sqrt{2\pi}\sigma}\exp\left[-\frac{(x-\mu)^2}{2\sigma^2}\right] f(x)=2πσ1exp[−2σ2(x−μ)2]
向量 x ∼ N ( μ , Σ ) x\sim\mathcal{N}(\boldsymbol{\mu},\boldsymbol{\Sigma}) x∼N(μ,Σ),其中,μ为均值, ∑为协方差矩阵.
P ( x ) = 1 ( 2 π ) N det ( Σ ) exp ( − 1 2 ( x − μ ) T Σ − 1 ( x − μ ) ) P\left(\boldsymbol{x}\right)=\frac{1}{\sqrt{\left(2\pi\right)^{N}\det\left(\boldsymbol{\Sigma}\right)}}\exp\left(-\frac{1}{2}(\boldsymbol{x}-\boldsymbol{\mu})^{\mathrm{T}}\boldsymbol{\Sigma}^{-1}\left(\boldsymbol{x}-\boldsymbol{\mu}\right)\right) P(x)=(2π)Ndet(Σ)1exp(−21(x−μ)TΣ−1(x−μ))
对概率密度函数取负对数,仅第二项与P(x)直接相关.
− ln ( P ( x ) ) = 1 2 ln ( ( 2 π ) N det ( Σ ) ) + 1 2 ( x − μ ) T Σ − 1 ( x − μ ) -\ln\left(P\left(\boldsymbol{x}\right)\right)=\frac12\ln\left(\left(2\pi\right)^N\det\left(\boldsymbol{\Sigma}\right)\right)+\frac12(\boldsymbol{x}-\boldsymbol{\mu})^\mathrm{T}\boldsymbol{\Sigma}^{-1}\left(\boldsymbol{x}-\boldsymbol{\mu}\right) −ln(P(x))=21ln((2π)Ndet(Σ))+21(x−μ)TΣ−1(x−μ)
二、解决机器人状态估计
经典SLAM问题:
{ x k = f ( x k − 1 , u k ) + w k z k , j = h ( y j , x k ) + v k , j \begin{cases}\boldsymbol{x}_k=f\left(\boldsymbol{x}_{k-1},\boldsymbol{u}_k\right)+\boldsymbol{w}_k\\\boldsymbol{z}_{k,j}=h\left(\boldsymbol{y}_j,\boldsymbol{x}_k\right)+\boldsymbol{v}_{k,j}&\end{cases} {
xk=f(xk−1,uk)+wkzk,j=h(yj,xk)+vk,j运动方程和观测方程中的噪声: w k ∼ N ( 0 , R k ) , v k ∼ N ( 0 , Q k , j ) \boldsymbol{w}_k\sim\mathcal{N}\left(\boldsymbol{0},\boldsymbol{R}_k\right),\boldsymbol{v}_k\sim\mathcal{N}\left(\boldsymbol{0},\boldsymbol{Q}_{k,j}\right) wk∼N(0,Rk),vk∼N(0,Qk,j)由已知的z和u,推测x和y,构成状态估计问题.
1.处理思路
- 滤波角度-增量/渐进数据
由于在SLAM中,数据随时间逐渐到来,可以先持有当前时刻的估计状态,然后用新数据更新它,存在累计误差. - 优化角度-批量数据SFM(Structure from Motion)
让机器人和无人机收集所有时刻的数据,带回计算中心统一处理. - 折衷手段-滑动窗口
固定一些历史轨迹,仅对当前时刻附近的一些轨迹进行优化. - 综合手段-前端后端
前端使用轻量级的方法预估路径(滤波/小优化/预积分),积累一定的数据后,在后端对轨迹进行优化.
2.问题描述(本节对批量数据优化进行介绍)
- 面临的问题:已知运动和观测,求轨迹和地图,即 P ( x , y ∣ z , u ) P(x,\boldsymbol{y}|\boldsymbol{z},\boldsymbol{u}) P(x,y∣z,u).
- 使用贝叶斯法则对问题变形,将最大化后验概率转换为最大化似然和先验的乘积
P ( x , y ∣ z , u ) = P ( z , u ∣ x , y ) P ( x , y ) P ( z , u ) ∝ P ( z , u ∣ x , y ) ⏟ 似然 P ( x , y ) ⏟ 先验 P\left(\boldsymbol{x},\boldsymbol{y}|\boldsymbol{z},\boldsymbol{u}\right)=\frac{P\left(\boldsymbol{z},\boldsymbol{u}|\boldsymbol{x},\boldsymbol{y}\right)P\left(\boldsymbol{x},\boldsymbol{y}\right)}{P\left(\boldsymbol{z},\boldsymbol{u}\right)}\propto\underbrace{P\left(\boldsymbol{z},\boldsymbol{u}|\boldsymbol{x},\boldsymbol{y}\right)}_\text{似然}{ \underbrace { P \left ( \boldsymbol { x },\boldsymbol{y}\right)}_\text{先验}} P(x,y∣z,u)=P(z,u)P(z,u∣x,y)P(x,y)∝似然 P(z,u∣x,y)先验 P(x,y) ( x , y ) M A P ∗ = arg max P ( x , y ∣ z , u ) = arg max P ( z , u ∣ x , y ) P ( x , y ) (x,y)^*_{\mathrm{MAP}}=\arg\max P\left(x,\boldsymbol{y}|z,\boldsymbol{u}\right)=\arg\max P(\boldsymbol{z},\boldsymbol{u}|\boldsymbol{x},\boldsymbol{y})P(x,\boldsymbol{y}) (x,y)MAP∗=argmaxP(x,y∣z,u)=argmaxP(z,u∣x,y)P(x,y)
其中,arg为目标函数 P ( x , y ∣ z , u ) P\left(x,\boldsymbol{y}|z,\boldsymbol{u}\right) P(x,y∣z,u)取最大值时对应的(x,y)值. - 有时候我们没有运动信息,只有一组观测,这时就没有了先验,问题是纯粹的SFM问题(在怎样的位姿和地图下,最可能出现已知观测),直接求最大似然估计.
( x , y ) M L E ∗ = arg max P ( z , u ∣ x , y ) (\boldsymbol{x},\boldsymbol{y})^*_{\mathrm{MLE}}=\arg\max P(\boldsymbol{z},\boldsymbol{u}|\boldsymbol{x},\boldsymbol{y}) (x,y)MLE∗=argmaxP(z,u∣x,y)
3.某次观测误差
- 先看某次观测: z k , j = h ( y j , x k ) + v k , j \boldsymbol{z}_{k,j}=h\left(\boldsymbol{y}_j,\boldsymbol{x}_k\right)+\boldsymbol{v}_{k,j} zk,j=h(yj,xk)+vk,j
噪声项: v k ∼ N ( 0 , Q k , j ) \boldsymbol{v}_k\sim\mathcal{N}\left(\boldsymbol{0},\boldsymbol{Q}_{k,j}\right) vk∼N(0,Qk,j) - 观测的概率分布为: P ( z j , k ∣ x k , y j ) = N ( h ( y j , x k ) , Q k , j ) P(\boldsymbol{z}_{j,k}|\boldsymbol{x}_k,\boldsymbol{y}_j)=N\left(h(\boldsymbol{y}_j,\boldsymbol{x}_k),\boldsymbol{Q}_{k,j}\right) P(zj,k∣xk,yj)=N(h(yj,xk),Qk,j)
- 由对概率密度函数取负对数: − ln ( P ( x ) ) = 1 2 ln ( ( 2 π ) N det ( Σ ) ) + 1 2 ( x − μ ) T Σ − 1 ( x − μ ) -\ln\left(P\left(\boldsymbol{x}\right)\right)=\frac12\ln\left(\left(2\pi\right)^N\det\left(\boldsymbol{\Sigma}\right)\right)+\frac12(\boldsymbol{x}-\boldsymbol{\mu})^\mathrm{T}\boldsymbol{\Sigma}^{-1}\left(\boldsymbol{x}-\boldsymbol{\mu}\right) −ln(P(x))=21ln((2π)Ndet(Σ))+21(x−μ)TΣ−1(x−μ)仅第二项与P(x)直接相关可知: ( x k , y j ) ∗ = arg max N ( h ( y j , x k ) , Q k , j ) = arg min ( ( z k , j − h ( x k , y j ) ) T Q k , j − 1 ( z k , j − h ( x k , y j ) ) ) \begin{aligned} (\boldsymbol{x}_k,\boldsymbol{y}_j)^*& =\arg\max\mathcal{N}(h(\boldsymbol{y}_j,\boldsymbol{x}_k),\boldsymbol{Q}_{k,j}) \\ &=\arg\min\left(\left(\boldsymbol{z}_{k,j}-h\left(\boldsymbol{x}_k,\boldsymbol{y}_j\right)\right)^{\mathrm{T}}\boldsymbol{Q}_{k,j}^{-1}\left(\boldsymbol{z}_{k,j}-h\left(\boldsymbol{x}_k,\boldsymbol{y}_j\right)\right)\right) \end{aligned} (xk,yj)∗=argmaxN(h(yj,xk),Qk,j)=argmin((zk,j−h(xk,yj))TQk,j−1(zk,j−h(xk,yj)))
其中,Q为协方差矩阵, Q − 1 {Q}^{-1} Q−1为信息矩阵.
4.批量数据
- 假设各个时刻的输入和观测是独立的,可以分解成多个概率的乘积: P ( z , u ∣ x , y ) = ∏ k P ( u k ∣ x k − 1 , x k ) ∏ k , j P ( z k , j ∣ x k , y j ) P\left(\boldsymbol{z},\boldsymbol{u}|\boldsymbol{x},\boldsymbol{y}\right)=\prod_{k}P\left(\boldsymbol{u}_{k}|\boldsymbol{x}_{k-1},\boldsymbol{x}_{k}\right)\prod_{k,j}P\left(\boldsymbol{z}_{k,j}|\boldsymbol{x}_{k},\boldsymbol{y}_{j}\right) P(z,u∣x,y)=k∏P(uk∣xk−1,xk)k,j∏P(zk,j∣xk,yj)
- 定义运动和观测误差.
e u , k = x k − f ( x k − 1 , u k ) e z , j , k = z k , j − h ( x k , y j ) \begin{gathered} e_{u,k} =\boldsymbol{x}_k-f\left(\boldsymbol{x}_{k-1},\boldsymbol{u}_k\right) \\ e_{z,j,k} =\boldsymbol{z}_{k,j}-h\left(\boldsymbol{x}_k,\boldsymbol{y}_j\right) \end{gathered} eu,k=xk−f(xk−1,uk)ez,j,k=zk,j−h(xk,yj) - 将xy作为优化变量,将输入误差和观测误差之和作为目标函数,求当误差最小时的xy,形成最小二乘问题. 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}^\mathrm{T}\boldsymbol{R}_{k}^{-1}\boldsymbol{e}_{\boldsymbol{u},k}+\sum_{k}\sum_{j}\boldsymbol{e}_{\boldsymbol{z},k,j}^\mathrm{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_{\boldsymbol{x}}F(\boldsymbol{x})=\frac12{\left\|f\left(\boldsymbol{x}\right)\right\|}_{2}^{2} xminF(x)=21∥f(x)∥22
- 根据求解形式不同,可分为解析解(求导)和 数值解(求迭代,在 x k x_{k} xk处展开 F ( x k + Δ x k ) ≈ F ( x k ) + J ( x k ) T Δ x k + 1 2 Δ x k T H ( x k ) Δ x k F(\boldsymbol{x}_k+\Delta\boldsymbol{x}_k)\approx F(\boldsymbol{x}_k)+\boldsymbol{J}\left(\boldsymbol{x}_k\right)^\mathrm{T}\Delta\boldsymbol{x}_k+\frac12\Delta\boldsymbol{x}_k^\mathrm{T}\boldsymbol{H}(\boldsymbol{x}_k)\Delta\boldsymbol{x}_k F(xk+Δxk)≈F(xk)+J(xk)TΔxk+21ΔxkTH(xk)Δxk,J是雅克比Jacobian-F(x)关于x的一阶导,H是海森矩阵Hessian-F(x)关于x的二阶导, X T A X X^TAX XTAX是二次型).
1. 一阶(梯度下降法)
F ( x ) = 1 2 ∣ ∣ f ( x ) ∣ ∣ 2 ∂ F ( x ) ∂ x = 1 2 ⋅ ∂ f ( x ) ∂ x ⋅ ∂ ( f ( x ) ) 2 ∂ f ( x ) = J ( x ) f ( x ) \begin{aligned}F(x)&=\frac{1}{2}\left|\left|f(x)\right|\right|^{2}\\\frac{\partial F(x)}{\partial x}&=\frac{1}{2}\cdot\frac{\partial f(x)}{\partial x}\cdot\frac{\partial\left(f(x)\right)^{2}}{\partial f(x)}\\&=J(x)f(x)\end{aligned} F(x)∂x∂F(x)=21∣∣f(x)∣∣2=21⋅∂x∂f(x)⋅∂f(x)∂(f(x))2=J(x)f(x)这里的梯度是目标函数的梯度,导数(梯度)是增量的方向,梯度取反就是梯度下降的方向,通常不会直接让J代表步长,会加因子or饱和函数(深度学习中把这个因子叫做学习率).
Δ x ∗ = − α J ( x k ) \Delta x^{*}=-\alpha J(x_{k}) Δx∗=−αJ(xk)
2.二阶(牛顿法)
仅使用一阶梯度作为下降方向,有时并不能很好地拟合函数的局部趋势(最速下降法过于贪心). Δ x ∗ = arg min ( F ( x ) + J ( x ) T Δ x + 1 2 Δ x T H Δ x ) \Delta\boldsymbol{x}^{*}=\arg\min\left(F\left(\boldsymbol{x}\right)+\boldsymbol{J}\left(\boldsymbol{x}\right)^{\mathrm{T}}\Delta\boldsymbol{x}+\frac12\Delta\boldsymbol{x}^{\mathrm{T}}\boldsymbol{H}\Delta\boldsymbol{x}\right) Δx∗=argmin(F(x)+J(x)TΔx+21ΔxTHΔx)
对二阶展开关于△x求偏导,令其等于0得: J + H Δ x = 0 ⇒ H Δ x = − J J+H\Delta x=0\Rightarrow H\Delta x=-J J+HΔx=0⇒HΔx=−J
- x在这里是一个参数,真正的变量是△x,当x确定下来后,△x 也就直接确定下来了.
- 如果能求出△x的解析解,那么在任意位置x都能准确知道使得 F(x+△x) 达到最小的最佳△x.
- 就这样,边寻找当前 x k x_{k} xk下的最佳△x,边更新下一时刻的 x k + 1 x_{k+1} xk+1,虽然二阶近似也不会非常准确,但是只要步长不过于大,迭代次数多,就能找到近乎准确的数值极小值x.
( 牛顿法中,海森矩阵 H 计算不易,求逆也不易)
3. 改进二阶 (高斯-牛顿 G-N)
使用一阶展开的平方产生二阶项,从而避免求Fx的海森矩阵.
f ( x + Δ x ) ≈ f ( x ) + J ( x ) T Δ x f\left(\boldsymbol{x}+\Delta\boldsymbol{x}\right)\approx f\left(\boldsymbol{x}\right)+\boldsymbol{J}\left(\boldsymbol{x}\right)^\mathrm{T}\Delta\boldsymbol{x} f(x+Δx)≈f(x)+J(x)TΔx Δ x ∗ = arg min Δ x 1 2 ∥ f ( x ) + J ( x ) T Δ x ∥ 2 \Delta\boldsymbol{x}^{*}=\arg\min_{\Delta\boldsymbol{x}}\frac12{\left\|f\left(\boldsymbol{x}\right)+\boldsymbol{J}\left(\boldsymbol{x}\right)^{\mathrm{T}}\Delta\boldsymbol{x}\right\|}^{2} Δx∗=argΔxmin21
f(x)+J(x)TΔx
2 1 2 ∥ f ( x ) + J ( x ) T Δ x ∥ 2 = 1 2 ( f ( x ) + J ( x ) T Δ x ) T ( f ( x ) + J ( x ) T Δ x ) = 1 2 ( ∥ f ( x ) ∥ 2 2 + 2 f ( x ) J ( x ) T Δ x + Δ x T J ( x ) J ( x ) T Δ x ) \begin{aligned} \frac12{\left\|f\left(\boldsymbol{x}\right)+\boldsymbol{J}\left(\boldsymbol{x}\right)^{\mathrm{T}}\Delta\boldsymbol{x}\right\|}^{2}& =\frac12\Big(f\left(\boldsymbol{x}\right)+\boldsymbol{J}\left(\boldsymbol{x}\right)^\mathrm{T}\Delta\boldsymbol{x}\Big)^\mathrm{T}\left(f\left(\boldsymbol{x}\right)+\boldsymbol{J}\left(\boldsymbol{x}\right)^\mathrm{T}\Delta\boldsymbol{x}\right) \\ &=\frac12\left(\left\|f(\boldsymbol{x})\right\|_2^2+2f\left(\boldsymbol{x}\right)\boldsymbol{J}(\boldsymbol{x})^\mathrm{T}\Delta\boldsymbol{x}+\Delta\boldsymbol{x}^\mathrm{T}\boldsymbol{J}(\boldsymbol{x})\boldsymbol{J}(\boldsymbol{x})^\mathrm{T}\Delta\boldsymbol{x}\right) \end{aligned} 21
f(x)+J(x)TΔx
2=21(f(x)+J(x)TΔx)T(f(x)+J(x)TΔx)=21(∥f(x)∥22+2f(x)J(x)TΔx+ΔxTJ(x)J(x)TΔx)
对△x求导得: J ( x ) f ( x ) + J ( x ) J T ( x ) Δ x = 0 \boldsymbol{J}\left(\boldsymbol{x}\right)f\left(\boldsymbol{x}\right)+\boldsymbol{J}\left(\boldsymbol{x}\right)\boldsymbol{J}^\mathrm{T}\left(\boldsymbol{x}\right)\Delta\boldsymbol{x}=\boldsymbol{0} J(x)f(x)+J(x)JT(x)Δx=0 J ( x ) J T ⏟ H ( x ) ( x ) Δ x = − J ( x ) f ( x ) ⏟ g ( x ) \underbrace{\boldsymbol{J}(\boldsymbol{x})\boldsymbol{J}^\mathrm{T}}_{\boldsymbol{H}(\boldsymbol{x})}\left(\boldsymbol{x}\right)\Delta\boldsymbol{x}=\underbrace{-\boldsymbol{J}(\boldsymbol{x})\boldsymbol{f}\left(\boldsymbol{x}\right)}_{\boldsymbol{g}(\boldsymbol{x})} H(x)
J(x)JT(x)Δx=g(x)
−J(x)f(x) H Δ x = g H\Delta x=\boldsymbol{g} HΔx=g
使用 J ( x ) J ( x ) T J(x)J(x)^T J(x)J(x)T近似代替了H,起到简化运算的效果.
( J ( x ) J ( x ) T J(x)J(x)^T J(x)J(x)T是半正定的,不一定可逆 )
G-N方法步骤
4. 改进二阶 (列文伯格-马夸尔特L-M)
高斯牛顿法中使用 J ( x ) J ( x ) T J(x)J(x)^T J(x)J(x)T代替H,只在展开点附近有较好的近似效果,应为△x限定一个“信任区域”.
- 可信度指标
ρ = f ( x + Δ x ) − f ( x ) J ( x ) T Δ x \rho=\frac{f\left(\boldsymbol{x}+\Delta\boldsymbol{x}\right)-f\left(\boldsymbol{x}\right)}{\boldsymbol{J}\left(\boldsymbol{x}\right)^\mathrm{T}\Delta\boldsymbol{x}} ρ=J(x)TΔxf(x+Δx)−f(x)分子表示实际函数差,分布表示近似函数差.
a. ρ<1,近似比实际大,激进(应缩小信任域)
b. ρ>1,近似比实际小,保守(应扩大信任域)
c. ρ≈1,近似贴近实际,信任域维持不变
min Δ x k 1 2 ∥ f ( x k ) + J ( x k ) T Δ x k ∥ 2 , s . t . ∥ D Δ x k ∥ 2 ⩽ μ , \min_{\Delta\boldsymbol{x}_k}\frac12\Big\Vert f\left(\boldsymbol{x}_k\right)+\boldsymbol{J}\left(\boldsymbol{x}_k\right)^\mathrm{T}\Delta\boldsymbol{x}_k\Big\Vert^2,\quad\mathrm{s.t.}\quad\left\Vert\boldsymbol{D}\Delta\boldsymbol{x}_k\right\Vert^2\leqslant\mu, Δxkmin21
f(xk)+J(xk)TΔxk
2,s.t.∥DΔxk∥2⩽μ,
采用拉格朗日乘数法得: L ( Δ x k , λ ) = 1 2 ∥ f ( x k ) + J ( x k ) T Δ x k ∥ 2 + λ 2 ( ∥ D Δ x k ∥ 2 − μ ) \mathcal{L}(\Delta\boldsymbol{x}_k,\lambda)=\frac12\Big\Vert f\left(\boldsymbol{x}_k\right)+\boldsymbol{J}\left(\boldsymbol{x}_k\right)^\mathrm{T}\Delta\boldsymbol{x}_k\Big\Vert^2+\frac\lambda2\left(\left\Vert\boldsymbol{D}\Delta\boldsymbol{x}_k\right\Vert^2-\mu\right) L(Δxk,λ)=21
f(xk)+J(xk)TΔxk
2+2λ(∥DΔxk∥2−μ)对△x求偏导得: ( H + λ D T D ) Δ x k = g \left(\boldsymbol{H}+\lambda\boldsymbol{D}^\mathrm{T}\boldsymbol{D}\right)\Delta\boldsymbol{x}_k=\boldsymbol{g} (H+λDTD)Δxk=g若D=I, ( H + λ I ) Δ x k = g (\boldsymbol{H}+\lambda\boldsymbol{I})\Delta\boldsymbol{x}_k=\boldsymbol{g} (H+λI)Δxk=g
- 与高斯牛顿法相比,左边H上加了个λI
- 当λ比较小,退化为高斯牛顿方法
- 当λ比较大,退化为梯度下降方法
- L-M方法可以看成 梯度下降与高斯牛顿法之间的融合,通过 λ 来切换两种方法.
L-M方法步骤
四、安装库及报错解决
1. Ceres库的安装
- 按照本书3rdparty提供的链接编译时,会报错,原因是Ceres和eigen3版本发生冲突。此处安装Ceres1.14.0版本。
点击此处——>链接到下载网址 - 安装ceres相关依赖
sudo apt-get install liblapack-dev libsuitesparse-dev libcxsparse3 libgflags-dev libgoogle-glog-dev libgtest-dev
- 解压、编译、安装
tar -zxvf ceres-solver-1.14.0.tar.gz
cd ceres-solver-1.14.0/
mkdir build
cd build/
cmake ..
make
sudo make install
2. g2o库的安装
- g2o采用本书3rdparty提供的链接直接编译安装即可
- `安装依赖项
sudo apt-get install libeigen3-dev
sudo apt-get install libsuitesparse-dev
sudo apt-get install qtdeclarative5-dev
sudo apt-get install qt5-qmake
sudo apt-get install libqglviewer-dev
装最后一个依赖项时,如果出现 Package ‘libqglviewer-dev’ has no installation candidate
改为:
sudo apt-get install qtdeclarative5-dev qt5-qmake libqglviewer-headers
3.编译、安装
cd g2o
mkdir build
cd build
sudo ldconfig
cmake ..
make
sudo make install
注:一定要在编译前进行sudo ldconfig,ldconfig是一个动态链接库管理命令。安装完成某个工程后生成许多动态库,为了让这些动态链接库为系统所共享,还需运行动态链接库的管理命令–ldconfig。