Ceres Solver 官方教程学习笔记(十三)——非线性最小二乘问题的解算Solving Non-linear Least Squares (上)

介绍

如果想要高效地使用Ceres Solver,需要掌握一定的非线性最小二乘解算基础知识。所以在这一部分将将要介绍Ceres中核心优化算法的工作原理。

x R n 是一个 n 维向量,并且 F ( x ) = [ f 1 ( x ) , . . . , f m ( x ) ] 是关于 x n 维方程。那么我们关注下列优化问题

(1) arg min x 1 2 F ( x ) 2   . L x U

其中 L U 分别是参数向量 x 的下限和上限。

arg min 就是使后面这个式子达到最小值时的变量的取值

因为对一个一般的函数(1),求解全局最小值常常非常棘手。我们不得不关注局部最小值。 F ( x ) 的雅可比矩阵 J ( x ) 是一个 m × n 的矩阵,其中 J i j ( x ) = j f i ( 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 。那么上述问题就变成下列问题。

(2) min Δ x 1 2 F ( x ) + J ( x ) Δ x 2

这里官方教程跳了几步。要求全局最小值非常棘手,所以转而求局部最小值。而求局部最小值就是,从一个任意的起始点,观测四周的“更小值”。如果观测四周都比当前点大,那么当前点就是局部最小值点,算法达到收敛。否则,设这个新找到的最小值点为“当前点”,重复这一步骤。这也就是下文中“ x x + Δ x 来更新”的含义。
所以现在问题变成了,如何求解四周的点的值。即,给 x 赋予一个步长 Δ x ,观察周围的 F ( x + Δ x ) ,并且寻找其中的最小值。
至于为什么不直接求 F ( x + Δ x ) 而是求 F ( x ) + J ( x ) Δ x ,也就是为什么要线性化。是因为非线性函数不可微或者不连续等原因。。

不幸的是,简单地求解这个简化方程,并且用 x x + Δ x 来更新会导致算法难以达到收敛。为了获得一个收敛算法,我们需要控制步长 Δ x 。根据步长的控制方法,非线性优化算法可以分成两大类。

  • 置信域法Trust Region (也有文献成为信任域法)置信域方法在搜索空间的子集内应用模型函数(通常是二次方程)来近似目标函数,这个空间被称为置信域。如果模型函数成功地使真正的目标函数最小化,则扩大置信域。否则收缩置信域并且再次尝试求解模型函数的优化问题。
  • 线搜索法Line Search 线搜索方法首先找到一个下降的方向,目标函数将沿其下降。然后再确定步长,从而决定沿该方向到底移动多远。 下降方向可以通过各种方法计算,如梯度下降法、牛顿法和拟牛顿法。步长可以精确或不精确地确定。

在某些意义下,两种方法是相通的。置信域法首先选择一个步长(置信域大小),然后选择一个步进方向。而线搜索法首先选择一个步进方向,然后选择一个步长。

置信域法Trust Region

这个算法的基本思路如下:

  1. 给定一个初始点 x 和置信域半径 μ
  2. 求解:
    arg min Δ x 1 2 J ( x ) Δ x + F ( x ) 2 such that D ( x ) Δ x 2 μ L x + Δ x U .
  3. ρ = F ( x + Δ x ) 2 F ( x ) 2 J ( x ) Δ x + F ( x ) 2 F ( x ) 2
  4. 如果 ρ > ϵ ,那么 x = x + Δ x
  5. 如果 ρ > η 1 ,那么 μ = 2 μ
  6. 如果 ρ < η 2 ,那么 μ = 0.5 μ
  7. 回到第二步。

这里 D ( x ) 是用于定义 F ( x ) 域的度量的矩阵。 ρ 用于评估步长 Δ x 的质量,也就是说这个线性模型对非线性目标函数下降程度的预测准确性。根据线性模型对非线性目标函数的预测准确性,我们可以确定到底是增加还是减少置信域的半径。这个反过来反映在 ρ 值中。

置信域算法中的关键步骤是正是下面这个约束优化问题的求解。

(3) arg min Δ x 1 2 J ( x ) Δ x + F ( x ) 2 such that D ( x ) Δ x 2 μ L x + Δ x U .

求解这个问题有很多不同的方法,每种方法都有不同的生成置信域的方法。目前,Ceres实施了两种置信域算法,即Levenberg-Marquardt和Dogleg。如果存在边界约束,这两种算法都可以使用线搜索增强性能(原理详见C. Kanzow, N. Yamashita and M. Fukushima, Levenberg–Marquardt methods with strong local convergence properties for solving nonlinear equations with convex constraints, Journal of Computational and Applied Mathematics, 177(2):375–397, 2005.)。用户可以通过设置Solver::Options::trust_region_strategy_type来在两者之间进行设置。

Levenberg-Marquardt算法

Levenberg-Marquardt算法是解决非线性最小二乘问题的最流行的算法。这个算法也是第一个置信域算法。(具体见K. Levenberg, A method for the solution of certain nonlinear problems in least squares和D.W. Marquardt, An algorithm for least squares estimation of nonlinear parameters)Ceres使用精确和非精确两种方法求解步长(K. Madsen, H.B. Nielsen, and O. Tingleff, Methods for nonlinear least squares problems 和 S. J. Wright and J. N. Holt, An Inexact Levenberg Marquardt Method for Large Sparse Nonlinear Least Squares和S.G. Nash and A. Sofer, Assessing a search direction within a truncated newton method

可以证明,上面问题(3)的可以通过下面这个非约束优化问题求解:

arg min Δ x 1 2 J ( x ) Δ x + F ( x ) 2 + λ D ( x ) Δ x 2

其中 λ 是与 μ 负相关的拉格朗日算子。在Ceres中,计算的是下列表达式:
(4) arg min Δ x 1 2 J ( x ) Δ x + F ( x ) 2 + 1 μ D ( x ) Δ x 2

其中,矩阵 D ( x ) 是非负对角矩阵,是矩阵 J ( x ) J ( x ) 的对角线的平方根。

在继续之前,让我们做一些符号简化。 我们假设矩阵 1 μ D 连接在矩阵 J 的底部。并且同样的在向量 f 的底部添加了一个零向量。下面的讨论将以 J f 来表示, 即线性最小二乘问题。

(5) min Δ x 1 2 J ( x ) Δ x + f ( x ) 2 .

Levenberg-Marquardt算法对求解(5)在每次迭代中是Ceres中的主要计算负载。 为解决这个问题(5),Ceres提供了许多不同的选项。 这些方法主要分成两种——因式分解和迭代。

因式分解方法主要基于用Cholesky或者QR法进行因式分解来对(4)进行精确求解。但是对于(1),并不必要对每一个(4)精确求解。其实(4)本身就是(2)的正则化版本。的确,有可能构建非线性优化算法,其中线性化问题近似解决。这些算法被称为不精确牛顿或截断牛顿法(J. Nocedal & S. Wright, Numerical Optimization)。

不精确牛顿法需要两个“原料”。第一,一个低花费的线性方程组的近似求解算法。通常,迭代线性求解算法如共轭梯度法(Conjugate Gradients)就是用于这个目的的。第二,迭代器的中止条件。一个典型的终止条件是如下这种形式:

(6) H ( x ) Δ x + g ( x ) η k g ( x ) .

这里, k 表示Levenberg-Marquardt迭代次数。 0 < η k < 1 被称为强迫序列(forcing sequences)。S. J. Wright 和 J. N. Holt在 An Inexact Levenberg Marquardt Method for Large Sparse Nonlinear Least Squares 证明了,基于(6)的不精确牛顿步长的截断Levenberg-Marquardt算法对于任意序列 η k η 0 < 1 收敛,收敛速度取决于强迫序列 η k 的选择。

Ceres支持精确和不精确的步长解决策略。 当用户选择一个基于因式分解的线性求解器时,将使用精确步长的Levenberg-Marquardt算法。 当用户选择迭代线性求解器时,使用Levenberg-Marquardt算法的不精确步长。

Dogleg狗腿算法

解决置信域问题的另一个方法是M. J. D. Powell提出的。其核心思路是计算两个向量:

Δ x Gauss-Newton = arg min Δ x 1 2 J ( x ) Δ x + f ( x ) 2 . Δ x Cauchy = g ( x ) 2 J ( x ) g ( x ) 2 g ( x ) .

注意,向量 Δ x Gauss-Newton 是(2)的解。如果沿着梯度方向移动,则该向量 Δ x Cauchy 将线性逼近最小化。Dogleg算法找出由 Δ x Gauss-Newton Δ x Cauchy 定义的向量 Δ x ,并且用这个向量解置信域问题。Ceres提供了两种具体方法,并且可以通过Solver::Options::dogleg_type来进行设置。

TRADITIONAL_DOGLEG由Powell提出的。这个方法用 Δ x Gauss-Newton Δ x Cauchy 建立了两个线段。并且找到位于置信域范围中的,沿这个线段组最远的点。更多详细的证明和计算请看Madsen等的文章Methods for nonlinear least squares problems

SUBSPACE_DOGLEG是一种更复杂的方法。这个方法观察由这两个向量确定的二维子空间,并找到该子空间中的使置信域问题最小化的点,见R.H. Byrd, R.B. Schnabel, 和 G.A. Shultz, Approximate solution of the trust region problem by minimization over two dimensional subspaces

Dogleg优于Levenberg-Marquardt的主要优点是:如果特定选择的 μ 的步长计算没有让目标函数值充分下降,那么Levenberg-Marquardt会从头开始用一个更小的 μ 值进行线性逼近;另一方面,Dogleg只需要计算Gauss-Newton和Cauchy向量之间的插值,因为它们都不依赖于 μ 。Dogleg法只能用于基于因式分解的线性求解器。

Inner Iterations内迭代

一些非线性最小二乘问题在参数块交互的方式中具有额外的结构,有利于修正计算置信域步长的方法。例如,考虑下面的回归问题

y = a 1 e b 1 x + a 2 e b 3 x 2 + c 1

给定一组 { ( x i , y i ) } ,用户希望估计 a 1 a 2 b 1 b 2 c 1

通过观察可以发现, a 1 a 2 是线性的。如果给定了 b 1 b 2 c 1 的值,那么就可以用线性回归的方法来估计 a 1 a 2 的最优值。对于如此的可以分解成子问题的最小二乘问题,最著名的求解算法是由Golub & Pereyra发明的变量投影算法(Variable Projection algorithm)。参阅G.H. Golub and V. Pereyra, The differentiation of pseudo-inverses and nonlinear least squares problems whose variables separate

在缺少数据的矩阵分解问题中也存在类似的结构。这类问题对应的算法称为Wiberg算法。T. Wiberg, Computation of principal components when data are missing。Ruhe&Wedin提出了用于求解可分离的非线性最小二乘问题的各种算法的分析,并且在他们的论文Algorithms for separable nonlinear least squares problems中将可变投影称为算法I。实现可变投影算法是单调而高成本的。 Ruhe和Wedin提出了一种简单的具有可比较收敛特性的算法,他们称之为算法II。 算法II执行一个额外的优化步骤,以在成功地计算牛顿步长之后精确估计 a 1 a 2

这个想法可以推广到 a 1 a 2 非线性的情况,即

y = f 1 ( a 1 , e b 1 x ) + f 2 ( a 2 , e b 3 x 2 + c 1 )

在这种情况下,我们解决了置信域步长地问题,然后将其作为起始点,进一步优化 a 1 a 2 。 对于线性情况,这相当于做单线性最小二乘解。 对于非线性情况,任何用于求解 a 1 a 2 优化问题的方法都可以。 对 a 1 a 2 (如果它们是两个不同的参数块)的唯一约束是它们不会在残余块中共现。

除了优化 ( a 1 , a 2 ) 之外,通过将与Hessian矩阵的稀疏结构相对应的图分解成非重叠的独立集,并且一一优化它们,可以进一步推广该思想。

Solver::Options::use_inner_iterations设为True,可以启用Ruhe & Wedin的非线性推广的算法II。这个版本的Ceres具有更高的迭代复杂度,但是每次迭代都显示更好的收敛行为。把Solver::Options::num_threads设为最大值是非常值得推荐的。

非单调步长Non-monotonic Steps

注意,在上一部分中描述的基本置信域算法是一种下降算法,这个算法只接受那些严格降低目标函数值的最优点。放宽这个要求可以使算法在长期内更有效率,但代价是目标函数的某些局部增加。放宽这个要求可以使算法在长期内更有效率,但代价是目标函数的某些局部增加。

这是因为,允许非严格递减的目标函数值意味着允许算法跳过“巨石”,因为该方法不会排除在狭窄的”谷”中移动,同时保持其收敛属性这种情况。将Solver :: Options :: use_nonmonotonic_steps设置为True将启用由Conn,Gould和Toint发明的非单调置信域算法。(A.R. Conn, N.I.M. Gould, and P.L. Toint, Trust region methods

即使目标函数的值可能大于在优化过程中遇到的最小值,但返回给用户的最终参数是与所有迭代中的最小代价(Cost)相对应的参数。采取非单调步骤的选项use_nonmonotonic_steps适用于所有置信域策略。

线搜索Line Search Methods

Ceres Solver中的线搜索方法现在尚且无法处理带约束问题,而只能用于解决不受约束的问题。

线搜索算法步骤如下:

  1. 给定起始点 x
  2. Δ x = H 1 ( x ) g ( x )
  3. arg min μ 1 2 F ( x + μ Δ x ) 2
  4. x = x + μ Δ x
  5. 跳到第2步。

这里 H ( x ) 时目标函数Hessen矩阵的近似矩阵。 g ( x ) x 点附近的梯度。根据 H ( x ) 的不同选择,我们可以得到许多不同的搜索方向 Δ x 。第4步是沿着搜索方向 Δ x 的一维优化问题,或者说线搜索。这也就是此算法名的由来。

根据搜索方向的选择算法和之后沿着搜索方向进行一维优化的方法,线搜索这一算法被分成不同的子类。 H ( x ) 是线搜索算法的主要计算负载。目前,Ceres提供了三种确定搜索方向的方法,它们都为解决大规模问题而设计。

  1. STEEPEST_DESCENT 这一算法设定 H ( x ) 矩阵为单位矩阵。除了最简单的问题之外,这不是一个合适的的搜索方向选择算法。它的存在只是为了完整框架体系。
  2. NONLINEAR_CONJUGATE_GRADIENT是共轭梯度法在非线性问题中的推广。推广的具体方法又许多,从而导致了不同的搜索方向。Ceres目前支持FLETCHER_REEVESPOLAK_RIBIEREHESTENES_STIEFEL等推广方法。
  3. BFGS将Secant方法推广到多维,其中保持对逆Hessian矩阵的完全密集近似,并用于计算拟牛顿步长,详见NocedalWright的论文Numerical Optimization, Springer, 2004. 。 BFGS是目前最知名的通用拟牛顿算法。
  4. LBFGS对完整BFGS算法进行近似,从而限制存储空间。其中最后的M次迭代用于近似Hessen矩阵的逆矩阵。该逆矩阵用于计算拟牛顿法的步长。见J. Nocedal, Updating Quasi-Newton Matrices with Limited Storage, Mathematics of Computation, 35(151): 773–782, 1980.R. H. Byrd, J. Nocedal, R. B. Schanbel, Representations of Quasi-Newton Matrices and their use in Limited Memory Methods, Mathematical Programming 63(4):129–-156, 1994.

目前,Ceres Solver支持基于回溯和插值的Armijo线搜索算法,以及分段/缩放插值(强)Wolfe条件线搜索算法。 但是,请注意,为了保证BFGS和LBFGS方法满足使用条件,应使用Wolfe线搜索算法。

线性解算器LinearSolover

回想一下,在上一篇文章中的两种置信域算法中,关键的计算成本是以下形式的线性最小二乘问题:

(7) min Δ x 1 2 J ( x ) Δ x + f ( x ) 2 .

H ( x ) = J ( x ) J ( x ) g ( x ) = J ( x ) f ( x ) 。为了标记方便,我们舍弃对 x 的依赖” ( x ) ”。 那么很容易看出求解(7)等价于求解Normal Equation方程。

(8) H Δ x = g .

Ceres提供了很多计算方程(8)的方法。

DENSE_QR
对于使用密集雅可比矩阵的小规模问题(几百个参数和几千个残差),DENSE_QR是一个合适的方法(详见A. Bjorck, Numerical Methods for Least Squares Problems, SIAM, 1996)。令 J = Q R 是雅可比矩阵 J 的QR分解,其中 Q 是一个正交矩阵, R 是一个上三角矩阵。(详见J. Tenenbaum & B. Director, How Gauss Determined the Orbit of Ceres.)那么,方程(8)的解可以以如下形式给出:

Δ x = R 1 Q f

Ceres使用Eigen库的密集矩阵QR分解方法。

DENSE_NORMAL_CHOLESKY & SPARSE_NORMAL_CHOLESKY
大规模的非线性最小二乘问题通常是稀疏的。对于这种情况使用密集QR分解是低效率的。令 H = R R 作为方程(8)的Cholesky因式分解。其中 R 是上三角矩阵,那么方程(8)的解如下

Δ x = R 1 R g .

细心的读者会注意到, H 矩阵的Cholesky因式分解中的 R J 矩阵的QR分解中的上三角矩阵 R 是相同的。由于 Q 是正交矩阵, J = Q R 意味着 J J = R Q Q R = R R 。 Cholesky分解有两种变体 - 稀疏和密集。

DENSE_NORMAL_CHOLESKY
顾名思义就是执行正态方程的密集Cholesky分解。 Ceres使用Eigen密集的LDLT因式分解算法。

SPARSE_NORMAL_CHOLESKY
顾名思义就是执行Normal Equation方程的稀疏Cholesky分解。 这为大量稀疏问题节省了大量的时间和内存消耗。 Ceres使用Tim Davis的SuiteSparseCXSparse库中的稀疏Cholesky分解算法或Eigen中的稀疏Cholesky分解算法。

CGNR
对于一般稀疏问题,如果CHOLMOD的问题太大,或者稀疏线性代数库没有链接到Ceres中,则另一个选项是CGNR求解器。 该求解器在法向方程上使用共轭梯度求解器,但没有明确地构建Normal Equation方程。 它利用下列关系:

H x = J J x = J ( J x )

共轭梯度的收敛取决于调节器数量 κ ( H ) 。 通常 H 的条件比较弱,并且必须使用预处理器才能获得合理的性能。 目前只有JACOBI预处理器可用于CGNR。 它使用 H 的块对角线来预处理normal equation方程。

有点难,不太理解
Currently only the JACOBI preconditioner is available for use with CGNR. It uses the block diagonal of H to precondition the normal equations.

当用户选择CGNR作为线性求解器时,Ceres会自动从精确的步长算法切换到不精确的步长算法。

DENSE_SCHUR & SPARSE_SCHUR

尽管可以使用SPARSE_NORMAL_CHOLESKY来解决bundle adjustment(BA)问题,但BA问题有一个特殊的结构,并且可以利用这一特殊结构构造一个更高效的解决方案。

假设SfM问题(Structure from motion)由 p 个相机和 q 个点组成,变量矢量 x 具有块结构 x = [ y 1 . . . y p z 1 . . . z q ] 。 其中, y z 分别对应于相机和点参数。 此外,令相机块的大小为 c ,点块的大小为 s (对于大多数问题 c = 6...9 s = 3 )。 Ceres并没有对这些块大小施加任何恒定性要求,但将它们设为常量可以简化说明。

BA问题的关键特征是,不存在包含两个或更多点块的项。反过来,这又意味着矩阵 H 是以下形式:

H = [ B E E C ]   ,

其中矩阵 B R p c × p c 是一个块状稀疏矩阵,其中包含 p 个大小为 c × c 的块。矩阵 C 是一个对角矩阵,其中包含 q 个大小为 s × s 的块。 E R p c × q s 是一个一般的块状稀疏矩阵,对应每一次观测,都包含一个大小为 c × s 的块。让我们用块分区 Δ x = [ Δ y , Δ z ] g = [ v , w ] 来重新描述方程(8),使之变为一个块结构的线性系统。
(10) [ B E E C ] [ Δ y Δ z ] = [ v w ]   ,

然后用高斯法近似它。正如上面提到的, C 是一个块状对角矩阵,包含大小为 s × s 的对角块。因此,通过对每个小块求逆来计算矩阵 C 的逆非常容易。这使我们可以通过观察 Δ z = C 1 w E Δ y 来消除 Δ z ,并得到

(11) [ B E C 1 E ] Δ y = v E C 1 w   .

矩阵

S = B E C 1 E .

是矩阵 H 中矩阵 C 舒尔补。它也被称为减少的相机矩阵,因为参与(11)的唯一变量是与相机对应的变量。 S R p c × p c 是一个块结构对称正定矩阵,包含大小为 c × c 的块。对应图像对 i j 的块 S i j 是非零矩阵,当且仅当两幅图像至少观测到一个共同点。

现在,方程(10)可以通过先构造 S ,解出Δy,然后再把 Δ y 代回方程(10)从而获得 Δ z 的值。藉此,将这个 n × n n = p c + q s 线性系统的解简化为对角矩阵块C的逆、少量矩阵乘矩阵和矩阵乘向量、并求解块 p c × p c 稀疏线性系统(11)。对于大多数情况,相机的个数远远小于点的个数,即 p q 。因此求解(11)明显比求解(10)简单。这就是舒尔补的技巧(详见D. C. Brown, A solution to the general problem of multiple station analytical stereo triangulation, Technical Report 43)。


看来,通过学习官方教程,学习最优化算法的理论并不是个特别好的主意。原文这一部分写的非常拗口,而且深入但不浅出。也许需要学习一些中文的相关教材补补基础。

猜你喜欢

转载自blog.csdn.net/wzheng92/article/details/80008380