Ceres简介及示例(7)On Derivatives(Spivak Notation)

On Derivatives

Ceres求解器,像所有基于梯度的优化算法一样,依赖于能够评估目标函数及其在其域内任意点的导数。实际上,定义目标函数及其雅可比矩阵是用户在使用Ceres求解器求解优化问题时需要执行的主要任务。正确、高效的雅可比矩阵计算是获得良好性能的关键。

用户可以灵活的从一下三种微分算法中选择:

  • 1.Automatic Derivatives 自动微分算法:Ceres使用c++模板和操作符重载自动计算解析导数。
  • 2.Numeric derivatives 数值微分算法:Ceres用有限差分数值计算导数
  • 3.Analytic Derivatives 解析微分算法:用户通过手动或使用Maple或Mathematica等工具,自己计算出导数,并在CostFunction中实现它们。

应该使用这三种方法中的哪一种(单独或结合使用)取决于情况和用户愿意做出的权衡。不幸的是,数值优化教科书很少详细讨论这些问题,用户只能自己使用设备。

本文的目的是填补这一空白,并在Ceres Solver的上下文中详细描述这三种方法中的每一种,以便用户做出明智的选择。
对于那些没有耐心的人,这里有一些高水平的建议:

  • 1.使用Automatic Derivatives自动微分算法
  • 2.在某些情况下,可能值得使用Analytic Derivatives解析微分算法
  • 3.避免Numeric derivatives数值微分算法。使用它作为最后的手段,主要用于与外部库进行接口。

Spivak Notation

为了简化阅读和理解,使用Spivak符号表示导数。对于单变量函数f,f(a)为其在a处的值,Df为其一阶导数,Df(a)为其在a处的导数,即
D f ( a ) = d d x f ( x ) ∣ x = a Df(a) = \left . \frac{d}{dx} f(x) \right |_{x = a} Df(a)=dxdf(x) x=a
D f ( a ) Df(a) Df(a)表示f的第 k k k阶导数。对于二元函数 g ( x , y ) g(x,y) g(x,y) D 1 g D_1g D1g D 2 g D_2g D2g分别表示关于 g g g的两个偏微分,即
D 1 g = ∂ ∂ x g ( x , y )  and  D 2 g = ∂ ∂ y g ( x , y ) . D_1 g = \frac{\partial}{\partial x}g(x,y) \text{ and } D_2 g = \frac{\partial}{\partial y}g(x,y). D1g=xg(x,y) and D2g=yg(x,y).
D g Dg Dg 表示 g g g的雅可比矩阵:
D g = [ D 1 g D 2 g ] Dg = \begin{bmatrix} D_1g & D_2g \end{bmatrix} Dg=[D1gD2g]
更一般的,对一个多元函数 g : R n ⟶ R m g:\mathbb{R}^n \longrightarrow \mathbb{R}^m g:RnRm D g Dg Dg表示的就是一个m×n的雅可比矩阵。

D i g D_i g Dig则表示g的偏微分,即 D g Dg Dg 中第i行i列的元素。

最后 D 1 2 g D^2_1g D12g D 1 D 2 g D_1D_2g D1D2g 表示高阶偏微分。

猜你喜欢

转载自blog.csdn.net/wanggao_1990/article/details/129712087