ニューラルネットワークモデルの整理

# はじめに
機械学習で，回帰や分類，SVMなどの予測値は，「XXX以上とそれ以下」や「YYYの範囲の中と外」というように比較的単純なもので，XOR回路のような判定をさせようとすると難しくなってくる．


# 人工ニューラルネットワーク
機械学習におけるニューラルネットワークと呼ばれるものは厳密には，人口ニューラルネットワーク(Artificial Neural Network: ANN)という．ANNは，複数の入力値に対して出力値を算出するモデルの一種で，脳細胞を模したニューロンモデルを用いて，層状に連結させたものを指す．この層の数が少ないものを単なるニューラルネットワーク(Shallow-layer Neural Network)と，多いものを深層ニューラルネットワーク(Deep-layer Neural Network: DNN)と名前を付け呼び分けていたりする．

## ニューロンモデル
![ニューロンモデル.png](https://qiita-image-store.s3.amazonaws.com/0/165030/1cdc7a75-6f63-1041-432c-5bf68bb46e79.png)
上図では3つの入力値に対して1つの出力値を求めるニューロンモデルである．$x_0$はバイアス項となっていて，入力値は常に1となっている．
真ん中の円がそれに当たる．この時の計算方法は，

```math
\begin{align}
z &= \sum_{i=0}^{3}\theta_ix_i \\
h_{\Theta}(x) &= g(z) \\
\end{align}
```

というようになる．$z$はニューロンに対する入力値の重みつき総和になっている．そして，出力値は活性化関数と呼ばれるものを通過させる．
今回の式でいうところの$g(\cdot)$である．活性化関数は，ReLU(Rectified Linear Unit)やSigmoid関数，tanh関数などを用いる．
演算量が多いDNNでは，収束速度の速いReLUを用いることが多い．また，DNNでは，1つの円をグラフ理論などでよく使われるノード（Node）と呼ぶ．

![3層ANNモデル_Kクラス.png](https://qiita-image-store.s3.amazonaws.com/0/165030/d74b3007-7e79-76d0-eb93-94bc59dee621.png)

この図は，3層構造のANNとなっている．
入力層と出力層の間にある層を隠れ層と呼び，外部から見えないような感じになる．
このモデルでは，出力値は3つになるため，分類モデルとなっている．

# 計算方法
3層ANNの計算についてみていくことにする．
隠れ層の1つ目の計算をしてみる．

```math
\begin{align}
z_{1}^{(2)} &= \sum_{i=0}^{3}\theta_ix_i \\
a_{1}^{(2)} &= g(z_{1}^{(2)}) \\
\end{align}
```

この計算を$a_{2}{(2)}$と$a_{3}{(2)}$も同じようにできる．
これをベクトル化させて一気に計算してみる．まず，

```math
\begin{align}
a^{(1)} &= \left(
\begin{matrix}
1\\
x_1\\
x_2\\
x_3\\
\end{matrix}
\right)\\
\\
\Theta^{(1)} &= \left(
\begin{matrix}
\theta_{01} & \theta_{11} & \theta_{21} & \theta_{31} \\
\theta_{02} & \theta_{12} & \theta_{22} & \theta_{32} \\
\theta_{03} & \theta_{13} & \theta_{23} & \theta_{33} \\
\end{matrix}\right)
\end{align}
```
と入力値のベクトル$a^{(1)}$とパラメータの行列$\Theta^{(1)}$を用意する．これらを使って，

```math
\begin{align}
z^{(2)} &= \Theta^{(1)}a^{(1)} \\
a^{(2)} &= g(z^{(2)}) \\
\end{align}
```

というように整理することが出来る．ここでバイアス項を考慮させて，以下のように$a^{(2)}$を加工しておく．

```math
a^{(2)} := \left(
\begin{matrix}
1 \\
a_1^{(2)} \\
a_2^{(2)} \\
a_3^{(2)} \\
\end{matrix}
\right)
```

そして，出力層の計算は以下のようになる．

```math
\begin{align}
z^{(3)} &= \Theta^{(2)}a^{(2)} \\
a^{(3)} &= g(z^{(3)}) \\
h_{\Theta}(x) &= a^{(3)} \\
\end{align}
```

$h_{\Theta}(x)$は，3つのノードの出力値を集めたものなので，3次のベクトルとなってる．


# 学習方法
上記で，入力値$x$から出力値$h_{\Theta}(x)$を求めることが出来た．
これを次のように組み立てる．

```math
\begin{align}
J(\Theta)=&-\frac{1}{m}\left[
\sum_{i=1}^m\sum_{k=1}^K y_k^{(i)} \log{h_{\theta}(x^{(i)})_k + (1-y_k^{(i)})\log(1-h_{\theta}(x^{(i)})_k)}
\right] \\
&+ \frac{\lambda}{2m}\sum_{l=1}^{L-1}\sum_{i=1}^{s_l}\sum_{j=1}^{s_l+1}(\Theta_{ji}^{(l)})^2
\end{align}
```

この大きな式がANNにおけるコスト関数となる．$J(\Theta)$の値が最小値になるような$\Theta$を探すことになる．
ここで，$m$は学習データ数，$K$は出力値の次元数（例のモデルだと3），$L$は層数，$s_l$は$l$層のノード数となっている．第1項の$\sum$の内側にある式は，分類の際に使用するロジスティック回帰である．そして，第2項は正則化項で，過学習(Over-fitting)を抑制し，バランスの良いパラメータを手に入れる効果がある．
ANNでも，勾配降下法による最適化問題を解くことになるが，$\frac{\partial}{\partial\Theta_{ij}^{(l)}}J(\Theta)$を手に入れる必要がある．
この値を手に入れるのに，バックプロパゲーション法(Back Propagation Algorithm)を用いる．
ちなみに，上記で計算していたものを，その対としてForward Propagationと呼ぶこともある．


# まとめ
今回は，ニューラルネットワークの計算方法についてまとめました．
通常の回帰モデルから一気に変数や添え字が増えるため，訳が分からないことがあります．
その時は，1つづつ砕いてゆっくりと進めていけば，問題ないでしょう．
Back Propagation Algorithmについては，別の機会に記事にしようと思います．