深層学習:多層ニューラルネットワーク バックプロパゲーション
前記事のForward Propagationから得られた結果を元に、ロジスティック関数を作成し、出力から入力側へと誤差を伝播させる。
Forward Propagationから、データ数を$${n}$$、$${d}$$を隠れ層の数とすれば、隠れ層への挿入力は
$${{\bf Z^{(h)}}={\bf A}^{(in)}{\bf W}^{h}}$$の$${n\times d }$$行列であり、
隠れ層の活性化関数を経て、
$${{\bf A}^{(h)}=\phi({\bf Z}^{(h)})}$$から、出力層の挿入力は、出力ユニット数を$${t}$$とした、$${(d \times t)}$$行列の出力重みを$${{\bf W}^{out}}$$として、
$${{\bf Z^{(out)}}={\bf A}^{(h)}{\bf W}^{out}}$$、最終的な出力は、
$${{\bf A}^{(out)}=\phi({\bf Z}^{(out)})}$$の$${n \times t}$$行列で与えられている。
活性化関数を
$${\phi(z)=\displaystyle{\frac{1}{1-e^{-z}}}}$$とし、ロジステック関数を、
$${\displaystyle{J({\bf W}) = -\left( \sum_{i=1}^{n} \sum_{j=1}^{t}y^{(i)}_j\log a_j^{(i)} + (1-y_j^{(i)})\log(1-a_j^{(i)})\right)}}$$
とする。$${a_j^{(i)}=\phi(z_j^{(i)})}$$である。
出力側の誤差、$${{\bf \delta}^{(out)}}$$を以下のように定義する。
$${{\bf \delta}^{(out)}=\displaystyle{\frac{\partial J({\bf W})}{\partial {\bf Z}^{(out)}}}}$$
計算の記述を簡単にするために、データ数を$${1}$$として、$${k}$$ユニットからの出力$${z_k}$$のみを考えると、
$${\delta_{k}^{(out)}=\displaystyle{\frac{\partial J({\bf W})}{\partial z_k^{out} }=\frac{\partial J({\bf W})}{\partial a_k^{out}}\frac{\partial a_k^{(out)}}{\partial z_k^{(out)}} }}$$
ここで、
$${\displaystyle{\frac{\partial \phi}{\partial z}= \frac{-e^{-z}}{(1-e^{-z})^2} = \frac{1-e^{-z}}{(1-e^{-z})^2} = \frac{1}{(1-e^{-z})^2}= \phi - \phi^2}}$$から、
$${\displaystyle{\frac{\partial a_k}{\partial z_k} = a_k(1-a_k)}}$$
を用いて、
$${\delta_{k}^{(out)}=\displaystyle{-\left(\frac{y_k-a_k^{(out)}}{a_k^{(out)}(1-a_k^{(out)})} \cdot a_k^{(out)}(1-a_k^{(out)})\right)= a_k^{(out)}-y_k}}$$
よって、これをデータ数$${n}$$まで足し上げれば良いから、
$${{\bf \delta}^{(out)}={\bf A}^{(out)}-{\bf y}^{(out)}}$$
と与えられる。
さらに、隠れ層の誤差を$${{\bf \delta}^{h}}$$も同様に、
$${{\bf \delta}^{(h)}=\displaystyle{\frac{\partial J({\bf W})}{\partial {\bf Z}^{(h)}}}}$$と$${n \times d}$$の行列で与えられる。
同様にデータ数を$${1}$$にして、
$${{\bf \delta}^{(h)}_k = \displaystyle{\frac{\partial J({\bf W})}{\partial z_k^{(h)}} = \sum_{j=1}^{t}\frac{\partial z_j^{(out)}}{\partial z_k^{(h)}} \frac{\partial J({\bf W})}{\partial z_j^{(out)}}}}$$
これをベクトルと行列の積として表記すると、
$${{\bf \delta}^{(h)}=\displaystyle{\left(\frac{\partial J({\bf W})}{\partial z_1^{(out)}}, \cdots , \frac{\partial J({\bf W})}{\partial z_t^{(out)}}\right) \left( \left( \frac{\partial {\bf z}^{(out)}}{\partial z_1^{(h)}}\right)^T, \cdots,\frac{\partial {\bf z}^{(out)}}{\partial z_d^{(h)}} \right)^T }}$$
ここで、$${\displaystyle{\frac{\partial {\bf z}^{(out)}}{\partial z_k^{(h)}} , k=1, \cdots d}}$$は、
$${\displaystyle{\left(\frac{\partial {\bf z}_1^{(out)}}{\partial z_k^{(h)}} ,\cdots,\frac{\partial {\bf z}_t^{(out)}}{\partial z_k^{(h)}}\right) }}$$の$${t}$$次元ベクトルであるから、
$${{\bf \delta}^{(h)}={\bf \delta}^{(out)}\displaystyle{\left(\frac{\partial {\bf z}^{(out)}}{\partial {\bf z}^{(h)}} \right)^T}}$$
と書ける。
第二項の$${\displaystyle{\frac{\partial {\bf z}^{(out)}}{\partial {\bf z}^{(h)}}}}$$は、$${{\bf z}^{(out)}={\bf a}^{(h)} {\bf w^{(out)}}}$$が$${t}$$次元ベクトルであり、その$${k}$$成分は、
$${{\bf z}^{(out)}_k=({\bf a}^{(h)} {\bf w^{(out)}})_k=\displaystyle{\sum^{d}_{j=1}a_j^{(out)}w_{j,k}^{(out)}}}$$
で与えられ、$${{\bf w}^{(out)}}$$は$${{\bf z}^{(h)}}$$に無関係であることから、
$${\displaystyle{\frac{\partial ({\bf a}^{(h)} {\bf w}^{(out)})_k}{\partial z_l^{(h)}} =\sum^{d}_{j=1}\frac{\partial a_j^{(out)}}{\partial z_l^{(out)}}w_{j,k}^{(out)}}}$$
ここで、$${a_i=\phi(z_i)}$$であるから、$${j=l}$$以外の成分はゼロとなる。よって、
$${\displaystyle{\frac{\partial ({\bf a}^{(h)} {\bf w}^{(out)})_k}{\partial z_l^{(h)}} = \frac{\partial a_l^{(h)}}{\partial z_l^{(h)}}w_{l,k} }}$$
ここで、$${l=1,\cdots,d}$$であるから、
$${\displaystyle{ \frac{\partial ({\bf a}^{(h)} {\bf w}^{(out)})_k}{\partial {\bf z}^{(h)}} = \left( \frac{\partial a_1^{(h)}}{\partial z_1^{(h)}}w_{1,k}, \cdots, \frac{\partial a_d^{(h)}}{\partial z_d^{(h)}}w_{d,k} \right)}}$$
ベクトルの成分同士の積演算の$${\odot}$$を導入すれば、右辺は、
$${\displaystyle{\left( \frac{\partial a_1^{(h)}}{\partial z_1^{(h)}}w_{1,k}, \cdots, \frac{\partial a_d^{(h)}}{\partial z_d^{(h)}}w_{d,k} \right) = \frac{\partial {\bf a}^{(h)}}{\partial {\bf z}^{(h)}} \odot (w_{1,k},\cdots,w_{d,k})}}$$と、表される。
これから、
$${{\bf \delta}^{(h)}=\displaystyle{ {\bf \delta}^{(out)} {\bf W}^{(out)} \odot \frac{\partial {\bf A}^{(h)}}{\partial {\bf Z}^{(h)}}}}$$
となり、$${{\bf A}^{(h)}=\phi({\bf Z}^{(h)})}$$で与えられていることから、$${{\bf \delta}}$$と同様に、活性化関数の偏微分を行い
$${{\bf \delta}^{(h)}={\bf \delta}^{(out)} {\bf W}^{(out)} \odot ({\bf A}^{(h)}\odot (1-{\bf A}^{(h)})) }$$
と与えられる。
この$${{\bf \delta}^{(h)}}$$と$${{\bf \delta}^{(out)}}$$を用いて、コスト関数の重みによる偏微分は、
$${\displaystyle{\frac{\partial J({\bf W})}{\partial w^{(out)}_{i,j}} = \frac{\partial z^{(out)}_i}{\partial w_{i,j}} \frac{\partial J({\bf W})}{\partial z_{i}^{(out)}} = a_j^{(h)} \delta_i^{(out)}}}$$
$${\displaystyle{\frac{\partial J({\bf W})}{\partial w^{(h)}_{i,j}} = \frac{\partial z^{(h)}_i}{\partial w_{i,j}} \frac{\partial J({\bf W})}{\partial z_{i}^{(h)}} = a_j^{(in)} \delta_i^{(h)}}}$$
これを$${n}$$データに一般化して、
$${\Delta^{(h)}=({\bf A}^{(in)})^T \delta^{(h)}}$$
$${\Delta^{(out)}=({\bf A}^{(h)})^T \delta^{(out)}}$$
が得られる。
データポイント$${l}$$に関して、正則化を加え、
$${\Delta^{(l)}=\Delta^{(l)} + \lambda^{(l)}{\bf W}^{(l)}}$$とし、
重みの更新は、
$${{\bf W}^{(l)}_{t+1}= {\bf W}^{(l)}_t - \eta \Delta^{(l)}_t}$$
で行われる。