Ceres-Solver 官方文档-其二
Reference:
系列文章:
On Derivatives
像所有基于梯度的优化算法一样,Ceres Solver 依赖于能够评估目标函数及其在其域中任意点的导数。实际上,在使用 Ceres Solver 求解优化问题时,定义目标函数及其雅可比矩阵是用户需要执行的主要任务。正确、高效地计算雅可比矩阵是保证系统性能的关键。
Ceres Solver 在用户如何向求解器提供导数方面提供了相当大的灵活性。它可以使用:
- Analytic Derivatives:用户自己计算导数,可以手工计算,也可以使用 Maple 或 Mathematica 等工具,然后在
CostFunction
中实现它们。
当导数存在闭合解析形式时使用,用于可基于SizedCostFunction基类自行编写,但由于需要自行管理残差和雅克比矩阵,除非闭合解具有具有明显的精度和效率优势,否则同样不建议使用。 - Numeric Derivatives:Ceres 用有限差分数值计算导数。
即,当无法分析或使用自动微分计算导数时,使用数值微分,如:使用一个外部库或函数时,其精度和计算效率不如解析导数和自动导数,不到万不得已,并不建议使用该方法。 - Automatic Derivatives:Ceres 使用 C++ 模板和操作符重载自动计算解析导数。
自己求导和自动求导理论上耗时是相同的,但是在自己求导的过程中,可以做一些合并删减,可能会比自动求导快一点。
应该使用这三种方法中的哪一种(单独使用还是组合使用)取决于情况和用户愿意做出的权衡。不幸的是,数值优化教科书很少详细讨论这些问题,用户只能自己摸索。
本文的目的是填补这一空白,并在 Ceres Solver 上下文中详细描述这三种方法中的每一种,以便用户能够做出明智的选择。
而对于没有耐心的人,这里有一些高层次建议:
- 首选使用自动衍生工具。
- 在某些情况下,可能需要用到解析导数。
- 避免数值导数。将其作为最后手段使用,主要用于与外部库进行交互。