Pythonと機械学習

Pythonも機械学習も初心者ですが、頑張ってこのブログで勉強してこうと思います。

行列演算と計算グラフ

目次

はじめに

  • 多層パーセプトロンの実装を考える際に、テンソルの全ての要素を考えるのは結構骨が折れます。

  • 計算途中でインデックスを書き間違えたりすると、かなり悲惨な目にあいます。

  • テンソル要素の2つのインデックスをまとめ上げた行列で考える方が楽で、プログラムを書く時も、行列演算のライブラリを使った方が簡潔で演算速度も速いです。

  • ただ逆伝搬を考える際に、行列で偏微分した損失関数 L のチェーンルールでの展開は、スカラー偏微分した時と同じようにできるわけではないので注意が必要です。

  • また、ネットワークが複雑になった場合は、大量に計算式を書くことになるので、行列で書いたとしても訳が分からなくなってしまいます。

  • そういった場合は、計算グラフというものを使うと計算がしやすくなります。

  • 計算グラフというのは、演算を数式では無く、ただ絵に書いて表現しただけの物なのですが、いくつかの行列演算について順伝搬と逆伝搬のルールをまとめておくと、複雑なネットワークになった場合でも楽に計算ができるようになります。

  • 数式で書くよりも絵で描いた方が分かりやすいという訳です。

  • ここではいくつかの行列演算ルールを計算グラフでまとめて、最後に多層パーセプトロンの順伝搬と逆伝搬を計算グラフで表してみたいと思います。

行列と行列の和

  • 順伝搬時に、行列 \mathbf{A}\mathbf{B} を足して \mathbf{C} とした場合を考えます。

\displaystyle
\mathbf{C}
= \mathbf{A} + \mathbf{B}
\tag{1}

  • 要素で書いた場合は、

\displaystyle
c_{ij}
= a_{ij} + b_{ij}
\tag{2}

  • これを計算グラフで書くと以下のようになります。
  • では今度は \frac{\partial L}{\partial \mathbf{C}} が逆伝搬でどの様に \frac{\partial L}{\partial \mathbf{A}}\frac{\partial L}{\partial \mathbf{B}} に展開されるか見ていきましょう。

\displaystyle
\begin{eqnarray*}
\frac{\partial L}{\partial \mathbf{A}}
&=&
\frac{\partial L}{\partial a_{ij}}
\\
&=&
\sum_{k} \sum_{l}
\frac{\partial L}{\partial c_{kl}}
\frac{\partial c_{kl}}{\partial a_{ij}}
\\
&=&
\sum_{k} \sum_{l}
\frac{\partial L}{\partial c_{kl}}
\frac{\partial (a_{kl}+b_{kl})}{\partial a_{ij}}
\\
&=&
\frac{\partial L}{\partial c_{ij}}
\frac{\partial (a_{ij}+b_{ij})}{\partial a_{ij}}
~ ~ ~ ~\small{(\because k=i,l=jの項のみが残る)}
\\
&=&
\frac{\partial L}{\partial c_{ij}}
\\
&=&
\frac{\partial L}{\partial \mathbf{C}}
\\
\end{eqnarray*}
\tag{3}

  • 同様に計算すると、

\displaystyle
\begin{eqnarray*}
\frac{\partial L}{\partial \mathbf{B}}
&=&
\frac{\partial L}{\partial \mathbf{C}}
\\
\end{eqnarray*}
\tag{4}

  • これを計算グラフで書くと、
  • つまり順伝搬での行列同士の和の演算は、逆伝搬では分岐になります。

行列とベクトルの和

  • 順伝搬時に、行列 \mathbf{A} と横ベクトル \mathbf{b} を足して行列 \mathbf{C} とした場合を考えます。

  • 全結合時の閾値の演算になります。


\displaystyle
\mathbf{C}
= \mathbf{A} + \mathbf{b}
\tag{5}

  • 本来は、行列にベクトルを足すと言うのは変ですが、まあnumpyでもこのまま演算できるので、あまり気にせず行きましょう。

  • 要素で書いた場合は以下の様な演算です。


\displaystyle
c_{ij}
= a_{ij} + b_{j}
\tag{6}

  • これを計算グラフで書くと、
  • 逆伝搬時は、

\displaystyle
\begin{eqnarray*}
\frac{\partial L}{\partial \mathbf{A}}
&=&
\frac{\partial L}{\partial a_{ij}}
\\
&=&
\sum_{k} \sum_{l}
\frac{\partial L}{\partial c_{kl}}
\frac{\partial c_{kl}}{\partial a_{ij}}
\\
&=&
\sum_{k} \sum_{l}
\frac{\partial L}{\partial c_{kl}}
\frac{\partial (a_{kl}+b_{l})}{\partial a_{ij}}
\\
&=&
\frac{\partial L}{\partial c_{ij}}
\frac{\partial (a_{ij}+b_{j})}{\partial a_{ij}}
~ ~ ~ ~\small{(\because k=i,l=jの項のみが残る)}
\\
&=&
\frac{\partial L}{\partial c_{ij}}
\\
&=&
\frac{\partial L}{\partial \mathbf{C}}
\\
\end{eqnarray*}
\tag{7}



\displaystyle
\begin{eqnarray*}
\frac{\partial L}{\partial \mathbf{b}}
&=&
\frac{\partial L}{\partial b_{j}}
\\
&=&
\sum_{k} \sum_{l}
\frac{\partial L}{\partial c_{kl}}
\frac{\partial c_{kl}}{\partial b_{j}}
\\
&=&
\sum_{k} \sum_{l}
\frac{\partial L}{\partial c_{kl}}
\frac{\partial (a_{kl}+b_{l})}{\partial b_{j}}
\\
&=&
\sum_{k}
\frac{\partial L}{\partial c_{kj}}
\frac{\partial (a_{kj}+b_{j})}{\partial b_{j}}
~ ~ ~ ~\small{(\because l=jの項のみが残る)}
\\
&=&
\sum_{k}
\frac{\partial L}{\partial c_{kj}}
\\
&=&
\left[1,\cdots,1 \right]
\frac{\partial L}{\partial \mathbf{C}}
\\
\end{eqnarray*}
\tag{9}

  • これを計算グラフで書くと、
  • \frac{\partial L}{\partial \mathbf{A}} はそのまま分岐しますが、 \frac{\partial L}{\partial \mathbf{b}}\left[1,\cdots,1 \right] を左からかけて分岐します。

分岐

  • 順伝搬時に分岐した場合を考えてみます。

  • 行列 \mathbf{A} が順伝搬時に行列 \mathbf{B}\mathbf{C} に分岐する場合、


\displaystyle
\mathbf{B}
= \mathbf{A}
\\
\mathbf{C}
= \mathbf{A}
\tag{10}

  • 要素で書くと、

\displaystyle
b_{ij}
= a_{ij}
\\
c_{ij}
= a_{ij}
\tag{11}

  • 逆伝搬時ですが、 \mathbf{A} を基準に考えると L\mathbf{B}\mathbf{C} の合成関数になるので、

\displaystyle
\begin{eqnarray*}
\frac{\partial L}{\partial \mathbf{A}}
&=&
\frac{\partial L}{\partial a_{ij}}
\\
&=&
\sum_{k} \sum_{l}
\frac{\partial L}{\partial b_{kl}}
\frac{\partial b_{kl}}{\partial a_{ij}}
+
\sum_{p} \sum_{q}
\frac{\partial L}{\partial c_{pq}}
\frac{\partial c_{pq}}{\partial a_{ij}}
\\
&=&
\sum_{k} \sum_{l}
\frac{\partial L}{\partial b_{kl}}
\frac{\partial a_{kl}}{\partial a_{ij}}
+
\sum_{p} \sum_{q}
\frac{\partial L}{\partial c_{pq}}
\frac{\partial a_{pq}}{\partial a_{ij}}
\\
&=&
\frac{\partial L}{\partial b_{ij}}
\frac{\partial a_{ij}}{\partial a_{ij}}
+
\frac{\partial L}{\partial c_{ij}}
\frac{\partial a_{ij}}{\partial a_{ij}}
~ ~ ~ ~\small{(\because k=i,l=j, p=i,q=jの項のみが残る)}
\\
&=&
\frac{\partial L}{\partial b_{ij}}
+
\frac{\partial L}{\partial c_{ij}}
\\
&=&
\frac{\partial L}{\partial \mathbf{B}}
+
\frac{\partial L}{\partial \mathbf{C}}
\\
\end{eqnarray*}
\tag{12}

  • つまり逆伝搬時は和になります。

行列と行列の積

  • 順伝搬時に行列 \mathbf{A} を左から行列 \mathbf{B} にかけて、行列 \mathbf{C} になっている場合です。

  • 入力と重みの掛け算を想定しています。


\displaystyle
\mathbf{C}
= \mathbf{A} \mathbf{B}
\tag{13}

  • 以下要素表記です。

\displaystyle
c_{ij}
= \sum_{k} a_{ik}b_{kj}
\tag{14}

  • 計算グラフでは、ドット記号 \cdot で行列の積を表しておきます。また、掛け方の順序がわかる様に、掛け算の左側はL、右側はRの記号を書いておきます。
  • 逆伝搬時は、

\displaystyle
\begin{eqnarray*}
\frac{\partial L}{\partial \mathbf{A}}
&=&
\frac{\partial L}{\partial a_{ij}}
\\
&=&
\sum_{k} \sum_{l}
\frac{\partial L}{\partial c_{kl}}
\frac{\partial c_{kl}}{\partial a_{ij}}
\\
&=&
\sum_{k} \sum_{l}
\frac{\partial L}{\partial c_{kl}}
\sum_{p}
\frac{\partial a_{kp}b_{pl}}{\partial a_{ij}}
\\
&=&
\sum_{l}
\frac{\partial L}{\partial c_{il}}
\frac{\partial a_{ij}b_{jl}}{\partial a_{ij}}
~ ~ ~ ~\small{(\because k=i,p=jの項のみが残る)}
\\
&=&
\sum_{l}
\frac{\partial L}{\partial c_{il}}
b_{jl}
\\
&=&
\sum_{l}
\frac{\partial L}{\partial c_{il}}
b_{lj}^{T}
\\
&=&
\frac{\partial L}{\partial \mathbf{C}}
\mathbf{B}^{T}
\end{eqnarray*}
\tag{15}



\displaystyle
\begin{eqnarray*}
\frac{\partial L}{\partial \mathbf{B}}
&=&
\frac{\partial L}{\partial b_{ij}}
\\
&=&
\sum_{k} \sum_{l}
\frac{\partial L}{\partial c_{kl}}
\frac{\partial c_{kl}}{\partial b_{ij}}
\\
&=&
\sum_{k} \sum_{l}
\frac{\partial L}{\partial c_{kl}}
\sum_{p}
\frac{\partial a_{kp}b_{pl}}{\partial b_{ij}}
\\
&=&
\sum_{k}
\frac{\partial L}{\partial c_{kj}}
\frac{\partial a_{ki}b_{ij}}{\partial b_{ij}}
~ ~ ~ ~\small{(\because p=i,l=jの項のみが残る)}
\\
&=&
\sum_{k}
\frac{\partial L}{\partial c_{kj}}
a_{ki}
\\
&=&
\sum_{k}
a_{ik}^{T}
\frac{\partial L}{\partial c_{kj}}
\\
&=&
\mathbf{A}^{T}
\frac{\partial L}{\partial \mathbf{C}}
\end{eqnarray*}
\tag{16}

  • \mathbf{A}\mathbf{B} の転置をとって \frac{\partial L}{\partial \mathbf{C}} にかける形になります。かける順序に注意です。

行列と行列のアダマール

  • 行列 \mathbf{A}\mathbf{B} の同じ場所の要素同士を掛け算したものが行列 \mathbf{C} になっている場合です。

\displaystyle
\mathbf{C}
= \mathbf{A} \circ \mathbf{B}
\tag{17}

  • 要素表記では、

\displaystyle
c_{ij}= a_{ij} b_{ij}
\tag{18}

  • 計算グラフは以下の様になります。アダマール積を \circ の記号で表記しておきます。こちらは特に掛け算の順番は気にする必要がありません。
  • 逆伝搬時は、

\displaystyle
\begin{eqnarray*}
\frac{\partial L}{\partial \mathbf{A}}
&=&
\frac{\partial L}{\partial a_{ij}}
\\
&=&
\sum_{k} \sum_{l}
\frac{\partial L}{\partial c_{kl}}
\frac{\partial c_{kl}}{\partial a_{ij}}
\\
&=&
\sum_{k} \sum_{l}
\frac{\partial L}{\partial c_{kl}}
\frac{\partial a_{kl}b_{kl}}{\partial a_{ij}}
\\
&=&
\frac{\partial L}{\partial c_{ij}}
\frac{\partial a_{ij}b_{ij}}{\partial a_{ij}}
~ ~ ~ ~\small{(\because k=i,l=jの項のみが残る)}
\\
&=&
\frac{\partial L}{\partial c_{ij}}
b_{ij}
\\
&=&
\frac{\partial L}{\partial \mathbf{C}}
\circ
\mathbf{B}
\end{eqnarray*}
\tag{19}



\displaystyle
\begin{eqnarray*}
\frac{\partial L}{\partial \mathbf{B}}
&=&
\frac{\partial L}{\partial b_{ij}}
\\
&=&
\sum_{k} \sum_{l}
\frac{\partial L}{\partial c_{kl}}
\frac{\partial c_{kl}}{\partial b_{ij}}
\\
&=&
\sum_{k} \sum_{l}
\frac{\partial L}{\partial c_{kl}}
\frac{\partial a_{kl}b_{kl}}{\partial b_{ij}}
\\
&=&
\frac{\partial L}{\partial c_{ij}}
\frac{\partial a_{ij}b_{ij}}{\partial b_{ij}}
~ ~ ~ ~\small{(\because k=i,l=jの項のみが残る)}
\\
&=&
\frac{\partial L}{\partial c_{ij}}
a_{ij}
\\
&=&
\frac{\partial L}{\partial \mathbf{C}}
\circ
\mathbf{A}
\end{eqnarray*}
\tag{20}

活性化関数

  • 行列 \mathbf{A} の各要素を活性化関数 f で演算したものが、行列 \mathbf{B} になっているものです。

  • シグモイド関数tanh関数、ReLU関数などの演算を想定しています。


\displaystyle
\mathbf{B}
= f(\mathbf{A})
\tag{21}

  • 以下要素表記です。

\displaystyle
 b_{ij}= f(a_{ij})
 \tag{22}
 
 
  • 計算グラフで書くと、
  • 逆伝搬時は、

\displaystyle
\begin{eqnarray*}
\frac{\partial L}{\partial \mathbf{A}}
&=&
\frac{\partial L}{\partial a_{ij}}
\\
&=&
\sum_{k} \sum_{l}
\frac{\partial L}{\partial b_{kl}}
\frac{\partial b_{kl}}{\partial a_{ij}}
\\
&=&
\sum_{k} \sum_{l}
\frac{\partial L}{\partial b_{kl}}
\frac{\partial f(a_{kl})}{\partial a_{ij}}
\\
&=&
\frac{\partial L}{\partial b_{ij}}
\frac{\partial f(a_{ij})}{\partial a_{ij}}
~ ~ ~ ~\small{(\because k=i,l=jの項のみが残る)}
\\
&=&
\frac{\partial L}{\partial b_{ij}}
f'(a_{ij})
\\
&=&
\frac{\partial L}{\partial \mathbf{B}}
\circ
f'(\mathbf{A})
\end{eqnarray*}
\tag{23}

ソフトマックス関数

  • 行列 \mathbf{A} をソフトマックス関数 f で演算し、行列 \mathbf{B} とする場合です。

  • 行列演算では表記するのはちょっと難しいでが、無理やり書くと、


\displaystyle
\begin{eqnarray*}
\mathbf{B}
&=&
f(\mathbf{A})
\\
&=&
e^{\mathbf{A}} / \left(e^{\mathbf{A}}
\left[
    \begin{array}{c}
        1 \\
        \vdots \\
        1 \\
    \end{array}
\right]
\right)
\end{eqnarray*}
\tag{24}

  • / は行列の要素を逆数にしてアダマール積でかける演算です。一般的にこの演算を表す記号はありません。無理やり表記です。

  • 要素で書くと、


\displaystyle
\begin{eqnarray*}
b_{ij}
&=& f(a_{ij})
\\
&=& \frac{e^{a_{ij}}}{\displaystyle\sum_{k} e^{a_{ik}}}
\\
\end{eqnarray*}
\tag{25}

  • 計算グラフでは、特に詳細に表記するのはやめときましょう。活性化関数の時と同じように書いときます。ソフトマックス関数の演算であることが分かるように、下にsoftmaxとでも書いておきましょう。
  • 次に逆伝搬ですが、こちらも行列表記にするのは結構難しいです。

\displaystyle
\begin{eqnarray*}
\frac{\partial L}{\partial \mathbf{A}}
&=&
\frac{\partial L}{\partial a_{ij}}
\\
&=&
\sum_{k} \sum_{l}
\frac{\partial L}{\partial b_{kl}}
\frac{\partial b_{kl}}{\partial a_{ij}}
\\
&=&
\sum_{k} \sum_{l}
\frac{\partial L}{\partial b_{kl}}
\frac{\partial }{\partial a_{ij}}
\left(
\frac{e^{a_{kl}}}{\sum_{p} e^{a_{kp}}}
\right)
\\
&=&
\sum_{l}
\frac{\partial L}{\partial b_{il}}
\frac{\partial }{\partial a_{ij}}
\left(
\frac{e^{a_{il}}}{\sum_{p} e^{a_{ip}}}
\right)
~ ~ ~ ~\small{(\because k=iの項のみが残る)}
\end{eqnarray*}
\tag{26}


\displaystyle
\begin{eqnarray*}
\sum_{l}
\frac{\partial L}{\partial b_{il}}
\frac{\partial }{\partial a_{ij}}
\left(
\frac{e^{a_{il}}}{\sum_{p} e^{a_{ip}}}
\right)
&=&
\sum_{l}
\frac{\partial L}{\partial b_{il}}
b_{ij}\left(\delta_{jl} - b_{il} \right)
\\
&=&
b_{ij}
\left(
\sum_{l}
\frac{\partial L}{\partial b_{il}}
\delta_{jl}
-
\sum_{l}
\frac{\partial L}{\partial b_{il}}
b_{il}
\right)
\\
&=&
b_{ij}
\left(
\sum_{l}
\frac{\partial L}{\partial b_{il}}
\delta_{lj}^{T}
-
\sum_{l}
\frac{\partial L}{\partial b_{il}}
b_{li}^{T}
\right)
\\
&=&
\mathbf{B} \circ
\left(
\frac{\partial L}{\partial \mathbf{B}}
\mathbf{E}^{T}
-
diag
\left(
\frac{\partial L}{\partial \mathbf{B}}
\mathbf{B}^{T}
\right)
\right)
\\
&=&
\mathbf{B} \circ
\left(
\frac{\partial L}{\partial \mathbf{B}}
-
diag
\left(
\frac{\partial L}{\partial \mathbf{B}}
\mathbf{B}^{T}
\right)
\right)
\end{eqnarray*}
\tag{27}

  • diag \left(\cdot \right) は、対角成分を縦ベクトルに並べたもので、まあ無理やり表記です。

  • 逆伝搬の計算グラフを無理やり書いてもいいですが、ぐちゃぐちゃになって余計わかりずらくなるので、交差エントロピーと一緒にして書くとよいです。

  • 一応計算グラフにすると、

交差エントロピー


\displaystyle
\begin{eqnarray*}
L
&=&
g(\mathbf{Y},\mathbf{B})
\\
&=&
-
\left[
    \begin{array}{c}
        1 & \cdots & 1
    \end{array}
\right]
\left(
\mathbf{Y} \circ \log{\mathbf{B}}
\right)
\left[
    \begin{array}{ccc}
        1 \\
        \vdots\\
        1\\
    \end{array}
\right]
\end{eqnarray*}
\tag{28}

  • 要素で書くと、

\displaystyle
L
= -\sum_{i} \sum_{j} y_{ij} \log{b_{ij}}
\tag{29}

  • 計算グラフではこちらも詳細には書かずに g で表記しておいて、下にcross entropyとでも書いておきましょう。ソフトマックス関数と一緒にして書いておくことにします。
  • 次に逆伝搬の計算です。

\displaystyle
\begin{eqnarray*}
\frac{\partial L}{\partial \mathbf{B}}
&=&
\frac{\partial L}{\partial b_{ij}}
\\
&=&
-
\frac{\partial}{\partial b_{ij}}
\left(
\sum_{k} \sum_{l} y_{kl} \log{b_{kl}}
\right)
\\
&=&
-
\sum_{k} \sum_{l} y_{kl}
\frac{\partial \log{b_{kl}}}{\partial b_{ij}}
\\
&=&
-
y_{ij}
\frac{\partial \log{b_{ij}}}{\partial b_{ij}}
~ ~ ~ ~\small{(\because k=i,l=jの項のみが残る)}
\\
&=&
-\frac{y_{ij} }{b_{ij}}
\\
&=&
-\mathbf{Y}/\mathbf{B}
\end{eqnarray*}
\tag{30}

  • (24)式同様、 /\mathbf{B}\mathbf{B} の要素を逆数にして、アダマール積でかけるという意味です。

  • ただし、 \mathbf{B} の要素が1つでもゼロになるとゼロ割りエラーになりますし、ソフトマックス関数の逆伝搬の行列表記も厳しいものがあるので、ソフトマックス関数と交差エントロピーを一緒にして、逆伝搬を考えるとよいです。

  • (27)式の、 \frac{\partial L}{\partial \mathbf{B}} に(30)式を代入すると、


\displaystyle
\begin{eqnarray*}
\frac{\partial L}{\partial \mathbf{A}}
&=&
-
\mathbf{B} \circ
\left(
\mathbf{Y}/\mathbf{B}
-
diag
\left(
\left(
\mathbf{Y}/\mathbf{B}
\right)
\mathbf{B}^{T}
\right)
\right)
\\
&=&
-
\left(
\mathbf{B} \circ
\mathbf{Y}/\mathbf{B}
-
\mathbf{B} \circ
diag
\left(
\left(
\mathbf{Y}/\mathbf{B}
\right)
\mathbf{B}^{T}
\right)
\right)
\\
&=&
-
\left(
\mathbf{Y}
-
\mathbf{B} \circ
diag
\left(
\left(
\mathbf{Y}/\mathbf{B}
\right)
\mathbf{B}^{T}
\right)
\right)
\end{eqnarray*}
\tag{31}

  • diag\left(\left(\mathbf{Y}/\mathbf{B}\right)\mathbf{B}^{T}\right) をどうしよう?と思いますが、 onehot行列である \mathbf{Y} には \left(\mathbf{Y}/\mathbf{B}\right)\mathbf{B}^{T} を計算すると、その対角成分がすべて1になるという性質があるみたいです。

  • 以下確認用スクリプト

  • 実行結果です。ランダムに作成した \mathbf{Y}\mathbf{B} ですが、 \left(\mathbf{Y}/\mathbf{B}\right)\mathbf{B}^{T} の対角成分がちゃんと1になっています。
----------------------------------------
B:
[[ 0.69070455  0.18605051  0.74967903]
 [ 0.38630318  0.1353262   0.85122728]
 [ 0.34214172  0.79788061  0.18338467]]
----------------------------------------
Y:
[[ 1.  0.  0.]
 [ 0.  0.  1.]
 [ 0.  1.  0.]]
----------------------------------------
dLdB:
[[ 1.44779704  0.          0.        ]
 [ 0.          0.          1.17477438]
 [ 0.          1.25332034  0.        ]]
----------------------------------------
np.dot(dLdB, B.T):
[[ 1.          0.55928861  0.49535176]
 [ 0.88070372  1.          0.21543561]
 [ 0.23318088  0.16960708  1.        ]]
----------------------------------------
np.diag(np.dot(dLdB, B.T)):
[ 1.  1.  1.]
  • 事前に要素で計算していたので、そうなるのはわかっていましたが、なんか不思議な発見ですね。

  • よって(31)式の続きは、


\displaystyle
\begin{eqnarray*}
\frac{\partial L}{\partial \mathbf{A}}
&=&
-
\left(
\mathbf{Y}
-
\mathbf{B} \circ
diag
\left(
\left(
\mathbf{Y}/\mathbf{B}
\right)
\mathbf{B}^{T}
\right)
\right)
\\
&=&
-
\left(
\mathbf{Y}
-
\mathbf{B} \circ
\left[
    \begin{array}{ccc}
        1 \\
        \vdots\\
        1\\
    \end{array}
\right]
\right)
\\
&=&
-
\left(
\mathbf{Y}
-
\mathbf{B}
\right)
\end{eqnarray*}
\tag{32}

  • すごく簡単にかけました。

多層パーセプトロンの計算グラフ

  • 最後に多層パーセプトロンの順伝搬の計算グラフから、逆伝搬の計算グラフを機械的に作成し、逆伝搬の計算式を求めてみましょう。

  • 順伝搬時の中間層( \lambda 層から \lambda+1 層への演算)です。

  • 先ず計算式を先に書いてから、その後順伝搬時の計算グラフを組み立てていきます。


\displaystyle
\mathbf{Z}^{(\lambda)}
= \mathbf{\Phi}^{(\lambda)}\mathbf{W}^{(\lambda)}+\mathbf{b}^{(\lambda)}
\tag{33}


\displaystyle
\mathbf{\Phi}^{(\lambda+1)}
= f^{(\lambda)}(\mathbf{Z}^{(\lambda)})
\tag{34}

  • 順伝搬時の出力層 (全部で \Lambda 層あるとしています)です。ソフトマックス関数と交差エントロピーが後ろにつきます。

\displaystyle
\mathbf{Z}^{(\Lambda-1)}
= \mathbf{\Phi}^{(\Lambda-1)}\mathbf{W}^{(\Lambda-1)}+\mathbf{b}^{(\Lambda-1)}
\tag{35}


\displaystyle
\mathbf{\Phi}^{(\Lambda)}
= f^{(\Lambda-1)}(\mathbf{Z}^{(\Lambda-1)})
\tag{36}


\displaystyle
L
= g(\mathbf{Y}, \mathbf{\Phi}^{(\Lambda)})
\tag{37}

  • 作成した順伝搬の計算グラフをもとに、今度は逆伝搬の計算グラフを書いていきます。

  • 順伝搬の計算グラフを各演算要素ごとに分解して考える事で、逆伝搬の計算グラフを機械的に書く事が出来ます。

  • 逆伝搬時の中間層の計算グラフです。形式的に \mathbf{\Delta}^{(\lambda)}\equiv\frac{\partial L}{\partial \mathbf{Z}^{(\lambda)}} と表記します。

  • 活性化関数演算、行列とベクトルの和の演算、行列同士の積の演算の3つの演算要素の逆伝搬を組み合わせて行きます。

  • 計算グラフが出来上がると、逆伝搬の計算式は容易に算出できます。

\displaystyle
\begin{eqnarray*}
\mathbf{\Delta}^{(\lambda)}
&\equiv&
\frac{\partial L}{\partial \mathbf{Z}^{(\lambda)}}
\\
&=& \frac{\partial L}{\partial \mathbf{\Phi}^{(\lambda+1)}}
\circ
f^{'(\lambda)}(\mathbf{Z}^{(\lambda)})
\end{eqnarray*}
\tag{38}


\displaystyle
\frac{\partial L}{\partial \mathbf{b}^{(\lambda)}}
= \left[1,\cdots,1\right]\mathbf{\Delta}^{(\lambda)}
\tag{39}


\displaystyle
\frac{\partial L}{\partial \mathbf{W}^{(\lambda)}}
= \mathbf{\Phi}^{(\lambda)T}\mathbf{\Delta}^{(\lambda)}
\tag{40}


\displaystyle
\frac{\partial L}{\partial \mathbf{\Phi}^{(\lambda)}}
= \mathbf{\Delta}^{(\lambda)}\mathbf{W}^{(\lambda)T}
\tag{41}

  • 逆伝搬時の出力層です。ソフトマックス関数と交差エントロピーの逆伝搬をくっつけてます。

\displaystyle
\begin{eqnarray*}
\mathbf{\Delta}^{(\Lambda-1)}
&\equiv&
\frac{\partial L}{\partial \mathbf{Z}^{(\Lambda-1)}}
\\
&=&
-
\left(
\mathbf{Y}-\mathbf{\Phi}^{(\Lambda)}
\right)
\end{eqnarray*}
\tag{42}


\displaystyle
\frac{\partial L}{\partial \mathbf{b}^{(\Lambda-1)}}
= \left[1,\cdots,1\right]\mathbf{\Delta}^{(\Lambda-1)}
\tag{43}


\displaystyle
\frac{\partial L}{\partial \mathbf{W}^{(\Lambda-1)}}
= \mathbf{\Phi}^{(\Lambda-1)T}\mathbf{\Delta}^{(\Lambda-1)}
\tag{44}


\displaystyle
\frac{\partial L}{\partial \mathbf{\Phi}^{(\Lambda-1)}}
= \mathbf{\Delta}^{(\Lambda-1)}\mathbf{W}^{(\Lambda-1)T}
\tag{45}