3歩進んで2歩下がる

ゼロつく3/ステップ5 バックプロパゲーションの理論

順伝播

例として三つの関数 \(A(x)\)、\(B(x)\)、\(C(x)\)の合成関数\(y=F(x)=C(B(A(x)))\)を考える。関数\(F(x)\)は次のようなブロックに分けることができる。

\[a = A(x)\]

\[b = B(a)\]

\[y=C(b)\]

この一連の流れをブロック図で書くと次のようになる。変数を赤色の背景の円形のノードで、関数を青色の背景の長方形のノードで表している。ブロック図を見ると変数\(x\)が伝搬していく様子が良く表されており、このように入力側の変数\(x\)から出力側の変数である\(y\)に向かう処理の流れを順伝播という。

合成関数の微分

合成関数\(y=F(x)\)の微分はチェインルールにより次のように各変数をブロック図において一つ前の変数で微分したものを掛け合わせたものとなる。

\[\frac{\mathrm{d}y}{\mathrm{d}x} = \frac{\mathrm{d}a}{\mathrm{d}x}\times \frac{\mathrm{d}b}{\mathrm{d}a} \times \frac{\mathrm{d}y}{\mathrm{d}b} \times \frac{\mathrm{d}y}{\mathrm{d}y}\]

バックプロパゲーションの肝

合成関数の微分を計算するには各変数の微分が必要となる。そこで順伝播の時に各変数の微分値を先に計算しておき、合成関数の微分を実際に計算するときには、順伝搬の時に求めておいた各変数の微分値を使って掛け合わせるだけで簡単に微分が計算できちゃう!というのがバックプロパゲーションを使った微分の肝である。

どうゆう事なのか具体的な関数で考えてみると分かりやすいのでテキストに倣って次の関数で考えていく。

\[y= F(x)=(e^{x^2})^2\]

この合成関数は次のようなブロックに分けられる。

\[a = \mathrm{Square}(x) = x^2\]

\[b = \mathrm{Exp}(a) = e^a\]

\[y=\mathrm{Square}(b) = b^2\]

ブロック図は次のようになる。

ここで順伝播で各関数の出力を得るときに微分値も一緒に計算しておく。例えば\(x=3\)での\(y=F(x)\)の微分値\(y^′(x=3)\)を求めたいとする。以下、バックプロパゲーションのプロセスを順に見ていく。

Step1-1. \(a=\mathrm{Square}(x)=x^2\)の順伝播の出力を計算する。

\[x=3\quad のとき\quad a=\mathrm{Square}(x=3)=9\]

Step1-2. \(x=3\)での\(a=x^2\)の微分値を計算する。

\[\left.\frac{\mathrm{d}a}{\mathrm{d}x}\right|_{x=3}= \left.2x \right|_{x=3} = 6\]

Step2-1. \(b = \mathrm{Exp}(a) = e^a (= e^{x^2}) \)の順伝播の出力を計算する。

\[x=3\quad のとき \quad a=9 \quad なので\quad b=\mathrm{Exp}(a=9)=e^9\]

Step2-2. \(a=9\)での\(b=e^a\)の微分値を計算する。

\[\left.\frac{\mathrm{d}b}{\mathrm{d}a}\right|_{a=9(x=3)} = \left.e^a \right|_{a=9} = e^9\]

Step3-1. \(y=\mathrm{Square}(b)=b^2(=(e^{x^2})^2)\)の順伝播出力を計算する。

\[x=3\quad のとき\quad b=e^9\quad なので\quad y=\mathrm{Square}(b=e^9)=e^{18}\]

Step3-2. \(b=e^9\)での\(y=b^2\)の微分値を計算する。

\[\left.\frac{\mathrm{d}y}{\mathrm{d}b}\right|_{b=e^9(x=3)} = \left.2b \right|_{b=e^9} = 2e^9\]

Step4. バックプロパゲーションで\(F(x)\)の微分を計算する。

順伝搬の過程で各変数の微分値は計算しているのでチェインルールにより\(F(x)\)の\(x=3\)での微分を簡単に求めることができる。(\(\frac{\mathrm{d}y}{\mathrm{d}y}=1\)である。)

\[\begin{align}\left. \frac{\mathrm{d}y}{\mathrm{d}x} \right|_{x=3} &= \left. \frac{\mathrm{d}a}{\mathrm{d}x}\times \frac{\mathrm{d}b}{\mathrm{d}a} \times \frac{\mathrm{d}y}{\mathrm{d}b}\times \frac{\mathrm{d}y}{\mathrm{d}y}\right|_{x=3}\\&=6\times e^9\times 2e^9 \times 1\\ &=12e^{18} \end{align}\]

こうして微分値を計算することができた。バックプロパゲーション(逆伝播)の名前の所以についてだが、実装の段階で順伝搬の出力側の変数である\(y\)の微分\(\mathrm{d}y/\mathrm{d}y\)から順に各変数の微分値を取り出して入力側の変数である\(x\)の方向へと各変数の微分値を掛けていくことによる。

\[ \frac{\mathrm{d}a}{\mathrm{d}x}\frac{\mathrm{d}b}{\mathrm{d}a}\frac{\mathrm{d}y}{\mathrm{d}b}\frac{\mathrm{d}y}{\mathrm{d}y} \leftarrow\frac{\mathrm{d}b}{\mathrm{d}a}\frac{\mathrm{d}y}{\mathrm{d}b}\frac{\mathrm{d}y}{\mathrm{d}y} \leftarrow \frac{\mathrm{d}y}{\mathrm{d}b}\frac{\mathrm{d}y}{\mathrm{d}y}\leftarrow \frac{\mathrm{d}y}{\mathrm{d}y}\]

まとめ

バックプロパゲーションでは順伝播の時に各変数の微分値も計算しておき、それを使うことで合成関数の微分を簡単に行うことができる。