深層学習を読んでいったときのメモ　(1. 順伝播型ネットワーク)

# 今回の内容

順伝播型ネットワーク

深層学習が成り立つ仕組み、問題に対するアプローチについて簡単に触れます。

# はじめに
最近、深層学習について興味があって、理解した内容を書いていこうと思います。
今回の教科書は[深層学習](http://www.amazon.co.jp/%E6%B7%B1%E5%B1%A4%E5%AD%A6%E7%BF%92-%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92%E3%83%97%E3%83%AD%E3%83%95%E3%82%A7%E3%83%83%E3%82%B7%E3%83%A7%E3%83%8A%E3%83%AB%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E5%B2%A1%E8%B0%B7-%E8%B2%B4%E4%B9%8B/dp/4061529021)という本で勉強します。教科書を丸っきり一緒のことは書かないです。
この本の内容は大きく分けて以下のものがあります。

1. 順伝播型ネットワーク
2. 確率的勾配降下法
3. 誤差逆伝播法
4. 自己符号化器
5. 畳込みニューラルネット
6. 再帰型ニューラルネット
7. ボルツマンマシン

順番にメモを書いていきます。今回は順伝播型ネットワークをメモを書きます。

## 1. 順伝播型ネットワーク

## 1.1 順伝播型ネットワークについて

**順伝播型ネットワーク**とは、情報が入力側から出力側に一方向にのみ伝搬させていくネットワークのことです。
(他の文献では多層パーセプトロンともいうみたいです。)

下の図は入力が4個あって、出力も4個です。別に入力数と出力数が異なっていてもよいです。
(例えば、色んな手書きの数字を入力にして、0～9の数字の評価を行なうってのは入力がN個で出力が10個だったりします。)

![順伝播ネットワーク.png](https://qiita-image-store.s3.amazonaws.com/0/44864/d81244f8-b7b4-905a-3c8a-ee0c247f7408.png)

丸の一つ一つが何らかの情報を表しており、これを**ユニット**といいます。
また、入力層、出力層、中間層はそれぞれ、
入力のユニットの集まりの層、最終結果のユニットの集まりの層、入力層と出力層の間の層
となっています。(中間層は隠れ層ともいうみたいです。)

中間層にあるユニットは、一つ前の層の情報を使って、新しい情報$u$を生成し、[活性化関数](https://ja.wikipedia.org/wiki/%E6%B4%BB%E6%80%A7%E5%8C%96%E9%96%A2%E6%95%B0)$f$に$u$を与えてユニットの出力$z$を作り出します。

## 1.2 ユニットの出力

さて、新しい情報$u$の生成の仕方ですが、
このネットワークは第1層から第2層、第2層から第3層・・・というように伝搬していきます。
伝搬させるときに情報に重みをつけて伝搬させていきます。
上の図ではオレンジの線に対して重みがのっている感じです。

例えば、第1層から第2層への伝搬を考えると、$u_1$は$x_1$の情報と$x_2$の情報、$x_3$の情報、$x_4$の情報と入力に依存しない微調整できるバイアス$b_1$で出来ています。
それぞれに対する重みを$w_{11}, w_{12}, w_{13}, w_{14}$とするとユニット$u_1$は以下のように算出されます。

```math
u_1 = w_{11} x_1 + w_{12} x_2 + w_{13} x_3 + w_{14} x_4 + b_1
```

これを$u_2, u_3, u_4$も同様に計算してあげると以下のように表現できます。

```math
u_2 = w_{21} x_1 + w_{22} x_2 + w_{23} x_3 + w_{24} x_4 + b_2\\
u_3 = w_{31} x_1 + w_{32} x_2 + w_{33} x_3 + w_{34} x_4 + b_3\\
u_4 = w_{41} x_1 + w_{42} x_2 + w_{43} x_3 + w_{44} x_4 + b_4
```

活性化関数$f$に$u_1, u_2, u_3, u_4$を与えてあげれば、ユニットの出力$z_1, z_2, z_3, z_4$は以下のようになります。

```math
z_1 = f(u_1)\\
z_2 = f(u_2)\\
z_3 = f(u_3)\\
z_4 = f(u_4)
```


これを行列表現すれば、かなり見通しがいいですね。

```math
\left[
    \begin{array}{rrr}
      u_1 \\
      u_2 \\
      u_3 \\
      u_4 
    \end{array}
\right]
 = 
\left[
    \begin{array}{rrr}
w_{11} & w_{12} & w_{13} & w_{14}\\
w_{21} & w_{22} & w_{23} & w_{24}\\
w_{31} & w_{32} & w_{33} & w_{34}\\
w_{41} & w_{42} & w_{43} & w_{44}
    \end{array}
\right]
\left[
    \begin{array}{rrr}
      x_1 \\
      x_2 \\
      x_3 \\
      x_4 
    \end{array}
\right]
 + 
\left[
    \begin{array}{rrr}
      b_1 \\
      b_2 \\
      b_3 \\
      b_4 
    \end{array}
\right]

⇒

{\bf u} = {\bf w} {\bf x} + {\bf b}
```

```math
\left[
    \begin{array}{rrr}
      z_1 \\
      z_2 \\
      z_3 \\
      z_4 
    \end{array}
\right]
 = 
f\left(
\left[
    \begin{array}{rrr}
      u_1 \\
      u_2 \\
      u_3 \\
      u_4 
    \end{array}
\right]
\right)
⇒

{\bf z} = f({\bf u})
```

## 1.3 多層ネットワーク

複数の層から出来ている順伝搬ネットワークを多層ネットワークといいます。

第1層の情報を${\bf z^{(1)}} = {\bf x}$、第2層の新しい情報を${\bf u^{(2)}}$、第1層から第2層への重みを${\bf w^{(1)}}$、第1層から第2層へのバイアスを${\bf b^{(1)}}$とすれば、

```math
{\bf u^{(2)}} = {\bf w^{(1)}} {\bf z^{(1)}} + {\bf b^{(1)}}
```

と書けるので、第$l+1$層の新しい情報は、下のようの簡潔に表わすことができます。

```math
{\bf u^{(l+1)}} = {\bf w^{(l)}} {\bf z^{(l)}} + {\bf b^{(l)}}
```

各層$(l = 1, 2, 3, \cdots)$に対して、適切な活性化関数$f^{(l)}$を用意してあげれば、各層のユニットの出力は以下のようになります。

```math
{\bf z^{(l+1)}} = f^{(l+1)}({\bf u^{(l+1)}})
```

## 1.4 順伝搬型ネットワークの設計

1.2, 1.3の内容から以下のようなことがわかります。

```
入力から、重みとバイアスを用いて、出力が計算される

⇒　入力から期待する結果を得るには、重みとバイアスを調節してあげればよい
```

従って、順伝搬型ネットワークの設計のアプローチとしては以下のようになります。

1. 入力に対する期待する結果を用意する
2. 重みとバイアスを調節して、入力から期待する結果得るようにする

ここで、入力を${\bf x}$、出力を${\bf y}$としたときの、順伝搬型ネットワークを${\bf y} = F({\bf x; w, b})$として定義することにします。

### 1.4.1 学習の枠組み

まず入力に対する期待する結果を用意します。
例えば、手書きの数字を認識させるとき、手書きの数字と期待する数字をペアでデータとして、いっぱい持っておきます。
この1つ1つのデータを**訓練サンプル**といい、その集合を**訓練データ**と呼びます。

ここでは、1つの入力を$x$、その期待する出力を$y$と定義します。
すると、N個の訓練サンプルは$d_1 = (x_1, y_1), d_2 = (x_2, y_2), \cdots, d_N = (x_N, y_N)$と定義でき、
訓練データは{$(x_1, y_1), (x_2, y_2), \cdots, (x_N, y_N)$}と表現できます。

次に、重みとバイアスを調節して訓練データ通りの結果にしたいけど、どうやって調節していくのか。

それは、ネットワークが表す関数$F$と訓練データとの近さを表す尺度を決めて、できるだけ差が少なくなるようにパラメータを調節します。
その尺度を表す関数を**損失関数**と呼びます。

どうも、考える問題について、適切な活性化関数と損失関数の組み合わせがあるようです。

先人の知恵をお借りすると、考える問題別に以下の組み合わせが一般的のようです

| 問題の種別 | 活性化関数 | 損失関数 |
|:-----------|:------------|:------------|
| 回帰 | 恒等写像 | 二乗誤差 |
| 二値分類 | ロジスティック関数 | エントロピー誤差 |
| 多クラス分類 | ソフトマックス関数 | 交差エントロピー誤差 |

回帰とは、出力値に連続値をとる関数を対象に訓練データをよく再現するような関数を定める問題のこと。
例えば、「身長から体重を推測する」とか「「広告宣伝費」と「来店者数」の関係から推測する」など。

二値分類は、入力の内容に応じて、2種類に区別する問題のこと
例えば、「顔の写真を与えた時に性別を判断する」など。

多クラス分類は、入力の内容に応じて、有限個のクラスに分類すること
例えば、「手書きの数字を入力して、数字を判断する」など。


なので、顔の写真を与えて、「～しているとき」「～していないとき」の判定を行なうときは二値分類のアプローチ、
「笑顔」「怒っている顔」「寝ている顔」「びっくりした顔」など判定したいときは多クラス分類のアプローチとなります。

あとは、式だけ紹介します。

恒等写像

```math
f(u) = u
```

ロジスティック関数

```math
f(u) = \frac{1}{1+e^{-u}}
```

ソフトマックス関数

```math
f_{k}^{(l)}(u) = \frac{\exp( {u_k^{(l)}} )}{\sum_{j=1}^{K} \exp( {u_j^{(l)}} )} (Kは各層のユニット数)
```

二乗誤差

```math
E({\bf w, b}) = \sum_{n=1}^{N} || d_n - F({\bf x_n; w, b}) ||
```

エントロピー誤差

```math
E({\bf w, b}) = -\sum_{n=1}^{N} [d_n \log(F({\bf x_n; w, b})) + (1 - d_n) \log(1 - F({\bf x_n; w, b}))] 
```

交差エントロピー誤差

```math
E({\bf w, b}) = -\sum_{n=1}^{N} \sum_{k=1}^{K}[d_{nk} \log(f_{k}^{(L-1)}({\bf x_n; w, b})))] 
```


次回は、確率的勾配降下法で、重みとバイアスの調節を行なう方法について書きます。