[ 機械学習 ] 社内輪講 Week5 〜 ニューラルネットワーク: 誤差逆伝播法 〜

## はじめに

[スタンフォード大学 Andrew Ng氏による機械学習の講義動画](https://www.coursera.org/learn/machine-learning)を各週社内メンバーで持ち回りで受講し、学んだことを発表、Qiitaで共有しています。

[【機械学習】社内輪講はじめました -Qiita](https://qiita.com/aoki-k/items/a25fe5e9d504f90f72f3)

第5週は以下の内容でした。

- Neural Networks: Back Propagation

主に、誤差逆伝播法を説明していきます。

## 目次

- アインシュタインの縮約記法
- 記号等の説明

- 数学的準備
  - 対数関数の微分
  - シグモイド関数の微分
  - 連鎖律
  - 行列の諸定義
- 順伝播の復習
- 損失関数
- 誤差逆伝播法



## アインシュタインの縮約

本項では、アインシュタインの縮約で記述します。

例えば
$$
\sum_{\mu=0}^{N} a_\mu = a_1 + a_2 + ... + a_N
$$
$$
\sum_{\nu=0}^{N} a_\nu b_\nu = a_1b_1 + a_2b_2 + ... + a_Nb_N
$$
$$
\sum_{\xi=0}^{N} a_\xi b^\xi = a_1b^1 + a_2b^2 + ... + a_Nb^N
$$
などを単に
$$
a_\mu
$$
$$
a_\nu b_\nu
$$
$$
a_\xi b^\xi
$$
とシグマを省略して記述します。



縮約の添え字は $ \mu , \nu, \xi $ を使用します。

これら三つの文字が出てきたら縮約されていると思ってください。

## 数学的準備

- 対数関数の微分
  $$
  \frac{d}{dx}\log{x}=\frac{1}{x}
  $$
  これと、合成関数の微分法
  $$
  \frac{dy}{dt}=\frac{dy}{du}\frac{du}{dt}
  $$
  から
  $$
  \frac{d}{dx}\log{f(x)}=\frac{d}{df}\log{f}\frac{df}{dx}=\frac{f^{\prime}(x)}{f(x)}
  $$

- シグモイド関数の微分
  $$
  \sigma(x)=\frac{1}{1+e^{-x}}
  $$
  $\frac{d}{dx}e^{-x}=-e^{-x}$ , $ \frac{d}{dx}\frac{1}{x}=-\frac{1}{x^2} $ であり合成関数の微分法から $ f(x)=1+e^{-x} $ とすると
  $$
  \frac{d}{dx}\frac{1}{f(x)}=\frac{d}{df}\frac{1}{f(x)}\frac{df}{dx}=
  -\frac{1}{f(x)^2} \times f^\prime(x)=
  -\frac{1}{(1+e^{-x})^2} \times (-e^{-x})=
  \frac{1}{1+e^{-x}} \times (1-\frac{1}{1+e^{-x}})
  $$
  

  すなわち
  $$
  \sigma^\prime(x)=\sigma(x)(1-\sigma(x))
  $$
  となります。

- 連鎖律

  $f(x_1,x_2, ...)$ を $t$ で微分したいとき、が $x_1,x_2,...$ の全てが $t$ に依存しているならば
  $$
  \frac{\partial f}{\partial t} =
  \frac{\partial f}{\partial x_\mu}\frac{\partial x_\mu}{\partial t}
  $$
  $t$ が微小に動くとき $x_1,x_2,...$ の全てが微小に変化し、それら全てが$f$を微小に変化させる要因となるため、足し合わせる。といったイメージです。

- 行列の諸定義

  - 行列の積
  
    $$
    A = (a_{ij})\_{ij} \,,\, B = (b_{ij})_{ij}
    $$

    とすると

    $$
    AB = (a_{i \mu}b_{\mu j})\_{ij}
    $$

  - アダマール積
    $$
    A \circ B = (a_{ij}b_{ij})\_{ij}
    $$

  - 転置
    $$
    A^T = (a_{ji})_{ij}
    $$
    

  上記はそれぞれベクトルへの自然な応用が出来ます。（ベクトルを行数または列数が1の行列と考える）

## 本項の設定

本項では以下の設定のニューラルネットワークで説明していきます。

- 入力データ
  $$
  (x_1, x_2, \cdots)
  $$
- ラベルデータ
  $$
  (t_1, t_2, \cdots)\,\,\,\,\, (t = 0 \, or \, 1)
  $$

- 層の数は L 層 ( よって出力層は第 L 層 )

- 出力層の活性化関数はシグモイド関数

  - $$
    \sigma^L(x)=\frac{1}{1+e^{-x}}
    $$

  

## 順伝播の復習

復習なので、ざっと進めます。

以下の図は

- 第 l 層の上から i 番目のノードから
- 第 l+1 層の上から j 番目のノードへの

順伝播です。

![画像1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502808/4eb40b19-bf89-fa3f-9695-f40db817f99e.png)


第 $l$ 層の $i$ 番目以外のノードの伝播も考慮して
$$
y_j^l = w_{\mu j}^l \, z_\mu^{l-1}
$$
$$
z_j^l = \sigma^l(y_j^l)
$$
になります。



## 損失関数

損失関数は対数尤度関数を用います。
$$
E=E(z_1^L, z_2^L,\cdots) = -(\,t_\nu\log{z_\nu^L} + (1 - t_\nu)\log(1-z_\nu^L)\,)
$$
[ 式の意味 ]

出力層のj番目の出力
$$
z_j^L
$$
はシグモイド関数により活性化されるので
$$
z_j^L \in (0,1)
$$
であり、これは確率として解釈できます。

つまり出力が $t_j$ である確率は
$$
{z_j^{L}}^{t_j}\,(1-z_j^{L})^{1-{t_j}}
$$
となります。全出力層のノードを掛け合わせると
$$
\prod_j {z_j^{L}}^{t_j}\,(1-z_j^{L})^{1-{t_j}}
$$
これの対数を取り、整理します。（足し算の方が扱いやすく、かつ対数だと微分ができるので）
$$
t_\nu\log{z_\nu^L} + (1 - t_\nu)\log(1-z_\nu^L)
$$
この式は分類がうまくいっている指標になります。

今回は、損失関数（分類がうまくいっていない指標）として扱うので$ -1 $ をかけて上記結果となります。

##誤差逆伝播法

損失関数が小さくなる方向に、重み $w$ を修正します。つまり
$$
\Delta w_{ij}^l = -\frac{\partial E}{\partial w_{ij}^l} \times学習率
$$
で $w_{ij}^l$ の修正分 $\Delta w_{ij}^k$ を求めます。学習率は、どの程度の大きさで修正するかを決めるハイパーパラメータです。

学習率を一定とすると、$\frac{\partial E}{\partial w_{ij}^l}$ は修正分を表しています。また
$$
\frac{\partial E}{\partial w_{ij}^l}=\frac{\partial E}{\partial y_{j}^l} \frac{\partial y_j^l}{\partial w_{ij}^l}
$$
であり、
$$
\frac{\partial y_j^l}{\partial w_{ij}^l} = z_i^{l-1}
$$
なので $\frac{\partial E}{\partial y_{j}^l}=\delta_j^l$とすると
$$
\frac{\partial E}{\partial w_{ij}^l}=\delta_j^l \, z_i^{l-1}
$$
と表現できます。

次に$\delta_j^l$ について考えます。以下のように、漸化式が求まります。
$$
\delta_j^l =
\frac{\partial E}{\partial y_{j}^l}=
\frac{\partial E}{\partial z_{j}^l}\frac{{\partial z_{j}^l}}{{\partial y_{j}^l}}=
\frac{\partial E}{\partial y_{\xi}^{l+1}}\frac{\partial y_{\xi}^{l+1}}{\partial z_{j}^{l}}\frac{{\partial z_{j}^l}}{{\partial y_{j}^l}}=
\delta_j^{l+1}\,w_{j\xi}^{l+1}\,\sigma^{l\,\prime}(y_j^l)
$$
ここでは偏微分の連鎖律を用いました。また、
$$
\delta_j^L =
\frac{\partial E}{\partial y_{j}^L}=
\frac{\partial E}{\partial z_{j}^L}\frac{{\partial z_{j}^L}}{{\partial y_{j}^L}}=
-(\frac{t_j}{z_j^L} - \frac{1 - t_j}{1 - z_j^L}) \times z_j^L(1 - z_j^L)=z_j^L - t_j
$$
よって上記二式より任意の $\delta_j^l$ を求めることが出来る。



まとめると、
$$
\Delta w_{ij}^l = \delta_j^{l+1}\,w_{j\xi}^{l+1}\,\sigma^{l\,\prime}(y_j^l) \times学習率
\\
\delta_j^L = z_j^L - t_j
\\
\delta_j^l = \delta_j^{l+1}\,w_{j\xi}^{l+1}\,\sigma^{l\,\prime}(y_j^l)
$$
また、行列やベクトルで表記すると
$$
\Delta W^l = z^{l-1} \, (\delta^l)^T \times学習率
\\
\delta^L = z^L - t
\\
\delta^l = (W^{l+1}\delta^{l+1}) \circ \sigma^{l\,\prime}(y^l)
$$
ただし
$$
\Delta W^l = (\Delta w_{ij}^l)\_{ij}
$$
$$
y^{l}=(y_j)\_j \,,\, z^{l}=(z_j)\_j
$$
$$
\delta^{l}=(\delta_j^l)_j
$$
とします。



以上になります。