ニューラルネットワーク

# パーセプトロンとニューラルネットワークの違い
パーセプトロンの応用がニューラルネットワーク
具体的には、最終的な出力の活性化関数が異なる

||活性化関数|伝達方法
|---|---|---|
|パーセプトロン|ステップ関数<br>一択|ステップ関数<br>　$ b + w_1 + x_1 + w_2$ <br>が $0$ を超えたら１、それ以外は $0$ を出力|
|ニューラルネットワーク|目的によって使い分ける<br>例）<br>回帰：恒等関数<br>分類：ソフトマックス関数<br>|$h(b + w_1 + x_1 + w_2) $<br> を出力|

を採用している

***

# ニューラルネットワークの概要図$

<img width="500" alt="重みの記号" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569644/078da12b-23b3-b521-4ce7-0a5e3fdae8d9.png">

第1層目の活性化関数の１番目のニューロン の活性化関数 $h()$ の入力は $a_1$

<img width="494" alt="入力層から第１層への信号の伝達" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569644/59bb84f3-c24a-0f2c-c3a6-50e006dfdacc.png">

|記号|意味|
|---|---|
|X|入力層|
|$W^{(1)}$|１層目め重み|
|$B^{(1)}$|１層目のバイアス|
|$A^{(1)}$|１層目の重み付き和|
|$h$|１層目の活性化関数|
|$z^{(1)}$|１層目の活性化関数の出力|


$$ A^{(1)} = XW^{(1)} + B^{(1)}$$
$$ Z^{(1)} = h(A^{(1)})$$

<img width="509" alt="第１層の行列表現" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569644/52d498bf-976e-45e2-0e38-d278af6c587a.png">


***

# 活性化関数
入力信号の総和
$$ 例： \ b + w_1 + x_1 + w_2 \  $$
を出力信号に変換する関数

$$ 例：h \ ( \ b + w_1 + x_1 + w_2 \ ) $$

を**活性化関数 ( activation function )**という

以下の活性化関数 $h(x)$ は入力が $0$ を超えたら $１$ を返し、そうでなければ $０$ を返す

```math
\begin{align}
h \ (\ x \ )
 &=
 \begin{cases}
    0 & ( \ x \leqq 0 \ ) \\
    1 & ( \ x \gt 0 \ )
  \end{cases}
\end{align}
```

多層ネットワークにおいて活性化関数に線形関数を用いると単層ネットワークで表現できるため、非線形関数を用いる
例）活性化関数 $$ h(x) = cx $$ である３層ネットワークを考えた場合

```math
\begin{align}
y(x) &= h(h(h(x))) \\
&=cx \times cx \times cx \\
&=c^3 \times x
\end{align}
```
となり係数だけが異なる単層ネットワークの関数として表現できる為

***

## 恒等関数
入力値をそのまま出力する関数
回帰問題などで採用される

$$h \ (\ x \ ) = x $$

<img width="185" alt="恒等関数" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569644/bccaa47e-069c-0a98-7973-ab52f6747aa7.png">


***

## ステップ関数
閾値が考慮された入力値に対して、入力値が $0$ 以下ならば $0$、それ以外は $1$ を返却する

```math
\begin{align}
h \ (\ x \ )
 &=
 \begin{cases}
    0 & ( \ x \leqq 0 \ ) \\
    1 & ( \ x \gt 0 \ )
  \end{cases}
\end{align}
```
***

## シグモイド関数 (sigmoid function)
ステップ関数に類似させた微分可能な関数
微分は勾配法によりパラメータを更新させる事が目的

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

## ReLU
入力が $0$ 以下であれば、$0$ を出力し、$0$ を超えていれば、その値を出力する関数

```math
\begin{align}
h \ (\ x \ )
 &=
 \begin{cases}
    0 & ( \ x \leqq 0 \ ) \\
    x & ( \ x \gt 0 \ )
  \end{cases}
\end{align}
```

<img width="401" alt="ReLU" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569644/d03d99bf-9d9a-af10-3788-f8a445060ec2.png">

***

## ソフトマックス
出力層が $n$ 個ある場合、$k$ 番目の出力 $y_k$ を求める場合

$$ y_k = \frac{e^{a_k}}{\displaystyle\sum_{i=1}^{n} e^{a_i}} $$

で定義される
但し、素で計算すると直ぐオーバーフローを起こしてしまう為

```math
\begin{align}
 y_k 
&= \frac{e^{a_k}}{\displaystyle\sum_{i=1}^{n} e^{a_i}} \\\\
&= \frac{Ce^{a_k}}{C\displaystyle\sum_{i=1}^{n} e^{a_i}} \\\\
&= \frac{e^{a_k + logC}}{\displaystyle\sum_{i=1}^{n} e^{a_i + logC}} \\\\
&= \frac{e^{a_k + C'}}{\displaystyle\sum_{i=1}^{n} e^{a_i + C'}} \\\\
\end{align}
```
とする。但し 
$ C=\max （e^{a_i}） \ （i = 1, 2, \cdots , n） \qquad C = e^{logC} \Longleftrightarrow  log_e C = log_e e^{logC} $


各出力は、下記に示すように全ての入力から影響を受ける
$0〜1.0$ までの値を取り、総和は$1$であるので、確率とみなす事ができる

<img width="186" alt="スクリーンショット 2020-04-05 12.35.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569644/66542baa-84c0-a7c2-00fc-4b92d23cabd9.png">

***

# 参照
[ゼロから作るDeep Learning](https://www.amazon.co.jp/%E3%82%BC%E3%83%AD%E3%81%8B%E3%82%89%E4%BD%9C%E3%82%8BDeep-Learning-%E2%80%95Python%E3%81%A7%E5%AD%A6%E3%81%B6%E3%83%87%E3%82%A3%E3%83%BC%E3%83%97%E3%83%A9%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0%E3%81%AE%E7%90%86%E8%AB%96%E3%81%A8%E5%AE%9F%E8%A3%85-%E6%96%8E%E8%97%A4-%E5%BA%B7%E6%AF%85/dp/4873117585)