誤差逆伝播法の数式の説明なんて世の中にたくさんあると思うが、理解のために自分でもまとめる。 特に添字などのミスがあると思うので、見つけ次第修正する。

誤差逆伝播の計算 (1)

問題設定

入力を第 00 層、出力を第 LL 層とする。ニューラルネットワークはよく次のようなグラフで描かれる。 円がノードを表す。ノードに入っていく矢印が入力、出ていく矢印が出力を表す。

lljj 番目のノードの出力を yjly_j^l とおく (注意: この記事では yjly_j^{l}ll は添字を表すものとする。累乗ではない。これから現れる変数についても同様)。これはある関数 flf_l を用いて以下の式で表される。flf_l は活性化関数と呼ばれる。

yjl=fl(ujl)y_j^l = f_l\left( u_j^{l} \right)
ただし、ujlu_j^{l} は前の層の出力を用いて計算される線形和で、以下のように定義される。
ujl=iwijlyil1u_j^l = \sum_{i} w_{ij}^{l} y_{i}^{l-1}

このような、線形和を取って ff を適用するという流れは次のようなグラフで描かれる。

この f\sum | f のノードがたくさん集まって第 ll 層を形成している。

損失関数 EE は、重みwijlw_{ij}^{l} についての関数である。これは出力値 yiLy_i^{L} と教師データ y~i\tilde{y}_i との違いを測る尺度であるから、yiLy_i^{L} の関数でもある。 例えば、以下の二乗誤差は損失関数の一種である。

E=12i(yiLy~i)2E = \frac{1}{2}\sum_{i}\left(y_i^{L} - \tilde{y}_i\right)^2

定義中に wijlw_{ij}^{l} が含まれていないじゃないか、と思うかもしれないが、yiLy_i^{L} の定義中に wijLw_{ij}^{L} が含まれている。さらにその中の yiL1y_i^{L-1} 中に wijL1w_{ij}^{L-1} が含まれている。以下同様にして wijlw_{ij}^lEE の中に含まれている。

いま、EE を最小化するような wijlw_{ij}^{l} を求めたい。これには確率的勾配法が利用できるが、そのために偏微分 Ewijl\displaystyle \frac{\partial E}{\partial w_{ij}^{l}} を計算する必要がある。以降、これをどう計算するかという話を展開していく。

出力層

l=Ll = L のときを考える。まず EEy1L,y2L,,y_1^{L}, y_2^{L}, \ldots, についての関数だから、連鎖律より、

EwijL=jEyjLyjLwijL\begin{align} \frac{\partial E}{\partial w_{ij}^{L}} &= \sum_{j'} \frac{\partial E}{\partial y_{j'}^{L}}\frac{\partial y_{j'}^{L}}{\partial w_{ij}^L} \end{align}

と変形できる。ところが、yjL=fL(ujL)y_{j’}^{L} = f_L(u_{j’}^{L})ujLu_{j’}^{L} についての関数より、再び連鎖律から、

yjLwijL=yjLujLujLwijL=fL(ujL)wijLiwijyiL1=fL(ujL)yiL1δj,j\begin{align*} \frac{\partial y_{j'}^{L}}{\partial w_{ij}^L} &= \frac{\partial y_{j'}^{L}}{\partial u_{j'}^{L}} \frac{\partial u_{j'}^{L}}{\partial w_{ij}^L}\\ &= f_L'(u_{j'}^{L}) \frac{\partial}{\partial w_{ij}^L} \sum_{i'} w_{i'j'} y_{i'}^{L-1}\\ &= f_L'(u_{j'}^{L}) y_{i}^{L-1} \delta_{j,j'}\\ \end{align*}

と書ける。ここで、fLf_L’fLf_L の導関数を表し、δj,j\delta_{j,j’} はクロネッカーのデルタを表す。 結局、式 (1)(1)j\sum_{j’} の部分が消えて、

EwijL=jEyjLfL(ujL)yiL1δj,j=EyjLfL(ujL)yiL1\begin{align*} \frac{\partial E}{\partial w_{ij}^{L}} &= \sum_{j'} \frac{\partial E}{\partial y_{j'}^{L}} f_L'(u_{j'}^{L}) y_{i}^{L-1} \delta_{j,j'}\\ &= \frac{\partial E}{\partial y_{j}^{L}} f_L'(u_{j}^{L}) y_{i}^{L-1} \end{align*}

が得られる。このように j=jj’ = j の項しか残らないのは、wijLw_{ij}^{L}E(y1L,y2L,)E(y_1^L, y_2^L, \ldots ) の引数のうち yjLy_j^{L} にしか関わってこないからなのだが、一応このことを丁寧に計算で示した。

今後の計算のために、以下の量を定義する。

δjl:=Eujl=EyjlfL(ujl) \delta_{j}^{l} := \frac{\partial E}{\partial u_{j}^{l}} = \frac{\partial E}{\partial y_{j}^{l}} f_L'(u_{j}^{l})

これを用いると、

EwijL=δjLyiL1 \frac{\partial E}{\partial w_{ij}^{L}} = \delta_{j}^{L} y_{i}^{L-1}

と表せる。

中間層

lLl \neq L のときを考える。EEy1L,y2L,y_1^{L}, y_2^{L}, \ldots の関数であるが、その各々 yjL=fL(iwijLyiL1)y_j^{L} = f_L\left( \sum_{i} w_{ij}^{L} y_i^{L-1} \right)y1L1,y2L1,y_1^{L-1}, y_2^{L-1}, \ldots の関数である。 従って、EEy1L1,y2L1,y_1^{L-1}, y_2^{L-1}, \ldots の関数でもある。以下同様にして、EEy1l,y2l,y_1^{l}, y_2^{l}, \ldots の関数であることが分かる。よって、連鎖率より、

Ewijl=jEyjlyjlwijl\begin{align*} \frac{\partial E}{\partial w_{ij}^{l}} &= \sum_{j'} \frac{\partial E}{\partial y_{j'}^{l}}\frac{\partial y_{j'}^{l}}{\partial w_{ij}^l} \end{align*}

と書ける。出力層のときとまったく同じ議論により、これは、

Ewijl=Eyjlfl(ujl)yil1=δjlyil1\begin{align*} \frac{\partial E}{\partial w_{ij}^{l}} &= \frac{\partial E}{\partial y_{j}^{l}}f_{l}'(u_{j}^{l})y_i^{l-1}\\ &= \delta_{j}^{l} y_i^{l-1} \end{align*}

となる。ここで、δjl\delta_{j}^{l}

δjl=Eyjlfl(ujl)\delta_{j}^{l} = \displaystyle \frac{\partial E}{\partial y_{j}^{l}} f_{l}'(u_{j}^{l})

であるから、これを計算するためにはEyjl\displaystyle \frac{\partial E}{\partial y_{j}^{l}} を計算する必要がある。 EEy1l+1,y2l+2,y_1^{l+1}, y_2^{l+2}, \ldots の関数でもあるから、連鎖律より、

Eyjl=kEykl+1ykl+1yjl\begin{align*} \frac{\partial E}{\partial y_{j}^{l}} &= \sum_{k} \frac{\partial E}{\partial y_{k}^{l+1}} \frac{\partial y_{k}^{l+1}}{\partial y_{j}^{l}} \end{align*}

が成り立つ。さらに ykl+1y_{k}^{l+1}ukl+1u_{k}^{l+1} の関数であるから、連鎖律より、

Eyjl=kEykl+1ykl+1ukl+1ukl+1yjl\begin{equation} \frac{\partial E}{\partial y_{j}^{l}} = \sum_{k} \frac{\partial E}{\partial y_{k}^{l+1}} \frac{\partial y_{k}^{l+1}}{\partial u_{k}^{l+1}} \frac{\partial u_{k}^{l+1}}{\partial y_{j}^{l}} \end{equation}

となる。ここで、

ykl+1ukl+1=fl+1(ukl+1)ukl+1yjl=yjljwjkl+1yjl=wjkl+1\begin{align*} \frac{\partial y_{k}^{l+1}}{\partial u_{k}^{l+1}} &= f_{l+1}'\left( u_{k}^{l+1} \right)\\ \frac{\partial u_{k}^{l+1}}{\partial y_{j}^{l}} &= \frac{\partial}{\partial y_{j}^{l}} \sum_{j'} w_{j'k}^{l+1} y_{j'}^{l}\\ &= w_{jk}^{l+1} \end{align*}

であるから、式(2)(2)は、

Eyjl=kEykl+1fl+1(ukl+1)wjkl+1=kδkl+1wjkl+1\begin{align*} \frac{\partial E}{\partial y_{j}^{l}} &= \sum_{k} \frac{\partial E}{\partial y_{k}^{l+1}} f_{l+1}'\left( u_{k}^{l+1} \right) w_{jk}^{l+1}\\ &= \sum_{k} \delta_k^{l+1}w_{jk}^{l+1} \end{align*}

となる。以上より求めたかった δjl\delta_j^{l} は、

δjl=Eyjlfl(ujl)=kδkl+1wjkl+1fl(ujl)\begin{align*} \delta_{j}^{l} &= \frac{\partial E}{\partial y_{j}^{l}}f_{l}'(u_{j}^{l})\\ &= \sum_{k} \delta_{k}^{l+1} w_{jk}^{l+1} f_{l}'(u_{j}^{l}) \end{align*}

と書ける。すなわち、δjl\delta_{j}^{l} を計算するためには δkl+1\delta_{k}^{l+1} を計算しておけば良い。

ここまでのまとめ

さて、いままでの計算をまとめると、1lL1 \le l \le L について、

Ewijl=δjlyil1\begin{align*} \frac{\partial E}{\partial w_{ij}^{l}} &= \delta_{j}^{l} y_{i}^{l-1} \end{align*}

と表せる。ただし δjl\delta_{j}^{l} は、

δjl={EyjLfL(ujL)(l=L)kδkl+1wjkl+1fl(ujl)(lL) \delta_{j}^{l} = \begin{cases} \displaystyle \frac{\partial E}{\partial y_{j}^{L}} f_L'(u_{j}^{L}) & (l = L) \\ \displaystyle \sum_{k} \delta_{k}^{l+1} w_{jk}^{l+1} f_{l}'(u_{j}^{l}) & (l \neq L) \end{cases}

で表される。

ベクトル表記にする

ll 層についての δjl\delta_j^{l} を並べたベクトルを δl\bm{\delta^{l}} で表す。同様に、ベクトル yl,ul\bm{y}^{l}, \bm{u}^{l} を定義する。

前提として、ul\bm{u}^{l}yl\bm{y}^{l} は次のように計算できる。これはいわゆる順伝播である。

ul=(Wl)yl1yl=f(ul)\begin{align*} \bm{u}^{l} &= \left( W^{l} \right)^{\top}\bm{y}^{l-1}\\ \bm{y}^{l} &= f(\bm{u}^{l}) \end{align*}

ただし、関数 ff とベクトル x\bm{x} に対し、 f(x)f(\bm{x})x\bm{x} の各成分に ff を適用したベクトルを表す。

最初に、δl\bm{\delta}^{l} の計算式を導く。l=Ll = L のとき、

δL=(δ1Lδ2L)=(Ey1LfL(u1L)Ey2LfL(u2L))=EyLfL(uL)\begin{align*} \bm{\delta}^{L} &= \begin{pmatrix} \delta_1^{L} & \delta_2^{L} & \cdots & \end{pmatrix}\\ &= \begin{pmatrix} \frac{\partial E}{\partial y_{1}^{L}} f_L'(u_{1}^{L}) & \frac{\partial E}{\partial y_{2}^{L}} f_L'(u_{2}^{L}) & \cdots & \end{pmatrix}\\ &= \frac{\partial E}{\partial \bm{y}^{L}} \ast f_L'(\bm{u}^{L}) \end{align*}

とすればよい。 ただし、任意のベクトルx,y\bm{x}, \bm{y} について、xy\bm{x} \ast \bm{y} は成分ごとの積をとったベクトルを表す。

lLl \neq L のとき、Wl+1=(wijl+1)ijW^{l+1} = (w_{ij}^{l+1})_{ij}P×QP \times Q 行列とする(注意: この記事では WlW^{l}ll は累乗ではなく添字を表すものとする)。 ここでは,PP は入力の次元、 QQ は出力の次元を表していることに注意。このとき、

δl=(kQδkl+1w1kl+1fl(u1l)kQδkl+1w2kl+1fl(u2l)kQδkl+1wPkl+1fl(uPl))=(w11l+1w1Ql+1w21l+1w2Ql+1wP1l+1wPQl+1)(δ1l+1fl(u1l)δ2l+1fl(u2l)δPl+1fl(uPl))=Wl+1δl+1fl(ul)\begin{align*} \bm{\delta}^{l} &= \begin{pmatrix} \sum_{k}^{Q} \delta_{k}^{l+1} w_{1k}^{l+1} f_{l}'(u_{1}^{l})\\ \sum_{k}^{Q} \delta_{k}^{l+1} w_{2k}^{l+1} f_{l}'(u_{2}^{l})\\ \vdots\\ \sum_{k}^{Q} \delta_{k}^{l+1} w_{Pk}^{l+1} f_{l}'(u_{P}^{l}) \end{pmatrix}\\ &= \begin{pmatrix} w_{11}^{l+1} & \cdots & w_{1Q}^{l+1}\\ w_{21}^{l+1} & \cdots & w_{2Q}^{l+1}\\ \vdots & \ddots & \vdots\\ w_{P1}^{l+1} & \cdots & w_{PQ}^{l+1} \end{pmatrix} \begin{pmatrix} \delta_1^{l+1} f_{l}'(u_{1}^{l})\\ \delta_2^{l+1} f_{l}'(u_{2}^{l})\\ \vdots\\ \delta_P^{l+1} f_{l}'(u_{P}^{l}) \end{pmatrix}\\ &= W^{l+1} \bm{\delta}^{l+1} \ast f_{l}'(\bm{u}^{l}) \end{align*}

Ewijl\frac{\partial E}{\partial w_{ij}^{l}} については、

Ewijl=yl1(δl) \frac{\partial E}{\partial w_{ij}^{l}} = \bm{y}^{l-1} \left(\bm{\delta}^{l}\right)^{\top}

と表せる。

まとめ

前提として、以下の順伝播の式で yl\bm{y}^{l}ul\bm{u}^{l} が計算できているものとする。

ul=(Wl)yl1yl=f(ul)\begin{align*} \bm{u}^{l} &= \left( W^{l} \right)^{\top} \bm{y}^{l-1}\\ \bm{y}^{l} &= f(\bm{u}^{l}) \end{align*}

誤差逆伝播の式は次のように書ける。

EWl=yl1(δl) \frac{\partial E}{\partial W^{l}} = \bm{y}^{l-1} \left(\bm{\delta}^{l}\right)^{\top}
δl={EyLfL(uL)(l=L)Wl+1δl+1fl(ul)(lL)\bm{\delta}^{l} = \begin{cases} \frac{\partial E}{\partial \bm{y}^{L}} \ast f_L'(\bm{u}^{L}) & (l = L)\\ W^{l+1} \bm{\delta}^{l+1} \ast f_{l}'(\bm{u}^{l}) & (l \neq L) \end{cases}

誤差逆伝播の計算 (2)

前節では「δjl+1\delta_j^{l+1} を使って δjl\delta_j^{l} を求める」という流れを導出したが、 式変形を睨むと、「Eyjl+1\frac{\partial E}{\partial y_j^{l+1}} を使って Eyjl\frac{\partial E}{\partial y_j^{l}} を求める」という流れでも良いことが分かる。

それを確かめるために、δjl+1\delta_j^{l+1} という表記をやめ、式を見直してみる。

まず、1lL1 \le l \le L について、前節の議論により、

Ewijl=Eyjlfl(ujl)yil1\begin{equation} \frac{\partial E}{\partial w_{ij}^{l}} = \frac{\partial E}{\partial y_{j}^{l}} f_l'(u_{j}^{l}) y_{i}^{l-1} \end{equation}

が成り立つ。Eyjl\frac{\partial E}{\partial y_j^{l}} をどう求めるかを考える。

l=Ll = L の場合は、単に損失関数 EE の定義に従って計算すれば良い (どんな損失関数を選ぶかで形が違ってくる)。lLl \neq L の場合、前節の中間層の計算を追ってみると、

Eyjl=kEykl+1fl+1(ukl+1)wjkl+1\begin{equation} \frac{\partial E}{\partial y_{j}^{l}} = \sum_{k} \frac{\partial E}{\partial y_{k}^{l+1}} f_{l+1}'\left( u_{k}^{l+1} \right) w_{jk}^{l+1}\\ \end{equation}

と計算できる。すなわち、ykl+1y_k^{l+1} による偏微分を使って第 ykly_{k}^{l} による偏微分が計算できることが分かる。式 (4)(4) には第 l+1l+1 層に関連する量しか含まれていないから、この計算は l+1l+1 層にて事前に行っておけばよい。もちろん、第 ll 層の立場からすれば、第 l1l-1 層についての以下の事前計算を行うことになる。

Eyjl1=kEyklfl(ukl)wjkl\begin{equation} \frac{\partial E}{\partial y_{j}^{l-1}} = \sum_{k} \frac{\partial E}{\partial y_{k}^{l}} f_{l}'\left( u_{k}^{l} \right) w_{jk}^{l}\\ \end{equation}

まとめると、第 ll 層で行う処理は次の2つである。

  1. (3)(3)に従って Ewijl\frac{\partial E}{\partial w_{ij}^{l}} を計算する。
  2. 1つ前の層の計算のために、式 (5)(5) を使って EEyil1y_{i}^{l-1} による偏微分を計算しておく。

最初からこちらの手法で解説している文献もある。

計算の分離

重み付き線形和を求めるだけの層、活性化関数を求めるだけの層に分ける。

前者は全結合層と呼ばれている。Affine Layer 、Dense Layer とも言われる。後者は活性化関数に応じて層の名前が付く。例えばシグモイド関数なら Sigmoid Layer と呼ばれ、ReLU関数なら ReLU Layer と呼ばれる。

kerasやChainer、PyToachなどのニューラルネットワークのライブラリでは、このように層を分けている。その理由はおそらく使いやすさ・分かり易さの観点からだと思われる。 後々計算すると分かるが、分けることによって式が綺麗にまとまる。また活性化関数の層を分けておけば、全結合層以外の層とも組み合わせられる。

以下では、それぞれの層について Ewijl, Eyjl1\frac{\partial E}{\partial w_{ij}^{l}},\ \frac{\partial E}{\partial y_{j}^{l-1}} の計算方法を記す。

活性化関数を求める層

yil1y_i^{l-1} を入力、yil=f(yil1) (i=1,2,)y_i^{l} = f(y_i^{l-1}) \ (i = 1, 2, \ldots) を出力とする層を考える。

まず、Ewijl\frac{\partial E}{\partial w_{ij}^{l}} を計算する必要はない。なぜなら、重み wijlw_{ij}^{l} が存在しないからである。よって、yil1y_{i}^{l-1} による微分のみ計算する。

連鎖律より、

Eyjl1=kEyklyklyjl1\begin{equation*} \frac{\partial E}{\partial y_{j}^{l-1}} = \sum_{k} \frac{\partial E}{\partial y_{k}^{l}} \frac{\partial y_{k}^{l}}{\partial y_{j}^{l-1}} \end{equation*}

yily_i^{l}yil1y_i^{l-1} のみの関数であることに注意して、

Eyjl1=kEyklfl(yjl1)δk,j=Eyjlfl(yjl1)\begin{align*} \frac{\partial E}{\partial y_{j}^{l-1}} &= \sum_{k} \frac{\partial E}{\partial y_{k}^{l}} f_l'(y_j^{l-1}) \delta_{k, j}\\ &= \frac{\partial E}{\partial y_{j}^{l}} f_l'(y_j^{l-1}) \end{align*}

と計算される。

ベクトルで表記すると、

Eyl1=Eylfl(yl1)\frac{\partial E}{\partial \bm{y}^{l-1}} = \frac{\partial E}{\partial \bm{y}^{l}} \ast f_l'(\bm{y}^{l-1})

全結合層

yil1y_i^{l-1} を入力、yil=jwijyjl1 (i=1,2,)y_i^{l} = \sum_{j}w_{ij} y_j^{l-1} \ (i = 1, 2, \ldots) を出力とする層を考える。

面倒なので計算を端折る。要するにこの線形和は、以前の議論で導いた2つの式 (3)(3)(5)(5)

Ewijl=Eyjlfl(ujl)yil1Eyjl1=kEyklfl(ukl)wjkl\begin{align*} \frac{\partial E}{\partial w_{ij}^{l}} &= \frac{\partial E}{\partial y_{j}^{l}} f_l'(u_{j}^{l}) y_{i}^{l-1}\\ \frac{\partial E}{\partial y_{j}^{l-1}} &= \sum_{k} \frac{\partial E}{\partial y_{k}^{l}} f_{l}'\left( u_{k}^{l} \right) w_{jk}^{l} \end{align*}

において、活性化関数が恒等関数 f(x)=xf(x) = x となるものである。よって、

Ewijl=Eyjlyil1Eyjl1=kEyklwjkl\begin{align*} \frac{\partial E}{\partial w_{ij}^{l}} &= \frac{\partial E}{\partial y_{j}^{l}} y_{i}^{l-1}\\ \frac{\partial E}{\partial y_{j}^{l-1}} &= \sum_{k} \frac{\partial E}{\partial y_{k}^{l}} w_{jk}^{l} \end{align*}

が得られる。

ベクトルで表記すると、

EWl=yl1(Eyl)Eyl1=WlEyl\begin{align*} \frac{\partial E}{\partial W^{l}} &= \bm{y}^{l-1}\left(\frac{\partial E}{\partial \bm{y}^{l}}\right)^{\top}\\ \frac{\partial E}{\partial \bm{y}^{l-1}} &= W^{l} \frac{\partial E}{\partial \bm{y}^{l}} \end{align*}

ミニバッチ学習

いままで確率的勾配法で話を進めてきたが、ミニバッチ勾配法の場合はどのようになるのだろうか。

計算のためには、今までの表記を少し改め、損失関数をミニバッチ用に変える必要がある。 今まで出力値を yily_i^{l} と表していたが、これを nn 番目の入力データに対する出力値 ynily_{ni}^{l} に書き直す。

まず、ミニバッチとする訓練データの個数を NN とする。その入力を y10,y20,,yN0\bm{y}_1^{0}, \bm{y}_2^{0}, \ldots, \bm{y}_N^{0} とする。 各ノードに対する出力値は y1l,y2l,,yNl\bm{y}_1^{l}, \bm{y}_2^{l}, \ldots, \bm{y}_N^{l} と書ける。 ここで、第 ll 層のノードの個数を DlD_l とし、ynl=(yn1l,yn2l,,ynDll)\bm{y}_n^{l} = \left(y_{n1}^{l}, y_{n2}^{l}, \ldots, y_{nD_l}^{l} \right)^{\top} とした。 また、

Yl=(y1ly2lyNl)Y^{l} = \begin{pmatrix} \bm{y}_1^{l} & \bm{y}_2^{l} & \cdots & \bm{y}_N^{l} \end{pmatrix}
と書くことにする。

nn 番目の入力データに対する損失関数をEnE_nとする。例えば二乗誤差なら、

En=12i(yniLy~ni)2E_n = \frac{1}{2}\sum_{i}\left(y_{ni}^{L} - \tilde{y}_{ni}\right)^2
となる。

NN 個の訓練データに対する損失関数を、各々のデータの損失関数の平均で表す。

E=1Nn=1NEnE = \frac{1}{N} \sum_{n=1}^{N} E_n

さて wijlw_{ij}^{l} についての偏微分をどう計算するかだが、これは偏微分の線形性から、

Ewijl=1Nn=1NEnwijl\begin{equation} \frac{\partial E}{\partial w_{ij}^{l}} = \frac{1}{N} \sum_{n=1}^{N} \frac{\partial E_n}{\partial w_{ij}^{l}} \end{equation}

が成り立つことに注目すれば良い。EnE_n の計算は今までの議論と何ら変わりない。 あとはそれぞれの層について、順伝播・逆伝播がどう表現できるのかについて考える。

誤差逆伝播の計算 (1) の場合

nn 番目のデータに対する第 ll 層の線形和を unl\bm{u}_n^{l} とおく。YlY^{l} の定義とほぼ同様にして、

Ul=(u1lu2luNl)U^{l} = \begin{pmatrix} \bm{u}_1^{l} & \bm{u}_2^{l} & \cdots & \bm{u}_N^{l} \end{pmatrix}
を定義する。同様に、
Δl=(δ1lδ2lδNl)\Delta^{l} = \begin{pmatrix} \bm{\delta}_1^{l} & \bm{\delta}_2^{l} & \cdots & \bm{\delta}_N^{l} \end{pmatrix}
を定義する。

順伝播

Ul=(u1lu2luNl)=((Wl)y1l1(Wl)y2l1(Wl)yNl1)=(Wl)Yl1\begin{align*} U^{l} &= \begin{pmatrix} \bm{u}_1^{l} & \bm{u}_2^{l} & \cdots & \bm{u}_N^{l} \end{pmatrix}\\ &= \begin{pmatrix} \left(W^{l}\right)^{\top} \bm{y}_1^{l-1} & \left(W^{l}\right)^{\top}\bm{y}_2^{l-1}& \cdots & \left(W^{l}\right)^{\top}\bm{y}_N^{l-1} \end{pmatrix}\\ &= \left(W^{l}\right)^{\top}Y^{l-1} \end{align*}
Yl=(f(u1l)f(u2l)f(uNl))=f(Ul)\begin{align*} Y^{l} &= \begin{pmatrix} f(\bm{u}_1^{l}) & f(\bm{u}_2^{l}) & \cdots & f(\bm{u}_N^{l}) \end{pmatrix}\\ &= f(U^{l}) \end{align*}

ただし、関数 ff と行列 AA に対し、 f(A)f(A)AA の各成分に ff を適用した行列を表す。

逆伝播

(6)(6)Wl=(wijl)ijW^{l} = (w_{ij}^{l})_{ij} の各成分について成り立つから、

EWl=1Nn=1NEnWl\frac{\partial E}{\partial W^{l}} = \frac{1}{N} \sum_{n=1}^{N} \frac{\partial E_n}{\partial W^{l}}

と変形できる。これより、

EWl=1Nn=1NEnWl=1Nn=1Nynl1(δnl)=1N(y1l1y2l1yNl1)((δ1l1)(δ2l1)(δNl1))=1NYl1(Δl)\begin{align*} \frac{\partial E}{\partial W^{l}} &= \frac{1}{N} \sum_{n=1}^{N} \frac{\partial E_n}{\partial W^{l}}\\ &= \frac{1}{N} \sum_{n=1}^{N} \bm{y}_n^{l-1} \left(\bm{\delta}_n^{l}\right)^{\top}\\ &= \frac{1}{N} \begin{pmatrix} \bm{y}_1^{l-1} & \bm{y}_2^{l-1} & \cdots \bm{y}_N^{l-1} \end{pmatrix} \begin{pmatrix} \left(\bm{\delta}_1^{l-1}\right)^{\top} \\ \left(\bm{\delta}_2^{l-1}\right)^{\top} \\ \vdots\\ \left(\bm{\delta}_N^{l-1}\right)^{\top} \\ \end{pmatrix}\\ &= \frac{1}{N} Y^{l-1} \left(\Delta^{l}\right)^{\top}\\ \end{align*}

Δl\Delta^{l} の計算については、l=Ll = L のとき、

ΔL=(δ1Lδ2LδNL)=(Ey1LfL(u1L)Ey2LfL(u2L)EyNLfL(uNL))=EYLfL(UL)\begin{align*} \Delta^{L} &= \begin{pmatrix} \bm{\delta}_1^{L} & \bm{\delta}_2^{L} & \cdots & \bm{\delta}_N^{L} \end{pmatrix}\\ &= \begin{pmatrix} \frac{\partial E}{\partial \bm{y}_1^{L}} \ast f_L'(\bm{u}_1^{L}) & \frac{\partial E}{\partial \bm{y}_2^{L}} \ast f_L'(\bm{u}_2^{L}) & \cdots & \frac{\partial E}{\partial \bm{y}_N^{L}} \ast f_L'(\bm{u}_N^{L}) & \end{pmatrix}\\ &= \frac{\partial E}{\partial Y^{L}} \ast f_L'(U^{L}) \end{align*}

ただし、任意の行列A,BA, B について、ABA \ast B は成分ごとの積をとった行列を表す。

lLl \neq L のとき、

Δl=(δ1lδ2lδNl)=(Wl+1δ1l+1fl(u1l)Wl+1δ2l+1fl(u2l)Wl+1δNl+1fl(uNl))=Wl+1Δl+1fl(Ul)\begin{align*} \Delta^{l} &= \begin{pmatrix} \bm{\delta}_1^{l} & \bm{\delta}_2^{l} & \cdots & \bm{\delta}_N^{l} \end{pmatrix}\\ &= \begin{pmatrix} W^{l+1}\bm{\delta}_1^{l+1} \ast f_l'(\bm{u}_1^{l}) & W^{l+1}\bm{\delta}_2^{l+1} \ast f_l'(\bm{u}_2^{l}) & \cdots & W^{l+1}\bm{\delta}_N^{l+1} \ast f_l'(\bm{u}_N^{l}) \end{pmatrix}\\ &= W^{l+1} \Delta^{l+1} \ast f_l'(U^{l}) \end{align*}

と計算できる。このように、ベクトルだった部分がそのまま行列になったかのような形となる。実際、N=1N = 1 としたらベクトルの表現に戻ることが分かるだろう。

誤差逆伝播の計算 (2) の場合

活性化関数の層

順伝播については、

Yl+1=(y1l+1y2l+1yNl+1)=(f(y1l)f(y2l)f(yNl))=f(Yl)\begin{align*} Y^{l+1} &= \begin{pmatrix} \bm{y}_1^{l+1} & \bm{y}_2^{l+1} & \cdots & \bm{y}_N^{l+1} \end{pmatrix}\\ &= \begin{pmatrix} f(\bm{y}_1^{l}) & f(\bm{y}_2^{l}) & \cdots & f(\bm{y}_N^{l}) \end{pmatrix}\\ &= f(Y^{l}) \end{align*}

で計算すれば良い。

逆伝播については次のように式が変形できる。

EYl1=(Ey1lEy2lEyNl)=(Ey1lfl(y1l1)Ey2lfl(y2l1)EyNlfl(yNl1))=EYlfl(Yl)\begin{align*} \frac{\partial E}{\partial Y^{l-1}} &= \begin{pmatrix} \frac{\partial E}{\partial \bm{y}_1^{l}} & \frac{\partial E}{\partial \bm{y}_2^{l}} & \cdots & \frac{\partial E}{\partial \bm{y}_N^{}l} \end{pmatrix}\\ &= \begin{pmatrix} \frac{\partial E}{\partial \bm{y}_1^{l}} \ast f_l'(\bm{y}_1^{l-1}) & \frac{\partial E}{\partial \bm{y}_2^{l}} \ast f_l'(\bm{y}_2^{l-1}) & \cdots & \frac{\partial E}{\partial \bm{y}_N^{l}} \ast f_l'(\bm{y}_N^{l-1}) \end{pmatrix}\\ &= \frac{\partial E}{\partial Y^{l}} \ast f_l'(Y^{l}) \end{align*}

ベクトルが行列にすり替わっただけで、式の形はほとんど変わらない。

全結合層

順伝播については、

Yl+1=(y1l+1y2l+1yNl+1)=((Wl)y1l(Wl)y2l(Wl)yNl)=(Wl)Yl\begin{align*} Y^{l+1} &= \begin{pmatrix} \bm{y}_1^{l+1} & \bm{y}_2^{l+1} & \cdots & \bm{y}_N^{l+1} \end{pmatrix}\\ &= \begin{pmatrix} \left(W^{l}\right)^{\top} \bm{y}_1^{l} & \left(W^{l}\right)^{\top} \bm{y}_2^{l} & \cdots & \left(W^{l}\right)^{\top} \bm{y}_N^{l} \end{pmatrix}\\ &= \left(W^{l}\right)^{\top}Y^{l} \end{align*}

で計算できる。

逆伝播の式を導出する。WlW^{l} については、

EWl=1Nn=1NEnWl=1Nn=1Nynl1(Eynl)=1NYl(EYl)\begin{align*} \frac{\partial E}{\partial W^{l}} &= \frac{1}{N} \sum_{n=1}^{N} \frac{\partial E_n}{\partial W^{l}}\\ &= \frac{1}{N} \sum_{n=1}^{N} \bm{y}_{n}^{l-1} \left( \frac{\partial E}{\partial \bm{y}_n^{l}} \right)^{\top}\\ &= \frac{1}{N} Y^{l} \left( \frac{\partial E}{\partial Y^{l}} \right)^{\top} \end{align*}

となる。Yl1Y^{l-1} については、

EYl1=(Ey1l1Ey2l1EyNl1)=(WlEy1lWlEy2lWlEyNl)=WlEYl\begin{align*} \frac{\partial E}{\partial Y^{l-1}} &= \begin{pmatrix} \frac{\partial E}{\partial \bm{y}_1^{l-1}} & \frac{\partial E}{\partial \bm{y}_2^{l-1}} & \cdots & \frac{\partial E}{\partial \bm{y}_N^{l-1}} \end{pmatrix}\\ &= \begin{pmatrix} W^{l} \frac{\partial E}{\partial \bm{y}_1^{l}} & W^{l} \frac{\partial E}{\partial \bm{y}_2^{l}} & \cdots & W^{l} \frac{\partial E}{\partial \bm{y}_N^{l}} \end{pmatrix}\\ &= W^{l} \frac{\partial E}{\partial Y^{l}} \end{align*}

どちらも、ベクトルで表現した場合とあまり変わらないことが分かる。

まとめと感想

自分でまとめてみると、難しい計算はしていないことが実感できた。 出てくる文字の数が多かったり、添字がややこしかったり、どの変数について連鎖律を使うのかという点がやや技巧的だったりはした。 ここまで式をまとめられれば、プログラムの実装ができそう。それは別の記事でまとめたい。

誤差逆伝播法の導出を通して、ニューラルネットワークが少し身近に感じられるようになった。 ただし、誤差逆伝播法は必要だが、これ自体がニューラルネットワークの本質であると勘違いしないようにしなければならないだろう (あくまで計算テクニックの1つ、という認識を持っている)。 本当に考えなければならないのは、どんなネットワークを作るか、どんな入力形式にするか、だと思う。 とはいえ自分はまだ入門者なので、確かなことは言えないが…。