ゼロから作るDeep Learning 2章 パーセプトロン 備忘録


# はじめに
どうも，ろんです．
前回に引き続きオーム社の「ゼロから作るDeep Learning」の備忘録を書いていきます．

# 2章 パーセプトロン
## パーセプトロンとは
**パーセプトロン**とは複数の信号を入力として受け取り，一つの信号を出力するアルゴリズムである．
パーセプトロンの信号は「流す/流さない」の0か1であり，0は「信号を流さない」，1は「信号を流す」とする．

下の図に2入力のパーセプトロンの例を示す．
$x_1,x_2$は入力信号，$y$は出力信号，$w_1,w_2$は重みを表す．
○は**ニューロン**や**ノード**と呼ばれる．
入力信号はニューロンに送られる際にそれぞれ固有の重みが$w_1x_1,w_2x_2$のように乗算される．
ニューロンでは送られてきた信号の総和が計算され，その総和が特定の値（**閾値**）を超えた場合（発火するとも表現される）にのみ1を出力する．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519081/29f1c360-ad47-2b9b-ed08-2d16b0e6c664.png)

```math
y = \left\{
\begin{array}{ll}
0 & (w_1x_1 + w_2x_2  \leqq \theta) \\
1 & (w_1x_1 + w_2x_2 > \theta)
\end{array}
\right.
```

パーセプトロンは入力信号毎に固有の重みを持っており，重みが大きいほど信号の重要性が高くなる．

## 重みとバイアスによるパーセプトロンの実装
閾値$\theta$を$-b$とし，$b$を**バイアス**，$w_1,w_2$を**重み**として以下の式で表す．
バイアスと重み付きの入力信号の総和が0を上回れば1を出力し，そうでなければ1を出力する．
バイアスは発火のしやすさを表し，重みは入力信号の重要度をコントロールするパラメータとして扱われる．

```math
y = \left\{
\begin{array}{ll}
0 & (b + w_1x_1 + w_2x_2  \leqq 0) \\
1 & (b + w_1x_1 + w_2x_2 > 0)
\end{array}
\right.
```

ここで，論理回路のANDゲートをバイアスと重みを利用したパーセプトロンにて実装する．

```and.py
import numpy as np

def AND(x1, x2):
    # 入力
    x = np.array([x1, x2])
    # 重み
    w = np.array([0.5, 0.5])
    # バイアス
    b = -0.7
    # バイアス・重み付き入力
    tmp = np.sum(w*x) + b
    # 重み付き信号が0以下であれば0，0を上回れば1を返す
    if tmp <= 0:
        return 0
    else:
        return 1

if __name__ == '__main__':
    for xs in [(0, 0), (1, 0), (0, 1), (1, 1)]:
        y = AND(xs[0], xs[1])
        print(str(xs) + " -> " + str(y))
```

以下が出力結果であり，ANDゲートと同じ出力を行えていることが分かる．
重みやバイアスのパラメータによって出力をコントロールし，ANDゲートの出力を実現している．
このパラメータを変更することでNANDゲートやORゲートも実装できる．

```
(0, 0) -> 0
(1, 0) -> 0
(0, 1) -> 0
(1, 1) -> 1
```

## パーセプトロンの限界
次にXORゲートについて考える．
まず，ORゲートの挙動を式として考えると以下のようになる（重みとバイアスの組み合わせは無数に存在する）．

```math
y = \left\{
\begin{array}{ll}
0 & (-0.5 + x_1 + x_2  \leqq 0) \\
1 & (-0.5 + x_1 + x_2 > 0)
\end{array}
\right.
```

これを$x_1,x_2$についてのグラフで表現すると以下のようになる．
ORゲートは$(x_1,x_2)=(0,0)$のとき0を出力し，$(0,1),(1,0),(1,1)$のとき1を出力する．
図では0を◯，1を△としており，グレーで着色している箇所は0を出力するため期待する出力となっていることが分かる．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519081/6ea76099-f94d-948c-a3a7-348c8e36b81e.png)

一方，XORゲートを場合は$(x_1,x_2)=(0,0),(1,1)$のとき0を出力し，$(0,1),(1,0)$のとき1を出力するため，以下のようなグラフでなければ期待する出力が得られない．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519081/88b50300-a4c7-7067-863d-b51725d5cd5c.png)

パーセプトロンの限界はORゲートのような1本の直線でしか領域を表現できない点にあり，このような領域を**線形**な領域という．
これに対し，XORゲートのような曲線の領域を**非線形**な領域という．

## 多層パーセプトロン
ただし，パーセプトロンは層を重ねることができ，これによりXORゲートを表現できる．
例えば，XORゲートは通常のパーセプトロンを用いて（既存のNAND，OR，ANDゲートを用いて）以下のように分解できる．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519081/7fdefacd-c92e-a0e4-6d37-74e259bc7411.png)

XORゲートや下図のように多層構造を持つパーセプトロンを**多層パーセプトロン**とよぶ．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519081/0ade4abb-2b17-ec78-d987-f3bc437daa0c.png)

多層パーセプトロンは第0層のニューロンが信号を受け取り，第1層へ信号を送り，さらに第1層のニューロンが第2層へ信号を送り，第2層のニューロンが$y$を出力する．
このようにパーセプトロンは層を重ね，深くすることでより多くの表現が可能になる．

パーセプトロンを用いることで複雑な論理回路を構築しコンピュータを作成することも可能である．

なお，パーセプトロンはニューラルネットワークの基礎となる．


# おわりに
パーセプトロンは重みパラメータをユーザが決定する必要がありましたが，次章で学習するニューラルネットワークはデータからこのパラメータを自動で学習することができるらしいです．
画像認識等に応用するにはまだまだ勉強していく必要がありそうですね...
ではでは