Ceres-Solver学习笔记(8)
接上⼀篇
Solver::Options
class Solver::Options
Solver::Options 整体的控制求解器的⾏为,我们把变量设置和默认值列举如下。
Solver::Options::IsValid
验证选项结构中的值,并在成功时返回true。如果存在问题,则该⽅法返回fal和 error 其中包含对原因的⽂本描述。
Solver::Options::minimizer_type
Default: TRUST_REGION
矢量图制作软件在LINE_SEARCH和TRUST_REGION算法之间进⾏选择。
Solver::Options::line_arch_direction_type
Default: TRUST_REGION
在LINE_SEARCH和TRUST_REGION算法之间进⾏选择。
Solver::Options::line_arch_type
Default: WOLFE
可选 WOLFE和ARMIJO。注意,为了保证BFGS和LBFGS线搜索⽅向算法的假设,必须使⽤WOLFE线性搜索。
Solver::Options::nonlinear_conjugate_gradient_type
Default: FLETCHER_REEVES
可选 FLETCHER_REEVES, POLAK_RIBIERE 和 HESTENES_STIEFEL
Solver::Options::max_lbfgs_rank
Default: 20
L-BFGS hessian近似是对hessian矩阵的逆矩阵的⼀种较低秩的近似。近似的秩决定(线性)使⽤近似的空间和时间复杂度。秩越⼤,近似的质量越好。然⽽,由于种种原因,质量的提⾼是有限制的。
1. 这个⽅法只使⽤cant的信息⽽不是实际的导数。
2. Hessian近似被限制为正定。秋天回不来
因此,将秩增加到⼀个⼤的数字将花费时间和空间复杂性,却没有相应的质量的提⾼。对于选择最⼤的秩,没有硬性规定。最好的选择通常需要⼀些特定问题的实验。
Solver::Options::u_approximate_eigenvalue_bfgs_scaling
Default: fal
作为 BFGS 更新步骤/ LBFGS 右乘步骤的⼀部分,初始的逆Hessian近似是单位矩阵。然⽽,Oren展⽰了使⽤,⼀个标量近似于真实的逆Hessian的特征值,可以在各种各样的情况下提⾼收敛性。将 u_approximate_eigenvalue_bfgs_scaling 设为true 在 BFGS 和LBFGS中使能这个缩放。
准确地说,近似的特征值缩放等于
其中
是线性搜索⽬标,x参数值向量。
值得注意的是,近似特征值的缩放并不总是能够提⾼收敛性,⽽且它实际上可能显著地降低某些类型的问题的性能,这就是为什么它在默认
情况下是禁⽤的。特别是当问题对不同参数的敏感性有很⼤差异时,它就会降低性能,因为在这种情况下,⼀个标量因⼦⽆法捕捉到这种变化,并且会破坏雅可⽐矩阵近似于低灵敏度参数的部分。它还会降低解的鲁棒性导致Jacobians的错误。
Solver::Options::line_arch_interpolation_type
Default: CUBIC
⽤于近似⽬标函数的多项式的次数。可选 BISECTION, QUADRATIC 和 CUBIC.
Solver::Options::min_line_arch_step_size
线性搜索终⽌条件:
表⽰最⼤范数, 是第k次迭代的步长。
Solver::Options::line_arch_sufficient_function_decrea
Default: 1e-4
线性搜索问题的精确解是⽆法计算的。幸运的是,基于线性搜索的优化算法仍然可以保证收敛,如果不是⼀个精确的解,线性搜索算法返回⼀个可以充分减少⽬标函数值的解。更准确地说,我们正在寻找⼀个步长。
这个条件叫做Armijo条件。
Solver::Options::max_line_arch_step_contraction
Default: 1e-3
在线性搜索的每个迭代。
请注意根据定义,为了收缩:
Solver::Options::min_line_arch_step_contraction
Default: 0.6
在线性搜索的每个迭代。
请注意根据定义,为了收缩:
Solver::Options::max_num_line_arch_step_size_iterations
Default: 20
在每次线性搜索中,最⼤的寻找步长的迭代次数,如果在这个数量的试验中不能找到满⾜条件的步长,那么线性搜索就会停⽌。$$
因为这是⼀个“⼈为的”约束(由⽤户强加的,⽽不是依赖于数学),如果使⽤ WOLFE 线性搜索,在当前的搜索中发现了满⾜Armijo充分减⼩的条件的点 (in <=max_num_line_arch_step_size_iterations)。然后,有最⼩函数值且满⾜了Armijo条件的步长,将会作为新的有效step,尽管它不满⾜strong Wolfe 条件。这种⾏为可以防⽌优化器在⼀个次优点的过早终⽌。
Solver::Options::max_num_line_arch_direction_restarts
Default: 5
在终⽌优化之前,线搜索⽅向算法的最⼤重启次数。当当前算法不能产⽣新的下降⽅向时,线搜索⽅向算法重新启动。这通常表⽰⼀个数值失效,或者是使⽤近似失效。
笔记本怎么设置开机密码
Solver::Options::line_arch_sufficient_curvature_decrea
Default: 0.9
strong Wolfe 条件包括Armijo的充分减少条件,以及⼀个额外的要求,即步长选择沿着搜索⽅向的梯度下降的幅度⾜够⼤。准确地说,第⼆个条件是我们要寻找⼀个步长标准。
是线性搜索⽬标, 是 对于步长的导数.
Solver::Options::max_line_arch_step_expansion
Default: 10.0
在Wolfe线性搜索的过程中,步长会增加,直到找到满⾜Wolfe条件的⼀个点,或者是⼀个包含⼀个满⾜条件的点的上界。精确地说,在每次迭代的扩展中:
通过定义扩展
Solver::Options::trust_region_strategy_type
Default: LEVENBERG_MARQUARDT
Ceres使⽤的置信域计算⽅法,当前可选LEVENBERG_MARQUARDT和DOGLEG。
Solver::Options::dogleg_type
Default: TRADITIONAL_DOGLEG
Ceres⽀持两种dogleg策略,Powell的TRADITIONAL_DOGLEG⽅法和 ByrdSchnabel]描述的SUBSPACE_DOGLEG ⽅法。Solver::Options::u_nonmonotonic_steps元宵节猜灯谜图片
Default: fal
放松对信任区域算法严格减少步骤的要求。更多细节请参阅⾮单调的步骤。
Solver::Options::max_concutive_nonmonotonic_steps
Default: 5
麦其土司步骤选择算法使⽤的窗⼝⼤⼩来接受⾮单调的步骤。
Solver::Options::max_num_iterations
Default: 50
解析器应该运⾏的最⼤迭代次数。
生源地信用贷款Solver::Options::max_solver_time_in_conds
Default: 1e6
解析器应该运⾏的最⼤时间。
Solver::Options::num_threads
Default: 1
Ceres求Jacobain的线程数⽬。
Solver::Options::initial_trust_region_radius
Default: 1e4
初始置信域的⼤⼩。当使⽤levenbergmarquardt策略时,这个数字的倒数就是初始的正则化参数。
Solver::Options::max_trust_region_radius
Default: 1e16
置信域的半径是不允许超过这个值的。
Solver::Options::min_trust_region_radius
Default: 1e-32
心理健康指导
置信域的半径是不允许⼩于这个值的。
Solver::Options::min_relative_decrea
Default: 1e-3
在⼀个置信域的步长被接受之前,相对降低的阈值。
Solver::Options::min_lm_diagonal
Default: 1e6
LEVENBERG_MARQUARDT策略,使⽤⼀个对⾓矩阵来使置信域的step规范化。这是这个对⾓矩阵的值的下界。
Solver::Options::max_lm_diagonal
Default: 1e32
LEVENBERG_MARQUARDT策略,使⽤⼀个对⾓矩阵来使置信域的step规范化。这是这个对⾓矩阵的值的上界。
Solver::Options::max_num_concutive_invalid_steps
Default: 5
拼搏作文600字置信域策略返回的step有时在数字上是⽆效的,这通常是由于条件的问题。优化器不会崩溃或停⽌优化,⽽是可以尝试使⽤较⼩的信任区域/更好的条件来解决问题。该参数设置在最⼩化放弃之前连续重试的次数。
Solver::Options::function_tolerance
Default: 1e-6
求解终⽌如果
是在当前的LM的迭代中,⽬标函数值的变化(上升或下降)。
Solver::Options::gradient_tolerance
Default: 1e-10
求解终⽌如果
最⼤范数, 是在边界约束条件下的投影, 是与参数向量相关的整个局部参数化的加法。
Solver::Options::parameter_tolerance
Default: 1e-8
求解终⽌如果
是当前迭代下线性求解的步长。
Solver::Options::linear_solver_type
Default: SPARSE_NORMAL_CHOLESKY / DENSE_QR
在 Levenberg-Marquardt算法的每⼀次迭代中,⽤于计算线性最⼩⼆乘问题的线性求解器的类型。如果Ceres是⽀持西SuiteSpar,或者 CXSpar,或者是Eigen的稀疏Cholesky 分解,默认是 SPARSE_NORMAL_CHOLESKY,否则就是DENSE_QR。
Solver::Options::preconditioner_type
Default: JACOBI
迭代线性求解使⽤的预处理,默认是块Jacobi 预处理,可⽤的选项是IDENTITY, JACOBI, SCHUR_JACOBI, CLUSTER_JACOBI 和CLUSTER_TRIDIAGONAL。
Solver::Options::visibility_clustering_type
Default: CANONICAL_VIEWS
在构造基于可见性的预调节器时使⽤的聚类算法。最初的基于可见性的预处理论⽂和实现只使⽤了规范的视图算法。
这个算法给出了⾼质量的结果,但是对于⼤的稠密图来说可能特别复杂。最坏的情况是图形⼤⼩3次⽅。
另⼀种选择是使⽤ SINGLE_LINKAGE,这是⼀种简单的、单⼀的链接聚类算法,只关注Schur complement的紧密耦合块。这是⼀种运⾏良好的快速算法。
聚类算法的最佳选择取决于问题的稀疏结构,但是⼀般来说,我们建议您先尝试⼀下 CANONICAL_VIEWS,如果它太过复杂,尝试SINGLE_LINKAGE。
Solver::Options::den_linear_algebra_library_type
Default: EIGEN
Ceres⽀持使⽤多密度的线性代数库来进⾏密集的矩阵分解。⽬前,EIGEN和LAPACK是有效的选择。EIGEN始终是可⽤的,LAPACK依赖于系统BLAS+LAPACK库,它可能是可⽤的,也可能是不可⽤的。
Solver::Options::spar_linear_algebra_library_type
Default: 优先级 SUITE_SPARSE > CX_SPARSE > EIGEN_SPARSE > NO_SPARSE
Ceres⽀持使⽤三种稀疏的线性代数库。SuiteSpar 通过将参数设为 SUITE_SPARSE,CXSpar 通过将参数设为
CX_SPARSE,Eigen 通过将参数设为 EIGEN_SPARSE,最后,NO_SPARSE意味着不需要使⽤稀疏的线性求解;注意,这与Ceres的编译是否⽀持⼀个是⽆关的。
SuiteSpar 是⼀个久经考验⽽复杂的稀疏线性代数库,应该被⼴泛使⽤。
如果您的需求/平台阻⽌您使⽤SuiteSpar,请考虑使⽤CXSpar,这是⼀个⼩得多的简单的库。可以想象,它在⼤问题上的性能不能与SuiteSpar 的性能相媲美。
最后⾮常重要的⼀点,你可以使⽤Eigen的线性代数例程。⽬前这个图书馆的表现是这三个库中最差的。但这种情况在不久的将来就会改变。
另⼀件需要考虑的事情是,Eigen的稀疏Cholesky分解库是在LGPL下获得许可的,在Ceres中使⽤EIGEN_SPARSE,这将导致⼀个LGPL 授权的库(因为Eigen的相应代码被编译到库中)。好处是,您不需要构建并链接到外部库以使⽤EIGEN_SPARSE。
Solver::Options::num_linear_solver_threads
Default: 1
线性解算使⽤的线程数。
Solver::Options::linear_solver_ordering
Default: NULL
ordering对象的⼀个实例告知线性求解器所需参数块消除的顺序。
如果是NULL,解析器就可以⾃由选择它认为最好的排序。
Solver::Options::u_explicit_schur_complement
Default: fal
ITERATIVE_SCHUR使⽤⼀个显式的Schur complement矩阵。
默认情况下,这⼀选项是禁⽤的,⽽ITERATIVE_SCHUR通过利⽤Schur complement的代数表达式来对Schur complement和向量之间的矩阵向量乘积进⾏求值。
这个计算的复杂度与Jacobian矩阵中⾮零项的数⽬有关。
对于⼩到中等⼤⼩的问题,有⼀个很好的地⽅,计算Schur complement⾜够简单,⽽明确地计算它并使⽤它来求矩阵向量乘积是更有效的。
启⽤这个选项可以告诉 ITERATIVE_SCHUR,使⽤⼀个显式的Schur complement。这可以显著提⾼ ITERATIVE_SCHUR的性能。
Solver::Options::u_post_ordering
Default: fal
稀疏的Cholesky分解算法使⽤⼀个 fill-reducing 的顺序来对Jacobian矩阵的列进⾏排序。有两种⽅法可以做到这⼀点。
1. 以某种顺序计算雅可⽐矩阵,然后⽤分解算法置换Jacobian矩阵的列。
2. ⽤已经置换列来计算雅可⽐矩阵。
第⼀个选项会导致严重的内存损失,分解算法必须对置换Jacobian矩阵进⾏复制,因此, Ceres 对Jacobian矩阵的列向量进⾏预处理。⼀般来说,不会有任何性能损失。