デリバティブについて
Ceres ソルバーは、すべての勾配ベースの最適化アルゴリズムと同様に、その領域内の任意の点で目的関数とその導関数を評価できることに依存しています。実際、目的関数とそのヤコビアン行列の定義は、Ceres ソルバーを使用して最適化問題を解決するときにユーザーが実行する必要がある主なタスクです。ヤコビ行列を正しく効率的に計算することが、優れたパフォーマンスの鍵となります。
ユーザーは、次の 3 つの差分アルゴリズムから柔軟に選択できます。
- 1. 自動導関数 自動微分アルゴリズム: Ceres は C++ テンプレートと演算子のオーバーロードを使用して、解析導関数を自動的に計算します。
- 2.数値微分 数値微分アルゴリズム: Ceres は有限差分値による微分を計算します。
- 3. 分析微分 分析微分アルゴリズム: ユーザーは自分で、または Maple や Mathematica などのツールを使用して微分を計算し、CostFunction に実装します。
これら 3 つのアプローチのどれを (単独で、または組み合わせて) 使用する必要があるかは、状況とユーザーが希望するトレードオフによって異なります。残念ながら、数値最適化の教科書ではこれらの問題について詳細に説明することはほとんどなく、ユーザーは自分のデバイスで操作することになります。
この記事の目的は、このギャップを埋め、ユーザーが情報に基づいた選択ができるように、Ceres ソルバーのコンテキストでこれら 3 つのメソッドのそれぞれを詳細に説明することです。
せっかちな方のために、高度なアドバイスをいくつか紹介します。
- 1.Automatic Derivatives 自動微分アルゴリズムを使用する
- 2. 場合によっては、分析デリバティブを使用する価値があるかもしれません
- 3. 数値導関数の数値微分アルゴリズムを避けてください。これは、主に外部ライブラリと接続するための最後の手段として使用してください。
スピヴァク記法
読みやすく理解を容易にするために、導関数はスピヴァク表記を使用して表されます。一変量関数 f の場合、f(a) は a でのその値、Df はその一次微分値、Df(a) は a での微分値です。つまり、D f ( a ) = ddxf ( x ) ∣ x =
a Df(a) = \left . \frac{d}{dx} f(x) \right |_{x = a}D f ( a )=dx _df ( x )
x = a
D f ( a ) Df(a)D f ( a )はf のkk 番目k次導関数。二項関数g ( x , y ) g(x,y)g ( x ,y ),D 1 g D_1gD1gとD 2 g D_2gD2gそれぞれgggの 2 つの偏微分
、つまり D 1 g = ∂ ∂ xg ( x , y ) および D 2 g = ∂ ∂ yg ( x , y ) 。 D_1 g = \frac{\partial}{\partial x}g( x ,y) \text{ および } D_2 g = \frac{\partial}{\partial y}g(x,y)。D1g=∂ ×∂g ( x ,y ) と D2g=∂y _∂g ( x ,y ) 。
Dg DgD g はggを意味しますgのヤコビ行列
: D g = [ D 1 g D 2 g ] Dg = \begin{bmatrix} D_1g & D_2g \end{bmatrix}Dg _=[D1gD2g]
より一般的には、多変量関数g : R n ⟶ R mg:\mathbb{R}^n \longrightarrow \mathbb{R}^m の場合g:Rn⟶Rm,D g DgDg は、m×nのヤコビ行列を表す。
ディグディグD私はg はg の偏微分、つまりD g DgDgの行 i 、列 i の要素。
最後にD 1 2 g D^2_1gD12g 和 D 1 D 2 g D_1D_2g D1D2g は高次偏微分を表します。