モデル(模型)を考えるときは,たくさんの部分要素を組み合わせた総体として考えるとよい.細かい要素から,ある要素ができる,という一段階だけでも階層構造を定義しておくと,その関係を再帰的に用いて一通りの規模のモデルを定義できるからである.よってここでは,最低限,モデルを多数の詳細な要素からなるという方法で定式化する.このとき,数理的に多数の要素を表すには,それら要素を識別するための識別子が必要にある.この識別子は,\(x_i\)のようにある変数\(x\)の添字として使われるから,添字と呼ぶ.この添字は座標軸と呼ばれるものと同一視しても良い.モデルを定義するにはこの添字や座標軸を定義することから始める.
モデルの定義
ここでのモデルで使う添字全体を\(N\)と表す.この添字を指して細胞\(i\)などと呼ぶ.細胞の接続関係を定義する集合を\(E\)とする.具体的に,\(i, j\in N\)に対し,\(i\)から\(j\)に結合があればまたそのときに限り\((i, j)\in E\)であると\(E\)を定義する.ある\(i\)からつながる細胞の全体を\(F_i\),\(i\)へつながる細胞の全体を\(B_i\)と表す.もちろん\(F_i\subset N, B_i\subset N\)である.\(E\)の定義から,\(F, B\)は次のように定まる.
B_i = \cbr{j; (j, i)\in E}, F_i = \cbr{j; (i, j)\in E}
次に第1のモデル化として,細胞の状態というもの実数値により表すモデル化を導入する.細胞\(i\)のそのような状態を\(x_i\)と書くことにする.この数値により表現された状態で情報の伝搬を次のように定義する.
x_i = \sum_{j\in B_i} \theta_{ij} f(x_j) + \theta_{bi}
関係性はあまりにも単純だとつまらない(自明な)モデルとなってしまうため,上記のように調整可能な変数\(\theta_{ij}\)と変換関数\(f\)を取り入れた関係性のモデルとしている.複雑すぎても大変であるからここでは\(f\)は\(i\)によらず同じであるとしている.\(f\)として初学者はおおよそ次の無限回微分可能という良い性質を持つSwishを使っていれば良い.
f(a) = \frac{a}{1+\exp(-a)}, a\in \sR
この関係性により,多くの問題を扱えることが知られていて,これがANNの基本的なモデルである.添字\(ij\)を取る変数\(\theta_{ij}\)が導入されているが,これは\(ij\)という添字の積を新たな添字として見ていることに等しい.普通の整数の積とは違うことに注意する.\(\theta_{bi}\)はについても\(b, i\)の積を新たに添字として定義する.\(\theta_{bi}\)はバイアス,\(\theta_{ij}\)は重みと呼ぶ.このモデルの有効な添字(座標軸)の数(モデルの次元)は\(\abr{N} + \abr{N} + \sum_{i\in N}\abr{B_j}\)である.
グラフの定義の課題
ここでは実際にグラフを定義し,正しく定義できていることを可視化により確認する.まずは可視化の方法を知らなければ始まらない.可視化しているだけで動きはしないのだが,可視化ができなければ不具合が合っても原因がわからずにほぼ挫折するからまずは可視化をしっかり行う.ここではSVG (Scalable Vector Graphics)により描いて可視化する.の可視化を生成するプログラムをgraph.cppとして用意しているので,こちらを見てもらいたい.
簡単な矢印の可視化.SVGの扱い方についてはSVG の生成方法を併せて参考にすると良い.
graph.cppを改変して,以下のグラフを生成してみよう(課題1).
1対多のグラフ
次に,のように拡張してみよう(課題2).
多対多のグラフ.いわゆる全結合の回路
のように可視化できれば,ANNらしいものが見えてくるだろう.続けて,のように多段にしてみよう(課題3).これで見た目はすっかりDeep Neural Network (深層人工神経回路)である.動きもしない見た目だけのものを生成して間抜けに思うかもしれない.しかしなんども述べるのがこれすらできなければANNを実装することはできない.
多層回路
可視化ができるようになったところでで一般のANNを定義し,可視化してみよう.構造を可視化するだけであれば,このとき必要な変数は\(N, E\)の2つだけである.
N = \cbr{0, 1, 2, 3, 4}, E = \cbr{(1, 0), (2, 0), (3, 1), (4, 1), (3, 2), (4, 2), (3, 0)}.
で定義されるノードに適当に座標を定義して可視化する.座標を\(p_i\)として,
p_0 = (0, 0.8), p_{j+1} = (-0.2 + 0.4 j, 0), p_{j+3} = (-0.2 + 0.4 j, -0.8), j=1,2
と設定して可視化した例をに示す.例えばこれを実装するための参考コードをgraph5_ex.cppにしめす.graph5_ex.cppを完成させるようにして,のようにグラフをSVGで出力するコードを作成してみよう(課題4).
ここで,今後のためにファイルから回路を読み込むコードを作成しよう.以下のようなを読み込むことで,の結果とほぼ同じものが生成されることを目指す(課題5).
node で始まる行は,空白毎に細胞の番号,x座標,y座標を示す.edge で始まる行は辺を構成する添字の組を入力,出力の順で示す.ここではこのようなファイルの形式をNN形式と呼ぶ
node 0 0 0.8
node 1 -0.5 0
node 2 0.5 0
node 3 -0.7 -0.8
node 4 0.7 -0.8
edge 1 0
edge 2 0
edge 3 1
edge 4 1
edge 3 2
edge 4 2
edge 3 0
例としてmodel5a.txtとmodel5b.txt,model5c.txtを用意した.model5b.txt はを定義するものである.それぞれ可視化するとのようになる.気が向いたので乱数で散らしている.
ファイル読み込みによるモデルの可視化例
ここで,の中や右で現れる層状の回路を定式化する.中のものは多層パーセプトロン(MLP: Multi Layer Perceptron),右のものは密回路(DenseNet: Densely Connected network)と呼ばれる.
MLPについて,\(N = \sum_{k=0}^K L_k\)のように層状に細胞の集合が分割されて定義される.ここでこのように和集合を\(\sum\)で表現したら\(k\neq l \Rightarrow L_k \cap L_{l} = \emptyset\)であるとする.辺については,
E = \cbr{(i, j); i\in L_{k-1}, j\in L_{k}, k=1,2,...,K}
中は上式により生成したMLPをNN形式で書き出し,課題5のプログラムで可視化した結果である(課題6).
DenseNet についてもほぼ同様だが,MLPに対し\(L\)は共通で\(E\)が異なる.DenseNetでは\(E\)を次のように定義する.
E = \cbr{(i, j); i\in L_{k-1}, j\in L_{l}, k=1,...,K, l=k,...,K}
右は上式により生成したMLPをNN形式で書き出し,課題5のプログラムで可視化した結果である(課題7).
19層くらいのMLPを出力した結果を可視化した様子.問題なく描けている.プログラムで生成すればこれくらい簡単なことである.
以下の課題に挑戦してみよう.
- 課題1: graph.cppを改変してのグラフを描画するSVGを生成する.
において,矢印の位置はsvg のrefXの値を調整して移動する(graph.cpp内で文字検索をしてみよう).線分が円の縁から始まるようにするためには線形代数の知識を必要とする.円の中心を\(p_1, p_2\),半径を\(r\)とそれぞれしたとき,\(d = (p_2 - p_1)/\nbr{p_2 -p_1}\)を定義して,\(q_1 = p_1 + r d, q_2 = p_2 - rd\)と線分の端の座標\(q_1, q_2\)を決めれば良い.模範解答回答コード
- 課題2: graph.cppを改変して,のようなSVGの画像を生成する.課題1のコードを2重ループに拡張すれば良い.模範解答回答コード
- 課題3: graph.cppを改変して,のようなSVGの画像を生成する.課題2のコードを3重ループに拡張すれば良い.模範解答回答コード
- 課題4: graph5_ex.cppを改変して動作するようにし,のようなSVGとしてで定義されるモデルのグラフを可視化するコードを作成する.模範解答回答コード
- 課題5: model5a.txtとmodel5b.txt,model5c.txtを読み込み,のように可視化するプログラムを作成する.
- 課題6: 指定した任意の段数のMLPをNN形式で出力するプログラムを作成する.のように多段の回路を何なく生成できることを確認する.課題5のプログラムで生成したNN形式のファイルから回路を可視化できることを確認する.ただし,細胞の座標を乱数でのように適宜散らすこと.
- 課題7: 指定した任意の段数のDenseNetをNN形式で出力するプログラムを作成する.またその出力したNN形式のファイルを課題5のプログラムで読み込み回路を可視化できることを確認する.
順伝搬
モデルを動かすためには,解法(アルゴリズム)が必要であり,に基づき順伝搬させるためのアルゴリズムがまずは必要なのでそれについて考える.には,ちょうど簡単なアルゴリズムが存在しそれは帰納的に構築することができる.
を計算するためにはすべての\(j\in B_i\)について計算が完了していなければならない.DAGでは,この計算をいくらかの段階に分けて行うことができる(証明を省く).この段階を\(k=1,2,...,K\)で表し,今,第\(k\)回目に計算可能な集合を\(L_k\)と書く.このときこれは,
S_{k} = \cbr{i; B_i\subset S_{k-1}, i\in N}, L_{k} = S_{k} - S_{k-1}, S_0 = \emptyset
と漸化式により定義できる.\(S_k\)は計算が完了している細胞の集合である.\(L_k\)を求めるために\(S_k\)が必要となる.上記式は,計算に必要な\(B_i\)が全て計算済みの細胞集合\(S_k\)に収まっているような細胞\(i\)の集合で,まだ計算していないものが\(L_{k}\)ということである(これも上の式を言葉で述べただけのことである.).\(L_1\)は入力がない細胞の集合であり,この細胞から回路の計算が始まる.このような細胞の集合を入力あるいは入力層などと呼ぶ.
上記\(L_k, k=1,2,...,K\)を求める漸化式は,数列の漸化式とは異なるため,プログラムで実装する際には多少難しい.特に集合の演算\(\subset, \in\)の実装方法が不明確である.ここでは指示関数という集合の表現方法を紹介する.指示関数とは以下のような,集合に入っているかどうかを0, 1で表現する\(\chi\)のような関数のことである.
i \in A \Rightarrow \chi_A(i) = 1, i \not\in A \Rightarrow \chi_A(i) = 0
ただ,\(\chi\)を逐一書いていたら記法が煩雑となるため,ここでは簡単に\(\chi_A(i) = A[i]\)と書く.集合に\([\ ]\)をつけた謎の表記に矛盾が無いか気になるかもしれないが,神経回路の記述程度ではこの記法でほぼ問題ない.指示関数は添字のとりうる範囲を定義域として定義するから,指示関数の実装のためには\(N\)をすべて収めるくらいの整数値の配列を定義すれば良い.2分木などによる集合演算の実装方法もあるが\(N\)が1万程度の範囲では指示関数による方法で十分高速で初学者には実装も優しいのでこの方法を使う.
具体的にを,任意の\(i\in N\)について(つまりすべての\(i\)に繰り返しなどで適用する式であるということ),指示関数で次のように書ける.
L_{k}[i] = S_{k}[i] - S_{k-1}[i], S_{k}[i] = \prod_{j\in B_i}S_{k-1}[j], \forall i\in N(S_0[i] = 0)
ここで,\(A = \emptyset\Rightarrow \prod_{j\in A}S_k[j] = 1\)とする.積の記号の空集合に対するこのような扱いは便宜上良くあることなので慣れると良い.
なぜ集合\(A, B\)に対し\(A\subset B\)が積\(\prod_{j\in A}B[j]\)で表されるかわかるだろうか。要素の数に対する数学的帰納法により示せるはずだが、このことの説明は読者の課題とする。
ところで\(j\in B_i\)は\((j, i)\in E\)と同じ意味である.は実際にこの2つが同じであることを意味する.本書の課題程度であれば\(B_i\)は実際には求めないで\(E\)から\(i\)に対応する細胞\(j\)だけを抽出したほうが簡単で良い.つまり,以下の漸化式を解く.
L_{k}[i] = S_{k}[i] - S_{k-1}[i], S_{k}[i] = \prod_{(j, i)\in E}S_{k-1}[j],
を計算して\(S_{k} = N\)となる最初の\(k\)を\(K\)とする.前節の課題5左の回路に対してこのように求まった\(L_k, k=1,...,K\)を可視化した結果をに示す(課題F1).\(K\)枚の画像を生成するわけである.\(k\)番目の画像について,細胞\(i\in N\)について\(i\in L_k\)であれば暗く\(i\not\in L_k\)であれば明るくしている.また,辺\((i, j)\in E\)について同様に\(i \in L_k\)であれば暗く\(i\not\in L_k\)であれば明るく描いている.
課題5の回路の伝搬の計画を可視化した結果
課題5のMLPの伝搬の計画を可視化した結果
課題5のDenseNetの伝搬の計画を可視化した結果.各段階で計画に含まれない辺を省略.細胞の位置を乱数で散らしたことで,辺が重なること無く確認できるようになっている.細胞の位置を乱数で散らすことの効果が現れている.
計画に従って、を解く。\(k=1,2,...,K\)について順番に、\(i\in L_k\)の要素についてを適用することを繰り返す
ただし、\(B_i\)を\(i\)に接続する辺の集合に変更した,以下の式を実際には用いる.
x_i = \sum_{e\in Ei}f(x_{ei})\theta_{e} + \theta_{bi}
ただし,\(Ei\)は\(i\)につながる辺の集合である.同様に\(iE\)を\(i\)からつながる辺の集合と定義する.ここで辺の要素と細胞の添字に対する演算を定義する.それぞれの要素\(e\in E\)に対して,
ej = i, ie = j \Leftrightarrow e = (i, j)
と定義する.また,以下の通り\(i\in N\)に対して\(iE, Ei\)を定義する.
iE &= \cbr{ie; e\in E, \exists j\in N\br{ie = j}, e\in E} \\
Ei &= \cbr{ei; e\in E, \exists j\in N\br{ei = j}, e\in E}
この定式化の意義について説明する.とを比較して,\(\theta\)の添字が\(ij\)から\(e\)へ変わっている.これはほとんど実装上の都合である.\(e=(i, j)\)から\(i, j\)の組を計算することは,簡単であるが,\(i, j\)の組から辺の添字を計算することは,難しいからである.前者は\(\sigma: E\to N\times N\)の写像で定義され,後者は\(\tau: N\times N \to E\)の写像で定義される.プログラムでは,定義域の大きさで定数時間で参照できる写像の実装にメモリの使用量が決まるため,\(O(\tau), O(\sigma)\)をそれぞれに必要な記憶域とすれば\(O(\tau) \gt O(\sigma)\)である.\(\tau\)を二分木などの対数時間の方法で実装すれば記憶域量の違いは出ないが,添字の計算は頻繁に行うため計算速度を犠牲にすることはできない.よって,\(\sigma\)の方法であるを用いるのである.
\(e\in iE\)と\(i\)を同じ色にした回路の可視化をの左,\(e\in Ei\)と\(i\)を同じ色にした回路の可視化を右に示す.
\(Ei, iE\)の可視化。細胞\(i\)と辺\((j, i), Ei\)が左図、細胞\(i\)と辺\(iE\)を同じ色にしたのが右図である。
伝搬を実装するには、検証問題と可視化方法を準備する必要がある。\(\theta\)と入力の状態\(x_{L_1}\)を適当に決めて、それに対する伝搬の模範解答を用意し、伝搬が模範解答にそうとするかどうかを確認しよう。
\(i_0 \in {L_1}\)を選んだとする。\(i_{t-1}\in N\)があたえられたとして、次の式(漸化式)で\(i_{t}\in N\)を決定する。
i_{t} \in i_{t-1}e_t, e_t\in i_{t-1}E,
\(i_{t}\)は集合の範囲から無作為に選ぶとする。\(i_T E = \emptyset\)としてこの手続きを終了し、列\(i_0, i_1,...,i_T\)をえる(このような有限の\(T\)が存在することの証明は読者の練習問題とする。)。また、経路上の辺についてパラメータを\(1\), それ以外について\(0\)とする。つまり、すべての\(e\in E\)に対して
\exists t, e = e_t &\Rightarrow \theta_e = 1\\
\not\exists t, e = e_t &\Rightarrow \theta_e = 0
と設定する(定義する)。さらに細胞のパラメータについても、
\exists t, i = i_t &\Rightarrow \theta_{bi} = t+1\\
\not\exists t, i = i_t &\Rightarrow \theta_{bi} = 0
と設定する。に可視化の結果を示す。
経路の可視化例
までできているなら、当該のコードでパラメータの設定が正しく行われているため、順伝搬による正解を別途計算することができる。例えば、の左上の例では、\(T=3\)であるから、
x_{i_3} = \theta_{e_3} f( \theta_{e_2} f( \theta_{e_1} f(
x_{i_0}
) + \theta_{bi_1}) + \theta_{bi_2}) + \theta_{bi_3}
となる。, の設定を代入すれば、次のようになる。
x_{i_3} = f(f( f(
x_{i_0}
) + 1) + 2) + 3
\(f\)がのSwishなどであるとすれば、順伝搬を行わずに実際に上記のように別途伝搬の結果を予測することができる。これにより、順伝播の結果が正しいかどうか検証することが可能となる。
いよいよ順伝搬を行なってみよう。4通りについて検証を行った結果を次に示す。\(x_{i_0} = i_0\)と設定した.活性化関数\(f\)にはSwishを用いた.Truth が理論値,FNN's x_iがANNにより計算された結果である.両者は一致しており,順伝搬法が正しく機能していることがわかる.
Truth: 5.36988
FNN's x_i: 5.36988, i = 26
Truth: 5.36988
FNN's x_i: 5.36988, i = 29
Truth: 5.17641
FNN's x_i: 5.17641, i = 26
Truth: 5.13695
FNN's x_i: 5.13695, i = 30
Truth: 5.10897
FNN's x_i: 5.10897, i = 24
Truth: 5.36988
FNN's x_i: 5.36988, i = 31
Truth: 5.13695
FNN's x_i: 5.13695, i = 27
Truth: 5.29656
FNN's x_i: 5.29656, i = 30
-
課題F1: 課題5のコードを拡張して,に基づき\(L, S\)の指示関数を計算する.\(S_{k}\)を求めるためには,\(\forall i, S_{k}[i]=1\)と初期化してから\(E\)の全要素の\((j, i)\)について,
S_{k}[j] \leftarrow S_{k}[j]S_{k-1}[i]
と更新を繰り返すとよい.くどいようだがもっと正確に言えば,\(t\)回目の繰り返しで\(\),\(j_t, i_t\)の組を\(E\)より取り出したとして,\(S_k\)の\(t\)回目の状態を\(\hat{S}^t\)と書いて,
j= j_t \Rightarrow \hat{S}^{t+1}[j] = \hat{S}^t[j]S_{k-1}[i_t], j\neq j_t \Rightarrow \hat{S}^{t+1}[j] = \hat{S}^t[j],
と更新する.そして\(t=T=\abr{E}\)にたいして\(S_{k} = \hat{S}^T\)とする.もちろん,2つ目の同じに保つという式についてはプログラム上でわざわざ計算しないで省く.
- 課題F2: とに関して以下を証明せよ。
iE = \cbr{(i, j); j\in F_i}, Ei = \cbr{(j, i); j\in B_i},
- 課題F3: に関して、\(i_T E = \emptyset\)となる有限の\(T\)が存在することを証明せよ。巡回であることと背理法を使うとよい.
-
課題F4: のように\(Ei, iE\)を可視化する.色は乱数で決定する.SVGの色の範囲である\(0, 255\)の範囲の乱数で赤緑青の値を決定する。
-
課題F5: に従い、細胞の系列を複数生成し、のように幾らかを可視化して動作を確認する。
- 課題F6: 順伝搬を行う。, に従い設定した回路のパラメータから予想される順伝搬結果と、実際の順伝搬結果を比較し一致することを示す。
回路の表現
回路で現象を表現する方法を紹介する.ここでは,回路で実数値を表現するものとする.つまり,回路の状態から実数値への変換関数を定義する.変換関数を\(\rz\)で表す.この変換関数として有名なものがLogistic 関数や,Softmax 関数である.回路による現象のモデル化には陰的なものと陽的なものがあるが,ここでは陽的な方法を紹介する.ANNによる陰的な表現は難しくまたまだ十分に研究が進んでおらず流動的であることから初頭的な教育の題材としては適さないため陽的な方法を扱う.
回路で現象を表現したら,現象を近似することをモデル化する.近似具合を実数値で表現する関数を\(\phi\)とする.\(\rz\)の取る値を\(Z\)と書けば,この\(\phi\)は\(Z\)から\(\sR\)への写像である.ここでは微分可能なものだけを考える.
数学の便利な慣習を多少紹介する.添字の集合\(N\)が与えられたとき,\(x\)が\(N\)の添字を取る実数の組であることを\(\sR^N\)と書く.\(N\)が\(1, 2,..., n\)のような連続した自然数の集合である場合は\(\sR^n\)とかく慣習がある.しかしこれも正確には\(\sR^\cbr{1,2,...,n}\)である.このような添字による値の組を一般には族と呼ぶ.詳しくは松坂和夫の「集合・位相入門」の添字に関する節で紹介されている.この記法は,便利である.たとえば\(a\in \sR^{A}\)と書けば\(a\)は\(i\in A\)の添字で\(a_i\)と書かれる部分要素を持つとわかる.
関数(写像)\(f\)が定義域\(A\)と終域\(B\)で定義されることを\(f: A\to B\)で書く(理系なら大学の1年時の数学で習うはず.).この慣習によれば,\(\rz\)は\(\rz: \sR^N\to Z\)と定義される関数である.この\(\rz: \sR^N \to Z\)という記法は,C++で言うところの引数と型だけを宣言したのと同じである.中身の具体的な内容については何も言及していないが,何も書かないよりはマシであるし言葉で述べるより短くて正確だからできるだけ記載しよう.そして\(\phi: Z\to\sR\)である.
回路の表現を細かく検証していきたいが,時間の都合上,省略し,次の誤差逆伝搬へ進む.
誤差逆伝搬
逆伝搬の定式化の難しさは,数式の慣習によるものである.本質的に難しいことではない.
逆伝搬の方程式をから導出する.これには合成関数の微分の連鎖規則を適用する.微分を適用するためには,連鎖している変換,つまり漸化式を関数で表さなければならないから,を,次のように関数\(\rx_i: \sR^N\to\sR^N\)で表現する.
x_i = \rx_i(x, \theta), \rx_i(x, \theta) = \sum_{j\in Ei}f(x_j)\theta_{e} + \theta_{bi}
また,誤差関数\(\phi\)はで説明した通り\(\rz\)を使う.\(\rz\)を挟むことには,現象の表現と回路のモデルを分離し,表現と回路それぞれを分割して考えることができるという利点があることに加え,もう一つ定式化における致命的な利点がある.\(\phi\)を直接\(x\)で表すと微分の連鎖規則を適用する時,細胞間で閉じた連鎖であるのか,\(\phi\)と細胞間の連鎖であるのか区別がつかず数式が曖昧になるという問題があるが\(\rz\)を介することでこれが解決できる,というものである.
細胞の状態が\(x\)であるとする.細胞\(i\)の状態に\(\varepsilon\)の微小変化があったとき,これが\(\phi\)に及ぼす影響が\(\varepsilon\)に比例するとしてその比例係数を\(\frac{\partial \phi}{\partial \rx_i}(x)\)と書く.変化量としては\(\frac{\partial \phi}{\partial \rx_i}(x)\varepsilon\)である.\(\phi\)は微分可能としているのでこのような微小変化に対する局所的な比例関係の表現が可能である.以降簡単のため引数\(x\)を省略する.\(i\)のこの変化は,\(F_i\)の細胞へのみ伝えられる.\(i\)の変化\(\varepsilon\)による\(j\)の変化を\(\frac{\partial \rx_j}{\partial \rx_i}\varepsilon\),\(\rz\)の変化を\(\frac{\partial \rz}{\partial \rx_i}\varepsilon\)と同様に書く.\(j\in F_i\)の変化\(\varepsilon_j\)が\(\phi\)に及ぼす影響を\(\frac{\partial \phi}{\partial \rx_j}\varepsilon_j\),\(\rz\)の変化が\(\phi\)へ及ぼす影響を\(\frac{\partial \phi}{\partial \rz}\varepsilon_{\rz}
\)と書けば,今\(\varepsilon_j = \frac{\partial \rx_j}{\partial \rx_i}\varepsilon, \varepsilon_\rz = \frac{\partial \rz}{\partial \rx_i}\varepsilon\)であるため,
\frac{\partial \phi}{\partial \rx_i}\varepsilon = \sum_{j\in iE}\frac{\partial \phi}{\partial \rx_j} \frac{\partial \rx_j}{\partial \rx_i}\varepsilon + \frac{\partial \phi}{\partial \rz}\frac{\partial \rz}{\partial \rx_i}\varepsilon
となる.一部微分について計算が可能で,
\frac{\partial \rx_j}{\partial \rx_i} = f'(x_j)\theta_{e}\quad \because ie = j
であるから\( \varepsilon\)を除して,
\frac{\partial \phi}{\partial \rx_i}= \sum_{j\in iE}\frac{\partial \phi}{\partial \rx_j}f'(x_j)\theta_{e} + \frac{\partial \phi}{\partial \rz}\frac{\partial \rz}{\partial \rx_i}(x)
となる.ちなみに,\(\rz\)を介さず\(\phi\)を直接\(\rx\)で構成した場合,以下を想像するだろう.
\frac{\partial \phi}{\partial \rx_i}= \sum_{j\in iE}\frac{\partial \phi}{\partial \rx_j}f'(x_j)\theta_{e} + \frac{\partial \phi}{\partial \rx_i}
左辺と右辺に\(\frac{\partial \phi}{\partial \rx_i}\)が出ていて良くわからないことになっている.たとえば
\phi = 0.5\sum_{i\in N} x_i^2
となっていたら
\frac{\partial \phi}{\partial \rx_i}= \sum_{j\in iE}\frac{\partial \phi}{\partial \rx_j}f'(x_j)\theta_{e} + x_i
である.これは\(\phi\)への\(i\)からの直接の寄与分と,\(i\)以外を経由した寄与の和となっているから正しい式であるとわかるだろう.しかし同じことを書いたと思われるは矛盾している.結局連鎖で書かれている\(\sum\)の部分と同じ規則で掛けるように\(\rz\)を挟まなければ,連鎖により一般的に書くことはできない,ということである.すなわち右辺はすべて連鎖で書かれなければならないから,\(\frac{\partial \phi}{\partial \rx_i}\)という連鎖でない直接の偏微分が現れることはできない.よっての形式を用いるのである.
ここまでくれば,により逆伝搬の方程式が構築できていて,形がの逆になっていることから,と同様に定数時間で終了する逆伝搬の計画を作ることができる.具体的に,\(k=1,2,...,K\)について,次にように\(L'_k\)を求めて計画を立てることができる.
S'_{k} = \cbr{i; iE\subset S'_{k-1}, i\in N}, L'_{k} = S'_{k} - S'_{k-1}, S'_0 = \emptyset
この集合列の細胞を順に対してを適用する.もちろんこの逆伝搬を始める前にに従い順伝搬を計算して\(x\)を求めなければならない.また,\(\frac{\partial \phi}{\partial \rz}\frac{\partial \rz}{\partial \rx_i}\)をすべての\(i\in N\)について計算しなければならない.その後,の計画に従い\(\frac{\partial \phi}{\partial \rx_i}\)を計算する.
を適用して得た計画の可視化をに示す.