舒尔补 / 稀疏性 (Schur complement / Sparsity)

光束法平差乍看起来难以处理:一个有 mm 个关键帧和 nn 个地图点的适中规模地图,未知数个数为 6m+3n6m + 3n,而 nn 轻易就能达到数十万。使其变得可行的原因是这个问题具有稀疏性,而**舒尔补(Schur complement)**正是利用这种稀疏性的技巧。

稀疏性从何而来。 每一个重投影误差项只涉及一个位姿和一个地图点。因此,在高斯-牛顿正规方程 HΔx=bH \Delta\mathbf{x} = -\mathbf{b}(其中 H=JTJH = J^T J)中,Hessian矩阵具有箭头状的分块结构

H=[BEETC]H = \begin{bmatrix} B & E \\ E^T & C \end{bmatrix}

其中 BB6m×6m6m \times 6m)只耦合位姿,CC3n×3n3n \times 3n)只耦合地图点,而 EE 保存位姿-地图点之间的耦合关系。关键之处在于,两个地图点绝不会出现在同一个残差项中,因此 CC块对角的——每个地图点对应一个独立的 3×33 \times 3 块。

舒尔补步骤(也称为边缘化掉地图点)从线性系统中消去地图点变量,留下简化后的相机系统:

(BEC1ET)Δxcam=bcam+EC1bpts\left(B - E C^{-1} E^T\right) \Delta\mathbf{x}_{\text{cam}} = -\mathbf{b}_{\text{cam}} + E C^{-1} \mathbf{b}_{\text{pts}}

由于 CC 是块对角的,求 C1C^{-1} 几乎不花代价(对每个 3×33 \times 3 块分别求逆即可)。求解 6m×6m6m \times 6m 的简化系统得到位姿更新量,然后通过回代独立地恢复每个地图点的更新量。一个 (6m+3n)(6m + 3n) 维的求解就变成了 6m6m 维的求解——当 nmn \gg m(这总是成立)时,速度提升几个数量级。

实践中还有两层额外的稀疏性值得关注。第一,简化后的相机矩阵 BEC1ETB - EC^{-1}E^T 本身也是稀疏的:条目 (i,j)(i, j) 非零仅当关键帧 iijj 观测到共同的地图点(即共视结构),因此配合良好的变量排序(COLAMD)的稀疏Cholesky分解可以应用于此。第二,同样的消元视角可以推广:在因子图术语中,舒尔补正是变量消元,这正是滑动窗口VIO和iSAM2等增量式平滑器中边缘化操作的底层原理。

公式从何而来

舒尔补并没有什么神秘之处,它不过是分块高斯消元。写出正规方程的两个分块行:

BΔxcam+EΔxpts=bcamB\,\Delta\mathbf{x}_{\text{cam}} + E\,\Delta\mathbf{x}_{\text{pts}} = -\mathbf{b}_{\text{cam}} ETΔxcam+CΔxpts=bptsE^T \Delta\mathbf{x}_{\text{cam}} + C\,\Delta\mathbf{x}_{\text{pts}} = -\mathbf{b}_{\text{pts}}

从第二行解出地图点更新量 Δxpts=C1(bpts+ETΔxcam)\Delta\mathbf{x}_{\text{pts}} = -C^{-1}\left(\mathbf{b}_{\text{pts}} + E^T \Delta\mathbf{x}_{\text{cam}}\right),并代入第一行——上面的简化相机系统立即出现,而同一个表达式在求出 Δxcam\Delta\mathbf{x}_{\text{cam}} 之后就是回代规则。从统计角度看,简化后的系统正是相机变量边缘分布的信息矩阵形式:消去地图点并不是任何近似,而是对同一个高斯分布的精确重新表达。

计算量对比。 直接稠密求解整个系统的代价是 O((6m+3n)3)O((6m + 3n)^3)。使用舒尔技巧:求 CC 的逆是 nn 次独立的 3×33\times 3 求逆(O(n)O(n)),构造简化系统的代价受观测数量约束,剩余求解的最坏情况是 O((6m)3)O((6m)^3)——通常由于共视稀疏性远低于此。当 mm 为数百、nn 为数十万时,消去地图点的差异就是毫秒和分钟之间的区别。当 mm 本身变大时(城市级SfM),即使简化后的系统也不再便宜,求解器会转向迭代方法(对舒尔补做预条件共轭梯度——Ceres的 ITERATIVE_SCHUR)。

在Ceres中,所有这些只需一个配置选项:

ceres::Solver::Options options;
options.linear_solver_type = ceres::SPARSE_SCHUR;  // or DENSE_SCHUR, ITERATIVE_SCHUR

求解器会自动检测位姿/地图点的消元顺序(或者接受显式的 ParameterBlockOrdering)。每一个正式的求解器——Ceres、g2o、GTSAM——都实现了同样的技巧;理解它可以解释为什么BA能够扩展、为什么边缘化旧状态会在剩余Hessian中产生填充项(稠密块),以及为什么求解器选择和排序会导致运行时间相差几个数量级。

常见陷阱

对SLAM的意义

实时SLAM之所以存在,正是因为有利用结构的线性代数:如果没有舒尔补,即使只有几百个关键帧的光束法平差也是无望的。同样的思想——消去变量、保持问题稀疏——在边缘化、滑动窗口估计器和增量式平滑中反复出现,因此这是整个路线图中收益最高的数学知识点之一。

相关条目