最小二乘優化

BA最小二乘的本質

BA優化的是最小二乘問題,那麼爲什麼可以使用最小二乘來估計呢?小二乘問題與概率之間的關係:

使用最大後驗概率(MAP)來得到狀態量,其中z是觀測值,x是狀態:
x^=argmaxxp(xz)(1) \hat { \mathbf { x } } = \arg \max _ { \mathbf { x } } p ( \mathbf { x } |\mathbf { z } )\tag{1}
使用貝葉斯展開:

x^=argmaxxp(xz)=argmaxxp(zx)p(x)p(z)=argmaxxp(zx)p(x) \begin{aligned} \hat { \mathbf { x } } &= \arg \max _ { \mathbf { x } } p ( \mathbf { x } | \mathbf { z }) = \arg \max _ { \mathbf { x } } \frac { p ( \mathbf { z } | \mathbf { x } ) p ( \mathbf { x } ) } { p ( \mathbf { z } ) }\\ &= \arg \max _ { \mathbf { x } } p ( \mathbf { z } | \mathbf { x } ) p ( \mathbf { x } ) \end{aligned}

其中第一項化爲:
p(zx)=k=0Kp(zkxk)(2) p ( \mathbf { z } | \mathbf { x } ) = \prod _ { k = 0 } ^ { K } p \left( \mathbf { z } _ { k } | \mathbf { x } _ { k } \right) \tag{2}
第二項化爲:
p(x)=p(x0xˇ0)k=1Kp(xkxk1)(3) p ( \mathbf { x } ) = p \left( \mathbf { x } _ { 0 } | \check { \mathbf { x } } _ { 0 } \right) \prod _ { k = 1 } ^ { K } p \left( \mathbf { x } _ { k } | \mathbf { x } _ { k - 1 } \right)\tag{3}
第二項可以假設一個運動模型,忽略。

可以轉化爲最大似然估計(MLE):
x^=argmaxxk=0Klogp(zkxk)(4) \hat { \mathbf { x } } = \arg \max _ { \mathbf { x } }\sum _ { k = 0 } ^ { K } \log p \left( \mathbf { z } _ { k } | \mathbf { x } _ { k } \right)\tag{4}
其中使用高斯模型來假設:
logp(zkxk)=12(zkz(xk))TΣk1(zkz(xk))12log((2π)MdetΣk)(5) \log p \left( \mathbf { z } _ { k } | \mathbf { x } _ { k } \right) = - \frac { 1 } { 2 } \left( \mathbf { z } _ { k } - z(\mathbf { x } _ { k }) \right) ^ { T } \mathbf { \Sigma } _ { k } ^ { - 1 } \left( \mathbf { z } _ { k } - z(\mathbf { x } _ { k }) \right) - \frac { 1 } { 2 } \log \left( ( 2 \pi ) ^ { M } \operatorname { det } \mathbf { \Sigma } _ { k } \right) \tag{5}
最後一項與狀態無關,因此MLE可以化爲:
x^=argminxk=0Kr(zk,xk)Σk2(6) \hat { \mathbf { x } } = \arg \min _ { \mathbf { x } }\sum _ { k = 0 } ^ { K }\|r(\mathbf{z}_k, \mathbf{x}_k)\|^2_{\Sigma_k} \tag{6}
其中殘差項爲馬氏距離:
rΣ2=rTΣ1r(7) \|r\|^2_{\Sigma}=r^T\Sigma^{-1}r \tag{7}
這樣就轉化爲了非線性最小二乘問題。

最小二乘服從卡方分佈
z=(xm)TΣ1(xm)χn2(8) z = ( \mathbf { x } - \mathbf { m } ) ^ { T } \mathbf { \Sigma } ^ { - 1 } ( \mathbf { x } - \mathbf { m } ) \sim \chi _ { n } ^ { 2 }\tag{8}

這相當於一種加權的最小二乘。


最小二乘問題(Least-squares Minimization)

對於線性方程組,解的判別條件如下:

  1. Ax=0A{\bf x}={\bf 0} 總有解,至少有零解

  2. Am×nx=0A_{m\times n}{\bf x}={\bf 0}

    r(A)=nr(A)=n,只有零解
    r(A)<nr(A)<n,有無窮多解

  3. Am×nx=bA_{m×n}{\bf x}={\bf b}

    r(A)r(Ab)r(A)≠r(A|b),無解
    r(A)=r(Ab)=nr(A)=r(A|b)=n,有唯一解
    r(A)=r(Ab)=r<nr(A)=r(A|b)=r<n,有無窮多解

針對上面第三個方程,根據未知數和方程數量的關係可以分爲以下幾種情況:

如果m<nm<n,未知數大於方程數。那麼解不唯一,存在一個解矢量空間。

如果m=nm=n,那麼只要AA可逆(非奇異,也就是滿秩)就有唯一解,解爲x=A1bx=A^{−1}b

如果m>nm>n,方程數大於未知數。方程一般沒有解,除非b\bf b屬於AA的列向量組成的子空間。

sss
這裏介紹針對Ax=bAx=b使用直接方法進行求解,即不使用迭代的方式。

超定方程

考慮m>nm>nr(A)=nr(A)=n,這時無解,但可以找到一個最小二乘解,解最小二乘的解法有奇異值分解正規方程QR分解,可以參考許可師兄的博客

正規方程的幾何解釋:

我們要尋找的是使得Axb\|A {\bf x}-{\bf b} \|最小的矢量x{\bf x}的值,把AA寫成列空間的形式A=(a1,a2,...,an)A=(a_1,a_2,...,a_n),當x{\bf x}取不同的值時,AxA{\bf x}看作是列空間AA生成的子空間,但是在存在一個最接近向量b{\bf b}的子空間,我們要找到這個子空間。

針對這個子空間的理解:

假設AAm×nm\times n維(m>nm>n )的矩陣,那麼就可以理解爲在m維的空間上有以這n個(或者更少,據相關性決定)向量爲基底組成的子空間中,找到一個向量與m維空間中的一個向量b最接近,由於是子空間中,若b不在這個子空間中那麼是找不到解析解的,只有最接近的最小二乘解,也就是圖中垂直的情況。

如圖,平面爲Rank(A)Rank(A)的子空間,當向量AxbA{\bf x}-{\bf b}垂直如圖的列空間時最小,其它情況都是斜邊比它大。
在這裏插入圖片描述

因此讓向量AxbA{\bf x}-{\bf b}垂直與AA的列空間,得到:
AT(Axb)=0(9) A^T(A{\bf x}-{\bf b})={\bf 0} \tag{9}
整理得到:
ATAx=ATbx=(ATA)1ATb(10) A^TA{\bf x}=A^T{\bf b} \\ {\bf x}=(A^TA)^{-1}A^T{\bf b} \tag{10}

爲什麼有解,因爲ATbA^TbATAA^TA的列空間中。

加權的最小二乘問題:
(ATCA)x=ATCb(11) \left( \mathrm { A } ^ { \mathrm { T } } \mathrm { CA } \right) \mathbf { x } = \mathrm { A } ^ { \mathrm { T } } \mathrm { Cb } \tag{11}

適定方程

考慮ARn×nA\in R^{n\times n}r(A)=nr(A)=n的情況,這種情況下通常可以使用公式(12)求解,但是當矩陣維數很大時,或者要求實時性時就變得不實用了。
x=A1b(12) {\bf x=A^{-1}b} \tag{12}
針對稀疏模式,我們可以利用一些係數矩陣結構來更快的進行求解。通常包括帶狀(如下圖)、分塊對角和稀疏矩陣。

在這裏插入圖片描述

通常方便求解的一些特殊係數矩陣包括:

對角矩陣:直接可以求出。

上三角矩陣:從最後一個未知數開始解,使用後向帶入(back-substitution)的方式。

下三角矩陣:從第一個未知數開始解,使用前向帶入(forward-substitution)的方式。

正交矩陣:轉置求解,特殊的有Householder矩陣A=I2uuTA=I-2uu^T形式可以加快求解。

排列矩陣:實現矩陣的行交換和列交換的矩陣,只有1或者0。直接求解。

矩陣的求解方法可以分爲:

因式分解的方法,把係數矩陣A分解成上面所描述的一些方便求解的矩陣的連乘形式進行求解。

分塊消元的方法,對係數矩陣具有特殊結構的形式,可以進行分塊消元來求解。

因式分解

LU分解

針對非奇異矩陣 ,可以因式分解爲
A=PLU(13) A=PLU \tag{13}
式中P是排列矩陣,L是單位下三角矩陣,U是上三角矩陣。

帶狀結構矩陣和稀疏矩陣可以獲得更快的運算。對於稀疏矩陣有如下分解:
A=P1LUP2(14) A=P_1LUP_2 \tag{14}
LU若是稀疏的,可以加快求解,它的稀疏性依賴於排列矩陣P1P2P_1P_2的選擇。係數矩陣的LU分解成本依賴於維數、非零元素的個數、稀疏模式和使用的算法等。

Cholesky分解

針對對稱正定矩陣,可以因式分解爲
A=LLT(15) A=LL^T \tag{15}
其中L爲下三角非奇異矩陣,對角元素是正數。快於LU分解一倍,對帶狀和稀疏矩陣,使用特殊算法複雜度遠低於稠密矩陣的複雜度。

對於稀疏矩陣,有分解形式:
A=PLLTPT(16) A=PLL^TP^T \tag{16}
同樣排列矩陣P對L的稀疏性有很大影響,它由係數矩陣的稀疏模式所決定,不取決於非零元素的具體值。因此可以分爲兩步驟,符號因式分解和數值因式分解。(LU分解的P依賴於具體數值)

LDLT分解

針對非奇異對稱矩陣,可以分解爲
A=PLDLTPT(17) A=PLDL^TP^T \tag{17}
P是排列矩陣,L是對角線元素爲正的下三角,D是塊對角矩陣,對角塊爲維數是1或2的非奇異方陣。對於帶狀和稀疏矩陣與Cholesky相似,稀疏時P矩陣還依賴於A的非零元素具體數值。

分塊消元

這種方法對於子矩陣容易因式分解的A具有較好的效果,如塊對角和帶狀矩陣。將Ax=bAx=b分塊表示:

[A11A12A21A22][x1x2]=[b1b2](18) \begin{bmatrix} A_{11}&A_{12} \\ A_{21}&A_{22} \end{bmatrix} \begin{bmatrix} x_1 \\ x_2 \end{bmatrix} = \begin{bmatrix} b_1 \\ b_2 \end{bmatrix} \tag{18}

A11A_{11}可逆,可以消元得到:
x1=A111(b1A12x2)(19) x_1=A_{11}^{-1}(b_1-A_{12}x_2) \tag{19}
帶入得到:
(A22A21A111A12)x2=b2A21A111b1(20) (A_{22}-A_{21}A_{11}^{-1} A_{12})x_2=b_2-A_{21}A_{11}^{-1}b_1 \tag{20}
其中
S=A22A21A111A12(21) S=A_{22}-A_{21}A_{11}^{-1}A_{12} \tag{21}
叫做A的A11A_{11}Schur補,當且僅當A非奇異時Schur補非奇異。

這種消元可以看做是分塊的LU分解,現在採用的因式分解求解方法都是採用分塊因式分解和求解的步驟。求解公式(19)和公式(20)過程中都需要對A11A_{11}SS用因式分解。

A11A_{11}沒有結構可以利用時,分塊消元的方法不具有優勢。但是A11A_{11}具有有效的因式分解和求解的結構時,分塊消元的方法比標準方法更有效。

A11A_{11}爲對角矩陣則可以直接求解,帶狀矩陣則更有效。特別的具有帶狀結構的A11A_{11}的矩陣A有時成爲箭式矩陣,因爲A11A_{11}維數較大時,看上去像箭頭。用分塊消元法求解箭式結構的方程遠比標準方法有效,這就是SLAM求解正規方程採用這種方法的原因。當A是對稱對稱正定矩陣時,A11A_{11}SS也是相應的矩陣。


非線性最小二乘問題(Non-linear Least-squares)

SLAM常用的迭代優化算法

GN收斂性

高斯牛頓法(Gauss-Newton)就不多介紹了。推導一下它的收斂性,是以二次來近似的一種思想。

設最小二乘形式爲:
G(x)=12F(x)2(22) G(x)=\frac{1}{2}\|F(x)\|^2 \tag{22}
對於G(x)G(x)的二次泰勒展開式爲

G(xk+1)=G(xk)+GxΔx+12ΔxT2G x2Δx=G(xk)+F(xk)FxΔx+12ΔxT(FxTFx+F(xk)2Fx2)Δx(23) \begin{aligned} G(x_{k+1}) &= G(x_k)+\frac{\partial G}{\partial x}\Delta x+\frac{1}{2}\Delta x^T\frac{\partial^2 G}{\ \partial x^2} \Delta x \\&=G(x_k)+F(x_k)\frac{\partial F}{\partial x}\Delta x+\frac{1}{2}\Delta x^T\left(\frac{\partial F}{\partial x}^T\frac{\partial F}{\partial x}+F(x_k)\frac{\partial^2 F}{\partial x^2}\right)\Delta x \end{aligned} \tag{23}

G-N方法中:

F(x)F(x)一階展開:
F(xk+1)=F(xk)+FxΔx(24) F(x_{k+1}) =F(x_k)+\frac{\partial F}{\partial x}\Delta x \tag{24}
求得的代入公式(22)求得:
G(xk+1)=12F2(xk)+F(xk)FxΔx+12ΔxTFxTFxΔx(25) G(x_{k+1}) = \frac{1}{2}F^2(x_k)+F(x_k)\frac{\partial F}{\partial x}\Delta x+\frac{1}{2}\Delta x^T\frac{\partial F}{\partial x}^T\frac{\partial F}{\partial x}\Delta x \tag{25}
對比公式(15)和公式(13)的二階項部分,可以發現相差了一個
S(x)=F(x)2Fx2(26) S(x^*)=F(x^*)\frac{\partial^2 F}{\partial x^2} \tag{26}
我們設:
J=FxH=2Fx2(27) J=\frac{\partial F}{\partial x} \qquad H=\frac{\partial^2 F}{\partial x^2} \tag{27}
xkxx_k \rightarrow x^*時,GN的收斂速度與最優殘差量大小和線性程度相關,具體如下:

  • 二階收斂:當多餘的項S(x)=0\|S(x^*)\|=0,即F(x)=0F(x^*)=0或者H(x)=0H(x^*)=0時,在零殘差問題或者線性最小二乘情況具有Newton法的收斂速度。
  • 線性收斂:當S(x)0\|S(x^*)\|\neq 0,則具有線性收斂速度,隨着S(x)\|S(x^*)\|增大而變慢。
  • S(x)\|S(x^*)\|很大,則可能不收斂。

補充:

Newton法的二階收斂性,初始點充分靠近極值點,並且Hessian矩陣非奇異,並且Hessian矩陣在極值點附近Lipschitz連續。

注:Lipschitz連續是一種更強的連續,限制函數的改變速度。Gk1M\|G_k^{-1}\|\leq M

HH是對JJ求僞逆的過程的副產品,與二階偏導的Hessian不同,它反應了圖像數據的統計特性,若HH是不可逆的說明圖像中的梯度信息不足以來跟蹤,(JTJ)1JT(J^TJ)^{-1}J^T叫做僞逆。

GN的缺點

  • 當函數梯度很大時,收斂速度慢
  • 依賴於H矩陣,奇異時算法失效
  • 非線性程度強時算法失效,如上面所示;

舉例

  • 無人機做IMU融合時候,加速度計懸停和勻速運動都會導致HkH_k就奇異了,無法求解。

最速下降法

對公式(22)進行一階展開,求得負梯度爲最速下降方向,在進行直線搜索得到最優步長。注意和GN的展開對象不同

LM

解決JkTJk{J^T_k} J_k爲奇異矩陣的情況,是一種信賴區域型(Trust Region)的方法(先限定了步長的範圍,再來決定迭代的方向與步長)。 與直線搜索(先確定方向,再確定步長)的方法是相對的一種方法。

將公式(24)帶入公式(22)中,則trust-region的最小二乘可以表示爲:
mind12F(x)+JΔx2s.t.Δx2Δk2(28) \min_d \frac{1}{2}\|F(x)+J\Delta x\|^2 \\ s.t. \quad \|\Delta x\|^2\leq\|\Delta_k\|^2 \tag{28}
根據KKT條件,取得極值的點滿足:
JT(F(x)+JΔx)+λΔx=0λ(Δk2Δx2)=0(29) J^T(F(x)+J\Delta x)+\lambda \Delta x=0 \\ \lambda(\|\Delta_k\|^2-\|\Delta x\|^2)=0 \tag{29}
公式(29)第一個式子整理得到
(JTJ+λI)Δx=JTF(x)(30) (J^TJ+\lambda I)\Delta x = -J^TF(x) \tag{30}
這對使得Hessian矩陣變得是對角佔優的,因此必定是非奇異的。

設公式(28)得到qk(Δx)=12F(x)+JΔx2q_k(\Delta x)=\frac{1}{2}\|F(x)+J\Delta x\|^2

根據公式(22)設:
KaTeX parse error: Undefined control sequence: \ at position 97: … k } \right) \\\̲ ̲\begin{aligned}…
若它們接近說明近似的很好,可以增大信賴區域。
ρk=ΔGkΔqk(32) \rho _ { k } = \frac { \Delta G_ { k } } { \Delta q _ { k } }\tag{32}
置信區間的一般算法框架,有證明對025和0.75等常數不敏感:
在這裏插入圖片描述
λ\lambda一般取Hessian的對角線元素最大值的τ\tau倍(算法對它比較敏感,比較接近最有值則使用小值10610^{-6},或者103,110^{-3}, 1等),一般是非零的。

阻尼同時受到下降方向和步驟的多少,隨着步驟增加應該減小。開始較遠使用最速下降,接近後使用高斯牛頓二階收斂快。

代碼中LM一般的作用只有兩個,一個是防止Hessian不滿秩,一個是當GN失敗的時候增加lambda來找到下降方向。開始lambda不應該設置太大,會導致收斂慢(最速下降沒有GN收斂性好)。也可以增加scale來保證delta大小合適,如同dso。最速下降沒有GN效果好。

SVO中使用LM計算稀疏圖像對齊的方法如下:

  1. 設置μ\mu初值
double H_max_diag = 0;
double tau = 1e-4;
H_max_diag = max(H_max_diag, fabs(H_(j,j))); //j=1.2....6
mu_ = tau*H_max_diag;
  1. 計算HH矩陣
H_ += (H_.diagonal()*mu_).asDiagonal();
  1. 求解最小二乘問題,成功則更新優化變量,計算新的誤差。誤差比上一次迭代減小則轉4,求解失敗或者誤差增大則轉5.

  2. 迭代成功,判斷終止條件,並且更新參數

stop_ = vk::norm_max(x_)<=eps_; //判斷增量足夠小
mu_ *= max(1./3., min(1.-pow(2*rho_-1,3), 2./3.)); //縮小mu_,還是很保守的,沒有增大
nu_ = 2.;
  1. 迭代失敗,增大置信區間,嘗試幾次。
mu_ *= nu_;
nu_ *= 2.;
++n_trials_;

總結,就是error減小了,則減小μ\mu;增大了,則增大μ\mu

Dog-Leg

LM算法中λ\lambda非零就導致了,在GN算法可以一步求得最優值的情況下,卻選擇了一個不是很好的下降方向,降低了收斂速度。因此引入了Dog-Leg算法,它由GN和SD(最速下降)組合而成。其下降方向共三種情況:

  • 求解GN方程得到步長ΔGNxΔk\|\Delta^{GN} x\| \leq \Delta_k,則沿着$ \Delta^{GN} x$進行迭代,對應與圖中(a)情況。否則使用最速下降求解。
  • 根據最速下降法直線搜索得到最優步長αk\alpha_k,若αkΔSDxΔk\alpha_k\|\Delta^{SD}x\| \geq \Delta_k,則沿着ΔkΔSDxΔSDx\Delta _k \frac{\Delta^{SD}x}{\|\Delta^{SD}x\|},即沿着下降方向走信賴域半徑長度Δk\Delta_k,對應與圖中(b)。
  • 否則在二者所張成的空間內選擇一個方向使得下降的長度爲Δk\Delta _k,對應於下圖(c)情況。即按下式

Δx=αkΔSDx+(ΔGNxαkΔSDx)β(33) \Delta x=\alpha_k\Delta^{SD}x+(\Delta^{GN}x-\alpha_k\Delta^{SD}x)\beta \tag{33}

得到下降的方向與步長,其中β\beta使得Δx=Δk\|\Delta x\|=\Delta _k

在這裏插入圖片描述
算法的流程如下圖所示:
在這裏插入圖片描述

同樣Dog-Leg可以應對GN法中Hessian矩陣奇異的情況,使用最速下降法來補償,而LM算法卻保證了Hessian永遠是非奇異的。一般認爲Dog-Leg比LM性能更好,並且能達到相同的精度。

PCG

滿足uTAv=0\mathbf{u}^{\mathrm{T}} \mathbf{A} \mathbf{v}=0 的兩個向量,稱爲A\mathbf A的兩個共軛方向。思想就是每次都沿着共軛方向進行搜索,第二次直接指向極值點,具有二次終止性。對於n元二次正定目標函數可以有限次到達極小點(二元二次只需兩次,好像可以理解爲座標下降,n元就n次)。

設二次函數
f(x)=12xTAxxTb f(x)=\frac{1}{2} \mathbf{x}^{\mathrm{T}} \mathbf{A} \mathbf{x}-\mathbf{x}^{\mathrm{T}} \mathbf{b}
它的一次導數和二次導數分別是:Axb\mathbf{A x}-\mathbf{b}A\mathbf A

算法如下:

r0:=bAx0if r0 is sufficiently small, then return x0 as the resultp0:=r0k:=0repeatαk:=rkTrkpkTApkxk+1:=xk+αkpkrk+1:=rkαkApkif rk+1 is sufficiently small, then exit loopβk:=rk+1Trk+1rkTrkpk+1:=rk+1+βkpkk:=k+1end repeatreturn xk+1 as the result{\displaystyle {\begin{aligned}&\mathbf {r} _{0}:=\mathbf {b} -\mathbf {Ax} _{0}\\&{\text{if }}\mathbf {r} _{0}{\text{ is sufficiently small, then return }}\mathbf {x} _{0}{\text{ as the result}}\\&\mathbf {p} _{0}:=\mathbf {r} _{0}\\&k:=0\\&{\text{repeat}}\\&\qquad \alpha _{k}:={\frac {\mathbf {r} _{k}^{\mathsf {T}}\mathbf {r} _{k}}{\mathbf {p} _{k}^{\mathsf {T}}\mathbf {Ap} _{k}}}\\&\qquad \mathbf {x} _{k+1}:=\mathbf {x} _{k}+\alpha _{k}\mathbf {p} _{k}\\&\qquad \mathbf {r} _{k+1}:=\mathbf {r} _{k}-\alpha _{k}\mathbf {Ap} _{k}\\&\qquad {\text{if }}\mathbf {r} _{k+1}{\text{ is sufficiently small, then exit loop}}\\&\qquad \beta _{k}:={\frac {\mathbf {r} _{k+1}^{\mathsf {T}}\mathbf {r} _{k+1}}{\mathbf {r} _{k}^{\mathsf {T}}\mathbf {r} _{k}}}\\&\qquad \mathbf {p} _{k+1}:=\mathbf {r} _{k+1}+\beta _{k}\mathbf {p} _{k}\\&\qquad k:=k+1\\&{\text{end repeat}}\\&{\text{return }}\mathbf {x} _{k+1}{\text{ as the result}}\end{aligned}}}

部分值推導如下:

在這裏插入圖片描述
爲了快速收斂常常使用preconditioning

在這裏插入圖片描述

預處理(preconditioning)是一種將問題調整爲更適合數值求解方法的形式的變換,使得條件數變小。預處理器的選擇參考preconditioner wiki,一般選用雅克比預處理器,最簡單即對角線。

參考:wiki

求解方法

上面的優化最終都會化簡爲Ax=bAx=b的線性方程組求解形式,對於GN和LM的方法A往往是非奇異的n×nn\times n維矩陣。

值得注意的是,迭代優化求解效果往往與初值有很大的關係,初值不好容易收斂到局部最小。

我們一般假設所求的狀態xx是符合高斯分佈的,因此使用協方差矩陣來表示一個對狀態的加權,最後得到馬氏距離來表示,這與公式(7)相對應,其正定方程爲:
JTΣ1JΔx=JTΣ1b(34) {\rm J^T\Sigma^{-1}J}\Delta x=-{\rm J^T\Sigma^{-1}}b \tag{34}

求解狀態量

下面就以式(34)爲例進行求解。假設有3個相機4個觀測的點,將相機和點分開則Jacobi矩陣爲:
J=[AB]=[A1B1A2B2A3B3](35) J=[A|B]=\left[ \begin{array}{ccc|c} A_1&&&B_1\\ &A_2&&B_2\\ &&A_3&B_3 \end{array}\right] \tag{35}
優化變量和右值爲:
Δx=[ΔxcΔxp]b=[ATΣ1bBTΣ1b]=[bAbB](36) \Delta x= \left[ \begin{array} {cc} \Delta x_c \\ \hline \Delta x_p \end{array} \right] \quad b= \left[ \begin{array} {cc} A^T\Sigma^{-1} b \\ \hline B^T\Sigma^{-1} b \end{array} \right]=\begin{bmatrix} b_A \\ b_B \end{bmatrix} \tag{36}
該Jacobian矩陣可以表示爲如圖,其中白色部分爲有值:

在這裏插入圖片描述
根據公式(34)得到Hessian矩陣:
H=JTΣ1J=[ATΣ1AATΣ1BBTΣ1ABTΣ1B]=[UWWTV](37) H=J^T\Sigma^{-1}J= \left[\begin{array}{c|c} A^T\Sigma^{-1}A & A^T\Sigma^{-1}B \\ \hline B^T\Sigma^{-1}A &B^T\Sigma^{-1}B \end{array}\right] =\begin{bmatrix} U&W\\ W^T&V \end{bmatrix} \tag{37}
可以使用下圖來表示該H矩陣:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-gDC16Xoy-1582200908839)(img/最小二乘優化/1547532395665.png)]

這樣公式可以表示爲

[UWWTV][ΔxcΔxp]=[bAbB](38) \begin{bmatrix} U&W\\ W^T&V \end{bmatrix} \left[ \begin{array} {cc} \Delta x_c \\ \Delta x_p \end{array} \right]=\begin{bmatrix} b_A \\b_B \end{bmatrix} \tag{38}

根據公式(18)-(21),計算VV的舒爾補進行分塊消元:
(UWV1WT)Δxc=bAWV1bB(39) (U-WV^{-1}W^T)\Delta x_c=b_A-WV^{-1}b_B \tag{39}
通過(39)式解出Δxc\Delta x_c代入公式(40)可以解出Δxp\Delta x_p
VΔxp=bBWTΔxc(40) V\Delta x_p=b_B-W^T\Delta x_c \tag{40}
公式(38)變爲:
[UWV1WT0WTV][ΔxcΔxp]=[bAWV1bBbB](41) \begin{bmatrix} U-WV^{-1}W^T&0\\ W^T&V \end{bmatrix} \left[ \begin{array} {cc} \Delta x_c \\ \Delta x_p \end{array} \right]=\begin{bmatrix} b_A-WV^{-1}b_B \\b_B \end{bmatrix} \tag{41}
SLAM中的邊緣化就是這麼做的,這樣會給原來的H矩陣帶來fill-in變得不稀疏了。解出增量就可以對狀態進行更新了。

協方差求解

根據公式(34)可知,狀態增量Δ\Delta的協方差和狀態變量bb的協方差之間滿足公式(42)的線性關係:
Δx=(JTΣ1J)1JTΣ1b(42) \Delta x=-({\rm J^T\Sigma^{-1}J})^{-1}{\rm J^T\Sigma^{-1}}b \tag{42}
因線性關係,協方差滿足這裏A是線性關係的係數
Σp=AΣkAT=(JTΣ1J)+JTΣ1 Σ ((JTΣ1J)+JTΣ1)T=(JTΣ1J)+(43) \begin{aligned} \Sigma_{p} =A\Sigma_k A^T &=({\rm J^T\Sigma^{-1}J})^{ + }{\rm J^T\Sigma^{-1}} \ \Sigma \ \left(({\rm J^T\Sigma^{-1}J})^{+}{\rm J^T\Sigma^{-1}}\right)^T \\ &=({\rm J^T\Sigma^{-1}J})^{+} \end{aligned} \tag{43}
根據公式(37)可以得到:
JTΣX1J=[UWWV]=[IY0I][UWV1WT00V][I0YTI](44) \mathrm { J } ^ { \rm T } \Sigma _ { \mathbf { X } } ^ { - 1 } \mathrm { J } = \left[ \begin{array} { c c } { U } & { W } \\ { W ^ { \top } } & { V } \end{array} \right]=\left[ \begin{array} { c c } { \mathrm { I } } & { \mathrm { Y } } \\ { 0 } & { \mathrm { I } } \end{array} \right] \left[ \begin{array} { c c } { \mathrm { U } - \mathrm { WV } ^ { - 1 } \mathrm { W } ^ { \mathrm { T } } } & { 0 } \\ { 0 } & { \mathrm { V } } \end{array} \right] \left[ \begin{array} { c c } { \mathrm { I } } & { 0 } \\ { \mathrm { Y } ^ { \mathrm { T } } } & { \mathrm { I } } \end{array} \right] \tag{44}
其中Y=WV1Y=WV^{-1}對於可逆矩陣GG
(GHGT)+=GTH+G1(45) \left( \mathrm { GHG } ^ { \mathrm { T } } \right) ^ { + } = \mathrm { G } ^ { - \mathrm { T } } \mathrm { H } ^ { + } \mathrm { G } ^ { - 1 } \tag{45}
根據公式(45)則有:
ΣP=(JTΣX1J)+=[XXYYTXYTXY+V1](46) \Sigma _ { \mathbf { P } } = \left( \mathbf { J } ^ {\rm T } \Sigma _ { \mathbf { X } } ^ { - 1 } \mathbf { J } \right) ^ { + } = \left[ \begin{array} { c c } { X } & { - X Y } \\ { - Y ^ { \rm T } X } & { Y ^ { \rm T } X Y + V ^ { - 1 } } \end{array} \right] \tag{46}
這裏X=(UWV1WT)+\rm X=(U-WV^{-1}W^T)^{+}.

通常的算法框架如下圖:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-6XMEX98a-1582200908843)(img/最小二乘優化/1547733246804.png)]

稀疏形式

  • 第一種稀疏形式是由於,一些點並不是每一幀都可以被觀測到的。就有一些觀測xijx_{ij}是零。導致對應的Aij,Bij,Σxij1,Wij,YijA_{ij}, B_{ij}, \Sigma^{-1}_{x_{ij}}, W_{ij}, Y_{ij}都是零。

  • 第二種是帶狀結構。

Sjk=iWijVi1WikT if jk(47) \mathrm { S } _ { j k } = - \sum _ { i } \mathrm { W } _ { i j } {\rm V}^{\rm -1}_i\mathrm { W } _ { i k } ^ { \mathrm { T } } \text { if } j \neq k \tag{47}

如果點是被連續跟蹤幾幀的情況下,則(47)式是帶狀結構的,因爲只有WijW_{ij}WikW_{ik}同時非零的情況下,即第ii個點被jjkk兩幀同時觀測到,這樣SjkS_{jk}纔是非零的。因此這個舒爾布矩陣往往是帶狀的。

如果在重定位和閉環過程中,這種連續就被破壞了,不具有帶狀結構。

對於這種結構可以使用因式分解來求解,如LDLT分解,Cholesky分解,我們安裝的suitSparse或者Chlmod等庫,是加速求解的。

此外還可以使用這種方法求解F矩陣和H矩陣,就看MVG就行了。

魯棒核函數

這種也叫作是M估計,有兩種方式:1. 魯棒核函數作用在殘差平方上;2. 魯棒核函數作用在eTW1e\sqrt{e^TW^{-1}e}上;兩種都能變成權重形式。

狀態估計第5章講的是方法2,我們這裏使用第一種方式(Triggs Correction)爲例:
minx12kρ(fk(x)2)(48) \min _{\mathbf{x}} \frac{1}{2} \sum_{k} \rho\left(\left\|f_{k}(\mathbf{x})\right\|^{2}\right) \tag{48}
誤差平方項記爲sk=fk(x)2s_{k}=\left\|f_{k}(\mathbf{x})\right\|^{2},則公式(48)展開有:
12ρ(s)=12(const+ρΔs+12ρΔs2)(49) \frac{1}{2} \rho(s)=\frac{1}{2}\left(\mathrm{const}+\rho^{\prime} \Delta s+\frac{1}{2} \rho^{\prime \prime} \Delta s^{2} \right) \tag{49}

Δsk=fk(x+Δx)2fk(x)2fk+JkΔx2fk(x)2=2fkJkΔx+(Δx)JkJkΔx(50) \begin{aligned} \Delta s_{k} &=\left\|f_{k}(\mathbf{x}+\Delta \mathbf{x})\right\|^{2}-\left\|f_{k}(\mathbf{x})\right\|^{2} \\ & \approx\left\|f_{k}+\mathbf{J}_{k} \Delta \mathbf{x}\right\|^{2}-\left\|f_{k}(\mathbf{x})\right\|^{2} \\ &=2 f_{k}^{\top} \mathbf{J}_{k} \Delta \mathbf{x}+(\Delta \mathbf{x})^{\top} \mathbf{J}_{k}^{\top} \mathbf{J}_{k} \Delta \mathbf{x} \end{aligned} \tag{50}

將公式(50)帶入到公式(49),並且忽略三次以上的項:
12ρ(s)12(ρ[2fkJkΔx+(Δx)JkJkΔx]+12ρ[2fkJkΔx+(Δx)JkJkΔx]2+ const )ρfkJkΔx+12ρ(Δx)JkJkΔx+ρ(Δx)JkfkfkJkΔx+const=ρfkJkΔx+12(Δx)Jk(ρI+2ρfkfk)JkΔx+const(51) \begin{aligned} \frac{1}{2} \rho(s) \approx & \frac{1}{2}\left(\rho^{\prime}\left[2 f_{k}^{\top} \mathbf{J}_{k} \Delta \mathbf{x}+(\Delta \mathbf{x})^{\top} \mathbf{J}_{k}^{\top} \mathbf{J}_{k} \Delta \mathbf{x}\right]\right.\\ &+\frac{1}{2} \rho^{\prime \prime}\left[2 f_{k}^{\top} \mathbf{J}_{k} \Delta \mathbf{x}+(\Delta \mathbf{x})^{\top} \mathbf{J}_{k}^{\top} \mathbf{J}_{k} \Delta \mathbf{x}\right]^{2}+\text { const } ) \\ \approx & \rho^{\prime} f_{k}^{\top} \mathbf{J}_{k} \Delta \mathbf{x}+\frac{1}{2} \rho^{\prime}(\Delta \mathbf{x})^{\top} \mathbf{J}_{k}^{\top} \mathbf{J}_{k} \Delta \mathbf{x}+\rho^{\prime \prime}(\Delta \mathbf{x})^{\top} \mathbf{J}_{k}^{\top} f_{k} f_{k}^{\top} \mathbf{J}_{k} \Delta \mathbf{x}+c o n s t \\=& \rho^{\prime} f_{k}^{\top} \mathbf{J}_{k} \Delta \mathbf{x}+\frac{1}{2}(\Delta \mathbf{x})^{\top} \mathbf{J}_{k}^{\top}\left(\rho^{\prime} I+2 \rho^{\prime \prime} f_{k} f_{k}^{\top}\right) \mathbf{J}_{k} \Delta \mathbf{x}+c o n s t \end{aligned} \tag{51}
對公式(51)求和,然後寫成正規方程的形式(求導得0):
kJk(ρI+2ρfkfk)JkΔx=kρfkJkkJkWJkΔx=knρfkJk(52) \sum_{k} \mathbf{J}_{k}^{\top}\left(\rho^{\prime} I+2 \rho^{\prime \prime} f_{k} f_{k}^{\top}\right) \mathbf{J}_{k} \Delta \mathbf{x}=-\sum_{k} \rho^{\prime} f_{k}^{\top} \mathbf{J}_{k} \\ \sum_{k} \mathbf{J}_{k}^{\top} W \mathbf{J}_{k} \Delta \mathbf{x}=-\sum_{k}^{n} \rho^{\prime} f_{k}^{\top} \mathbf{J}_{k} \tag{52}
柯西魯棒函數定義爲:
ρ(s)=c2log(1+sc2)(53) \rho(s)=c^{2} \log \left(1+\frac{s}{c^{2}}\right) \tag{53}
其中c爲控制參數。對s的一階二階導爲:
ρ(s)=11+sc2,ρ(s)=1c2(ρ(s))2(54) \rho^{\prime}(s)=\frac{1}{1+\frac{s}{c^{2}}}, \qquad \rho^{\prime \prime}(s)=-\frac{1}{c^{2}}\left(\rho^{\prime}(s)\right)^{2} \tag{54}
其中控制函數c的設定,根據正態分佈的95%:

  • 如果殘差符合正態分佈,Huber c = 1.345,Cauchy c = 2.3849.
  • 如果殘差不是正態分佈,則使用median absolute residual估計殘差方差,然後對殘差進行歸一化

σ=1.482med(med(r)ri)(55) \sigma=1.482 \cdot \operatorname{med}\left(\operatorname{med}(r)-r_{i}\right) \tag{55}

估計誤差尺度的方法,當作標準差,對殘差歸一化用(參考rpg_vikit):

estimates scale by fitting a t-distribution to the data with the given degrees of freedom

estimates scale by computing the median absolute deviation

estimates scale by computing the standard deviation

float NormalDistributionScaleEstimator::
compute(std::vector<float>& errors) const
{
  const float mean = std::accumulate(errors.begin(), errors.end(), 0)/errors.size();
  float var = 0.0;
  std::for_each(errors.begin(), errors.end(), [&](const float d) {
      var += (d - mean) * (d - mean);
  });
  return std::sqrt(var); // return standard deviation
}

// 因爲MAD是比樣本方差或標準差更穩健的量表估計,所以對於沒有均值或方差的分佈,它更好
//* 對於正態分佈來說係數是1.4826來估計標準差, 參考https://en.wikipedia.org/wiki/Median_absolute_deviation
const float MADScaleEstimator::NORMALIZER = 1.48f; // 1 / 0.6745
float MADScaleEstimator::
compute(std::vector<float>& errors) const
{
  // error must be in absolute values!
  return NORMALIZER * vk::getMedian(errors);
}

關於魯棒核函數的代碼也可以參考 rpg_vikit

未來

此外就是使用isam和isam2這種增量式的求解公式(34)的問題,由於其利用稀疏性速度較快,需要排序來保證稀疏性,對應之前講的排列矩陣。而滑動窗口式的則由於邊緣化掉一些點,導致矩陣變得稠密不在具有稀疏形式,求解較慢。DSO是直接把這些fill-in置爲0.

在SfM中還使用迭代Schur和Precondition Conjugate Gradient共軛梯度法,這種算法的思想是在每個子空間內分別求解。在SLAM中用的不多,維度沒有SfM大,只要order做的好不需要共軛梯度。

問題(胡言論語部分)

1. Sliding Window和Co-Visibility

滑窗的是把舊幀邊緣化掉,以一定的概率加到優化中,先驗是可能正確的。當前的最小二乘項和先驗項互相約束,得到最優解。

co-visibility的方式是把大的窗口外的3D點固定,相當於fix,這樣後面的狀態變得可觀了。相當於假設先驗是一定正確的。

從概率方式理解:
p(a,b)=p(ab)p(b) p(a,b)=p(a|b)p(b)
滑窗相當於p(b)p(b)是小於1概率,而co-visibility是假設p(b)=1p(b)=1的。

2. 直接法的像素差符合t分佈

統計了直接法中的亮度誤差是符合t分佈(student分佈)的,而不是像特徵點那樣符合高斯分佈的。

特徵點符合高斯分佈是和提取中的過程有關,使用高斯核來計算,在附近取一個圓形區域。需要詳細研究下。

發佈了16 篇原創文章 · 獲贊 43 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章