介绍
如果想要高效地使用Ceres Solver,需要掌握一定的非线性最小二乘解算基础知识。所以在这一部分将将要介绍Ceres中核心优化算法的工作原理。
设 x∈Rn x ∈ R n 是一个 n n 维向量,并且
是关于 x x 的
维方程。那么我们关注下列优化问题
其中 L L 和 分别是参数向量 x x 的下限和上限。
arg min 就是使后面这个式子达到最小值时的变量的取值
因为对一个一般的函数(1),求解全局最小值常常非常棘手。我们不得不关注局部最小值。 的雅可比矩阵 J(x) J ( x ) 是一个 m×n m × n 的矩阵,其中 Jij(x)=∂jfi(x) J i j ( x ) = ∂ j f i ( x ) (详见雅可比矩阵定义),函数的梯度向量 g(x)=∇12∥F(x)∥2=J(x)⊤F(x) g ( x ) = ∇ 1 2 ‖ F ( x ) ‖ 2 = J ( x ) ⊤ F ( x ) 。
在计算非线性优化问题时的一个通用的策略是,求解原问题的近似简化问题(见NocedalWright的论文J. Nocedal & S. Wright, Numerical Optimization, Springer, 2004.)。(因为原问题太复杂,不可微分或者不连续等。用可微分的,简单的,连续的或者线性的函数来近似求解。)在每一次循环中,根据近似问题的解可以确定向量 x x 的修正值
。对于非线性最小二问题,我们可以通过线性化来建立近似问题,即 F(x+Δx)≈F(x)+J(x)Δx F ( x + Δ x ) ≈ F ( x ) + J ( x ) Δ x 。那么上述问题就变成下列问题。
这里官方教程跳了几步。要求全局最小值非常棘手,所以转而求局部最小值。而求局部最小值就是,从一个任意的起始点,观测四周的“更小值”。如果观测四周都比当前点大,那么当前点就是局部最小值点,算法达到收敛。否则,设这个新找到的最小值点为“当前点”,重复这一步骤。这也就是下文中“用 x←x+Δx x ← x + Δ x 来更新”的含义。
所以现在问题变成了,如何求解四周的点的值。即,给 x x 赋予一个步长 ,观察周围的 F(x+Δx) F ( x + Δ x ) ,并且寻找其中的最小值。
至于为什么不直接求 F(x+Δx) F ( x + Δ x ) 而是求 F(x)+J(x)Δx F ( x ) + J ( x ) Δ x ,也就是为什么要线性化。是因为非线性函数不可微或者不连续等原因。。
不幸的是,简单地求解这个简化方程,并且用 x←x+Δx x ← x + Δ x 来更新会导致算法难以达到收敛。为了获得一个收敛算法,我们需要控制步长 Δx Δ x 。根据步长的控制方法,非线性优化算法可以分成两大类。
- 置信域法Trust Region (也有文献成为信任域法)置信域方法在搜索空间的子集内应用模型函数(通常是二次方程)来近似目标函数,这个空间被称为置信域。如果模型函数成功地使真正的目标函数最小化,则扩大置信域。否则收缩置信域并且再次尝试求解模型函数的优化问题。
- 线搜索法Line Search 线搜索方法首先找到一个下降的方向,目标函数将沿其下降。然后再确定步长,从而决定沿该方向到底移动多远。 下降方向可以通过各种方法计算,如梯度下降法、牛顿法和拟牛顿法。步长可以精确或不精确地确定。
在某些意义下,两种方法是相通的。置信域法首先选择一个步长(置信域大小),然后选择一个步进方向。而线搜索法首先选择一个步进方向,然后选择一个步长。
置信域法Trust Region
这个算法的基本思路如下:
- 给定一个初始点 x x 和置信域半径 。
- 求解:
argminΔxsuch that12∥J(x)Δx+F(x)∥2∥D(x)Δx∥2≤μL≤x+Δx≤U. arg min Δ x 1 2 ‖ J ( x ) Δ x + F ( x ) ‖ 2 such that ‖ D ( x ) Δ x ‖ 2 ≤ μ L ≤ x + Δ x ≤ U . -
ρ=∥F(x+Δx)∥2−∥F(x)∥2∥J(x)Δx+F(x)∥2−∥F(x)∥2 ρ = ‖ F ( x + Δ x ) ‖ 2 − ‖ F ( x ) ‖ 2 ‖ J ( x ) Δ x + F ( x ) ‖ 2 − ‖ F ( x ) ‖ 2