You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
61 lines
2.2 KiB
61 lines
2.2 KiB
.. default-domain:: cpp
|
|
|
|
.. cpp:namespace:: ceres
|
|
|
|
.. _chapter-on_derivatives:
|
|
|
|
==============
|
|
On Derivatives
|
|
==============
|
|
|
|
Ceres Solver, like all gradient based optimization algorithms, depends
|
|
on being able to evaluate the objective function and its derivatives
|
|
at arbitrary points in its domain. Indeed, defining the objective
|
|
function and its `Jacobian
|
|
<https://en.wikipedia.org/wiki/Jacobian_matrix_and_determinant>`_ is
|
|
the principal task that the user is required to perform when solving
|
|
an optimization problem using Ceres Solver. The correct and efficient
|
|
computation of the Jacobian is the key to good performance.
|
|
|
|
Ceres Solver offers considerable flexibility in how the user can
|
|
provide derivatives to the solver. She can use:
|
|
|
|
#. :ref:`chapter-analytical_derivatives`: The user figures out the
|
|
derivatives herself, by hand or using a tool like `Maple
|
|
<https://www.maplesoft.com/products/maple/>`_ or `Mathematica
|
|
<https://www.wolfram.com/mathematica/>`_, and implements them in a
|
|
:class:`CostFunction`.
|
|
#. :ref:`chapter-numerical_derivatives`: Ceres numerically computes
|
|
the derivative using finite differences.
|
|
#. :ref:`chapter-automatic_derivatives`: Ceres automatically computes
|
|
the analytic derivative using C++ templates and operator
|
|
overloading.
|
|
|
|
Which of these three approaches (alone or in combination) should be
|
|
used depends on the situation and the tradeoffs the user is willing to
|
|
make. Unfortunately, numerical optimization textbooks rarely discuss
|
|
these issues in detail and the user is left to her own devices.
|
|
|
|
The aim of this article is to fill this gap and describe each of these
|
|
three approaches in the context of Ceres Solver with sufficient detail
|
|
that the user can make an informed choice.
|
|
|
|
For the impatient amongst you, here is some high level advice:
|
|
|
|
#. Use :ref:`chapter-automatic_derivatives`.
|
|
#. In some cases it maybe worth using
|
|
:ref:`chapter-analytical_derivatives`.
|
|
#. Avoid :ref:`chapter-numerical_derivatives`. Use it as a measure of
|
|
last resort, mostly to interface with external libraries.
|
|
|
|
For the rest, read on.
|
|
|
|
.. toctree::
|
|
:maxdepth: 1
|
|
|
|
spivak_notation
|
|
analytical_derivatives
|
|
numerical_derivatives
|
|
automatic_derivatives
|
|
interfacing_with_autodiff
|