第4章 后端优化与图优化:最小二乘、LM算法、信息矩阵、边缘化

本章聚焦 后端优化是SLAM系统的核心,面试高频覆盖:非线性最小二乘、Levenberg-Marquardt(LM)算法、信息矩阵与边缘化(Schur补)。大厂面试侧重推导完整性与工程实现细节,如稀疏代数库选择、H矩阵加速、掉边处理等。
问题定位 最优化形式 核心推导 雅可比/H矩阵/阻尼 工程实现 稀疏求解/增量策略 信息矩阵边缘化 Schur补/滑窗 总结论述
面试问题1:请推导非线性最小二乘迭代求解过程(高斯-牛顿与LM),并说明LM阻尼项的作用。
考察点基础数学推导熟练度;对LM自适应阻尼的理解;能扩展到SLAM后端。
回答框架1. 误差函数线性化 → 2. 构建Hessian近似 → 3. 求解增量(G-N: HΔx = b;LM: (H+λI)Δx = b) → 4. 阻尼λ自适应:λ增大退化为梯度下降,λ减小接近G-N → 5. 实际SLAM中常用Levenberg-Marquardt + 信赖域。
简短示例回答“非线性最小二乘通过泰勒展开线性化误差函数,GN直接取H=JᵀJ,但H非正定时易发散。LM引入阻尼λI,使增量方向在梯度下降与GN之间插值。λ通过实际下降量/预测下降量自适应调整,确保收敛。SLAM后端中使用稀疏LM求解,如g2o、Ceres。”
可能追问H矩阵不满秩怎么处理?阻尼λ更新策略有哪些?信赖域法与LM区别?
避坑提醒勿混淆LM与GN推导;强调H正定性和稀疏性;提到具体工程实现(如Ceres的WHICH algorithm)。
面试问题2:信息矩阵在SLAM后端优化中的意义?如何通过边缘化(Marginalization)移除旧状态?
考察点概率图模型理解;Schur补操作;滑窗优化与先验保持。
回答框架1. 信息矩阵Λ = H = JᵀΩJ,反映变量间约束精度 → 2. 边缘化:将需要移除的状态与其他状态按块分块 → 3. 用Schur补Λ₂₂' = Λ₂₂ - Λ₂₁Λ₁₁⁻¹Λ₁₂,得到剩余状态的新信息矩阵(密度变高) → 4. 工程上用滑动窗口+先验因子保持历史约束。
简短示例回答“信息矩阵Λ是协方差Σ的逆,表示变量间条件独立程度。边缘化通过Schur补保留被移除变量对其他变量的约束,使剩余状态的优化仍能继承历史信息。例如在VINS-Mono中,边缘化时计算先验残差并冻结雅可比线性化点,避免不连续。
可能追问为什么要冻结线性化点?边缘化带来的fill-in如何应对?FEJ(First Estimate Jacobians)原理?
避坑提醒需要区分边缘化与舒尔消元(Schur Elimination,用于稀疏求解时的加速,如ORB-SLAM)。
面试问题3:请描述一个核心工程细节:增量方程求解时如何利用稀疏性加速?(例如H矩阵的块结构)
考察点对SLAM稀疏求解库的实现理解;内存与CPU优化意识。
回答框架1. 图优化Hessian矩阵为块箭状(Block Arrow)或带状 → 2. 采用Schur Complement先消去路标点变量(Landmark),降低求解维度 → 3. 对相机位姿块用稠密Cholesky求解,回代得路标增量 → 4. 利用稀疏Cholesky分解(如SuiteSparse/CHOLMOD)或共轭梯度法(如Ceres的IterativeSchur) → 5. 缓存重用、并行计算。
简短示例回答“SLAM后端H矩阵由相机-路标误差组成,块结构明显。采用舒尔消元先解位姿变量:H₂₂⁻¹将路标相关项移到右边,剩下位姿方程规模小且稠密。再用CHOLMOD做稀疏Cholesky分解,回代得路标。Ceres的'Schur'求解器正是利用此结构,比直接求解快一个数量级。”
可能追问舒尔消元与边缘化区别?多传感器系统中H矩阵结构如何变化?如何选择预处理器?
避坑提醒注意舒尔消元是数值技术,边缘化是概率操作;大场景时需使用增量式求解(如iSAM2)

核心概念速查表

概念数学形式面试高频点常见工程工具
高斯-牛顿HΔx = b,H=JᵀJ推导、H正定性、易发散Eigen, Ceres默认求解器
LM算法(H+λdiag(H))Δx = b阻尼自适应、信赖域Ceres::LEVENBERG_MARQUARDT
信息矩阵Λ = JᵀΩJ与协方差关系、条件独立g2o中的Marginalize操作
Schur补边缘化Λ'₂₂ = Λ₂₂ - Λ₂₁Λ₁₁⁻¹Λ₁₂先验保持、fill-in控制VINS-Mono, OKVIS
稀疏加速舒尔消元 + 稀疏Cholesky块结构、回代、增量更新SuiteSparse, CHOLMOD, iSAM2贝叶斯树
项目实战提示:如果你是面试的“高T(高级技术)”岗,准备一个真实后端优化项目案例,例如多传感器融合滑窗后端。可迁移回答模板:项目规模(10+相机,每帧500路标),技术栈(Ceres + Eigen + SuiteSparse),核心难点(边缘化线性化点选择、实时性要求)。表明你既懂理论又能落地代码。