自動微分
自動微分（じどうびぶん、アルゴリズム的微分とも）とは、プログラムで定義された関数を解析し、偏導関数の値を計算するプログラムを導出する技術である。自動微分は複雑なプログラムであっても加減乗除などの基本的な算術演算や基本的な関数（指数関数・対数関数・三角関数など）のような基本的な演算の組み合わせで構成されていることを利用し、これらの演算に対して連鎖律を繰り返し適用することによって実現される。自動微分を用いることで偏導関数値を少ない計算量で自動的に求めることができる。
自動微分は
のどちらとも異なる。
数式微分は効率が悪くなりやすく、プログラムで定義された関数から微分表現を導くのは困難であるという問題がある。一方、数値微分では離散化の際の丸め誤差や桁落ちによる精度の低下が問題である。さらに、どちらの手法も計算量や誤差の関係で高次の微分係数を求めることが難しい。また、勾配を用いた最適化で必要となる、多くの入力変数を持つ関数に対する偏微分値の計算を行うには速度が遅い。自動微分はこれらの古典的手法の問題を解決する。
英語では Automatic differentiation (あるいは単に AD) と呼ばれる。
自動微分の基本原理は連鎖律を用いた微分の分解である。たとえば、簡単な合成関数である に対して連鎖律を適用すると
を得る。
自動微分は大きく2種類に分けられ、それぞれボトムアップ型自動微分（フォーワードモード、狭義の自動微分）とトップダウン型自動微分（リバースモード、高速自動微分）と呼ばれる。
ボトムアップ型自動微分では連鎖律を内側から外側に計算し（を計算した後で を計算する）、トップダウン型自動微分では外側から内側に計算する。
ボトムアップ型自動微分では最初に微分を行う入力変数を固定し、それぞれの部分式を再帰的に計算する。手計算においては連鎖律において内側の関数を繰り返し置き換えていくことに相当する。
多変数の場合はヤコビ行列の積として一般化できる。
トップダウン型自動微分と比較すると、ボトムアップ型自動微分は自然であり、微分に関する情報の流れが計算の順序と一致するため簡単に実行できる。それぞれの変数にその偏導関数値
の計算値を保存する領域を付け加えるだけで、変数値の計算と同時に偏導関数値を計算することができる。
例として次の関数を考える。
簡単のためそれぞれの部分式を としてラベル付けした。
どの入力変数で微分するかによって や の初期値が異なる。 に関する微分をそのつど計算する場合の初期値は、
となる。初期値が決まったら下の表に示す連鎖律に従って各偏導関数値を順に計算していく。図2はこの処理を計算グラフとして表している。
この関数に対する勾配を求めるためにはだけではなくに関する偏導関数値も求める必要がある。そのため、初期値をformula_7 とした同様の計算を追加で行わなければならない。
ボトムアップ型自動微分を1回行うのに必要な計算量は、元のプログラムの計算量に比例する。
勾配を求める場合に必要なボトムアップ型自動微分の実行回数は入力変数の個数と等しく、トップダウン型自動微分では出力変数の個数に等しい。そのため、微分する関数 が を満たす場合、ボトムアップ型自動微分はトップダウン型自動微分よりも効率的である。
トップダウン型自動微分では、はじめに微分される出力変数を固定して、それぞれの部分式に関する偏導関数値を再帰的に計算する。手計算においては部分式を連鎖律における外側の関数の微分で繰り返し置き換えていくことに相当する。
トップダウン型自動微分において、求める値は随伴であり、上線()で表す。これは選択された出力変数のに関する微分
である。
トップダウン型自動微分は連鎖律を外側から内側（図3の計算グラフでは上から下）にたどっていく。例示した関数は1変数関数なので、勾配を計算するには計算グラフを一度たどるだけでよい。これは2回計算グラフをたどる必要があったボトムアップ型自動微分の計算量の半分である。しかし、トップダウン型自動微分は中間変数 を保存するための領域と、1964年に R.E. Wengert が発表した Wengert リスト（テープとも呼ばれる） というデータ構造に中間変数を保存するための命令が必要となるためメモリ使用量の点で不利であり、計算グラフが巨大になるとメモリ使用量が問題となる可能性がある。この問題は保存する中間変数を限定し、必要な中間変数を再計算することによって軽減される。
トップダウン型自動微分を用いて偏導関数値を計算するための演算は以下の通りである（関数値を求める時と順番が逆であることに注意）
微分する関数 が を満たすとき、トップダウン型自動微分はボトムアップ型自動微分よりも効率的である。
機械学習で用いられる多層パーセプトロンのバックプロパゲーション はトップダウン型自動微分の特殊なケースである。
フォワードモード自動微分は実数の代数に（元を）添加して新しい算術を導入することによって可能である。全ての数（通常の実数）に対して、その数における関数の微分を表現する追加の成分が足され、全ての算術演算がこの添加代数に拡張される。すなわち二重数の代数である。このアプローチはの理論（つまり双対空間のテンソル代数）によって一般化される（を見よ)。
各数 formula_11 を数 formula_12 に置き換える。ここで formula_13 は実数だが、formula_14 は formula_15 を満たすである（無限小；滑らかな無限小解析も参照）。ちょうどこれだけを用いて通常の演算が得られる：
引き算と割り算についても同様である。
いまやこの拡張算術のもとで多項式を計算できる。もし formula_17 ならば、
formula_18
ここで formula_19 は formula_20 の最初の引数に対する微分であり、formula_13（種と呼ばれる）は任意に取れる。
上に述べたように、この新しい算術は、順序対（formula_22 と書かれる元）と、最初の成分に対しては通常の算術を、第二の成分に対しては一階微分の算術を、それぞれ与えたものからなる。多項式に関する上の結果を解析関数に広げれば、新しい算術に対する、基本的な算術と幾つかの標準的な関数のリストが得られる：
一般に、プリミティヴの関数 formula_24 に対して、
ここで formula_26 と formula_27 はそれぞれ formula_24 の最初と2番目の引数に対する微分である。
基本的な二項算術演算を（実数と二重数の）混在した引数に対して、つまり順序対 formula_29 と実数 formula_30 に対して適用するとき、まずこの実数を formula_31 に引き上げる（lifting）。関数 formula_32 の formula_33 に於ける微分はいまや formula_34 に上の算術を使って計算することによって得られる。これは formula_35 を結果として与える。
多変数関数は、方向微分作用素を用いることで、一変数関数の場合と同様の効率と仕組みで取り扱える。つまり、formula_36 の formula_37 における formula_38 方向微分 formula_39 を計算したい場合、それは formula_40 を上と同様の算術を使って計算すればよい。もし formula_41 の全ての要素が望みならば、formula_42 個の関数評価が要求される。ここで、多くの最適化アプリケーションでは、実際には方向微分があれば十分である。
上の算術は多変数関数の二階やもっと高階の微分の計算の為に一般化出来る。しかし、その算術規則は直ちに極めて複雑なものとなる：複雑性は最高次の微分の次数に対して二次関数的となる。その代わりに、途中で打ち切った（truncated）テイラー多項式の代数を使用できる。結果得られる算術（一般化された二重数の上で定義された）は、関数を新しいデータ型であるかのように使って、効率的に計算することを可能にする。ひとたび関数のテイラー多項式が分かれば、その導関数たちは容易に抽出できる。
厳密で一般的な定式化はを通してを用いることにより達成される。
自動微分の実装方法には大きく分けて、ソースコードの変換とオペレータオーバーローディングによる方法の2つがある。
関数値を求める関数を記述した元のソースコードから、偏導関数値を計算する処理を含んだプログラムを自動的に生成する手法である。
ソースコード変換はあらゆるプログラミング言語で実装でき、コンパイル時の最適化を行いやすいが、自動微分ツールの作成は難しい。
この手法は演算子のオーバーロードがサポートされているプログラミング言語で記述されたソースコードに対してのみ適用可能である。元のソースコードの流れを大きく変更することなく実現できるが、基本データ型の変更などの小さな変更は必要である。
ボトムアップ型自動微分をオペレータオーバーロードで実現するのは容易である。トップダウン型自動微分についても可能であるが、現状のコンパイラではボトムアップ型自動微分と比べると最適化の面で不利である。
自動微分を実装したライブラリなどのソフトウェアが存在する。詳細はを参照のこと。