自動微分
テープの最後の w ̄ i {\displaystyle {\bar {w}}_{i}} を 1 として、その1つ前から逆順に w ̄ i = ∑ j w ̄ j ∂ w j ∂ w i {\displaystyle {\bar {w}}_{i}=\sum _{j}{\bar {w}}_{j}{\frac {\partial w_{j}}{\partial w_{i}}}} を計算していく。
スカラー値ではなく NumPy のような多次元配列(テンソル)を扱う場合も処理すべき内容は同じである。 w ̄ j ∂ w j ∂ w i {\displaystyle {\bar {w}}_{j}{\tfrac {\partial w_{j}}{\partial w_{i}}}} を1つの処理単位として実装する。これを vector-Jacobian product (VJP) や L-operator (Lop) と言う。行列積の VJP は行列積で実装できる。ただし、ある軸での和(NumPyのsum)の VJP は、その軸で値を繰り返して w ̄ j {\displaystyle {\bar {w}}_{j}} の軸を復元する処理になるなど、直観的で無い物もある。ハーバード大学の HIPS が開発していた Autograd は、ほぼ全ての NumPy の関数の VJP を実装していて、簡潔に実装しているので参考になる。なお ∂ w i ∂ w j w ̇ j {\displaystyle {\tfrac {\partial w_{i}}{\partial w_{j}}}{\dot {w}}_{j}} は Jacobian-vector product (JVP) や R-operator (Rop) と言い、ボトムアップ型で使用する。
ボトムアップ型自動微分は実数の代数に(元を)添加して新しい算術を導入することによって可能である。全ての数(通常の実数)に対して、その数における関数の微分を表現する追加の成分が足され、全ての算術演算がこの添加代数に拡張される。すなわち二重数の代数である。このアプローチはプログラミング空間上の演算子法(英語版)の理論(つまり双対空間のテンソル代数)によって一般化される(解析的プログラミング空間(英語版)を見よ)。
各数 x {\displaystyle x} を数 x + x ′ ε {\displaystyle x+x'\varepsilon } に置き換える。ここで x ′ {\displaystyle x'} は実数だが、 ε {\displaystyle \varepsilon } は ε 2 = 0 {\displaystyle \varepsilon ^{2}=0} を満たす抽象的数(英語版)である(無限小;滑らかな無限小解析も参照)。ちょうどこれだけを用いて通常の演算が得られる:
( x + x ′ ε ) + ( y + y ′ ε ) = x + y + ( x ′ + y ′ ) ε ( x + x ′ ε ) ⋅ ( y + y ′ ε ) = x y + x y ′ ε + y x ′ ε + x ′ y ′ ε 2 = x y + ( x y ′ + y x ′ ) ε {\displaystyle {\begin{aligned}(x+x'\varepsilon )+(y+y'\varepsilon )&=x+y+(x'+y')\varepsilon \\(x+x'\varepsilon )\cdot (y+y'\varepsilon )&=xy+xy'\varepsilon +yx'\varepsilon +x'y'\varepsilon ^{2}=xy+(xy'+yx')\varepsilon \end{aligned}}}
この関数 f に対する勾配を求めるためには ∂ y ∂ x 1 {\displaystyle {\tfrac {\partial y}{\partial x_{1}}}} だけではなく ∂ y ∂ x 2 {\displaystyle {\tfrac {\partial y}{\partial x_{2}}}} も求める必要がある。そのため、初期値を w ̇ 1 = 0 ; w ̇ 2 = 1 {\displaystyle {\dot {w}}_{1}=0;{\dot {w}}_{2}=1} とした同様の計算を追加で行わなければならない。
勾配を求める場合に必要なボトムアップ型自動微分の実行回数は入力変数の個数と等しく、トップダウン型自動微分では出力変数の個数に等しい。ボトムアップ型やトップダウン型の自動微分を1回行うのに必要な計算量は、元のプログラムの計算量に比例する。そのため、偏微分する関数f : R → R が n ≪ m を満たす場合、ボトムアップ型自動微分はトップダウン型自動微分よりも効率的である。
自動微分(じどうびぶん、英: automatic differentiation, autodiff, AD)やアルゴリズム微分(英: algorithmic differentiation)とは、プログラムで定義された関数を解析し、関数の値と同時に偏導関数の値を計算するアルゴリズムである。
自動微分は複雑なプログラムであっても加減乗除などの基本的な算術演算や基本的な関数(指数関数・対数関数・三角関数など)のような基本的な演算の組み合わせで構成されていることを利用し、これらの演算に対して合成関数の偏微分の連鎖律を繰り返し適用することによって実現される。自動微分を用いることで偏導関数値を少ない計算量で自動的に求めることができる。