## secter 2 パーセプトロン
### chapter 2.1 パーセプトロンとは
まず、パーセプトロンとはアルゴリズムの一種です。
詳しくは、複数の信号を入力として受け取り、一つの信号を出力するアルゴリズムとなっています。
パーセプトロンの動作原理を数式で表すとこうなります。
$$
\begin{equation}
y =
\begin{cases}
0, & w_1x_1 + w_2x_2\le \theta \\
1, & w_1x_1+w_2x_2>\theta
\end{cases}
\end{equation}
$$
wが重み(バイアス)を表しており、yが出力信号で、xが入力信号を表しております。
また、ここでのθは、送られてきた信号の総和の限界値としています。
パーセプトロンは、複数ある入力信号のそれぞれに固有の重みを持ちます。
そして、その重みは、各信号の重要性をコントロールする要素として働きます。
つまり、重みが大きければ大きいほど、その重みに対応する信号の重要性が高くなるのです。
### chapter 2.2 単純な論理回路
#### 2.2.1 ANDゲート
| x_1|x_2 | y|
| ------ | ----------- | -------|
| 0| 0| 0|
| 1| 0| 0|
| 0| 1| 0|
| 1| 1| 1|
このような、真理値表がある。
このような、2つの入力が1のときだけ1を出力し、それ以外は0を出力するようなものを**ANDゲート**と言います。
#### 2.2.2 NANDゲートとORゲート
まずは、NANDゲートから。
NANDゲートの、NANDとは、Not ANDを表しており、ANDゲートと逆の振る舞いをします。
真理値表では、以下のようになります。
| x_1|x_2 | y|
| ------ | ----------- | -------|
| 0| 0| 1|
| 1| 0| 1|
| 0| 1| 1|
| 1| 1| 0|
このような、2つの入力が1のときだけ0を出力し、それ以外は1を出力するようなものを**NANDゲート**と言います。
続いては、ORゲートを紹介していきます。
早速真理値表から、
| x_1|x_2 | y|
| ------ | ----------- | -------|
| 0| 0| 0|
| 1| 0| 1|
| 0| 1| 1|
| 1| 1| 1|
このような、2つの入力のうちどちらか一方でも1のときに1を出力し、それ以外は0を出力するようなものを**ORゲート**と言います。
ここまで、3つの論理回路を紹介してきましたが、
重要な点は、**パーセプトロンの構造は、AND、NAND、ORゲートの全てで同じであるということ。**
実際この三つで違っている点は、パラメータ(重み)の値だけでした。
つまり、パラメータを変化させることによって、自在に変化させることが可能だということです。
### chapter 2.3 パーセプトロンの実装
#### 2.3.1 簡単な実装
早速ANDゲートを実装していきます。
```python=
def AND(x1, x2):
w1, w2, theta = 0.5, 0.5, 0.7
tmp = x1*w1+x2*w2
if tmp <= theta:
return 0
elif tmp > theta:
return 1
print(AND(0,0)) #0
print(AND(1,0)) #0
print(AND(0,1)) #0
print(AND(1,1)) #1
```
#### 2.3.2 重みとバイアスの導入
パーセプトロンの動作原理の数式はこのようなものでした。
$$
\begin{equation}
y =
\begin{cases}
0, & w_1x_1 + w_2x_2\le \theta \\
1, & w_1x_1+w_2x_2>\theta
\end{cases}
\end{equation}
$$
こちらを、こうします。
bをバイアス、wを重みとしています。
$$
\begin{equation}
y =
\begin{cases}
0, & b+w_1x_1 + w_2x_2\le 0 \\
1, & b+w_1x_1+w_2x_2>0
\end{cases}
\end{equation}
$$
### 2.3.3 重みとバイアスの実装
ここでのバイアスとは、重みとは違う働きをすることに注意していきたい。
具体的には、w1,w2は入力信号への重要度をコントロールするパラメータとして機能するが、バイアスの方は、イベントの発火のしやすさを調整するパラメータとして機能します。
NANDゲートの実装をします。
```python=
def NAND(x1, x2):
x = np.array([x1, x2])
w = np.array([-0.5, -0.5])
b = 0.7
tmp = np.sum(w*x) + b
if tmp <= 0:
return 0
else:
return 1
```
ORゲートの実装の方はこちらになります。
```python=
def OR(x1, x2):
x = np.array([x1, x2])
w = np.array([0.5, 0.5])
b = -0.2
tmp = np.sum(w*x) + b
if tmp <= 0:
return 0
else:
return 1
```
### chapter 2.4 パーセプトロンの限界
#### 2.4.1 XORゲート
XORゲートは、排他的論理和とも呼ばれている論理回路です。
早速真理値表から、
| x_1|x_2 | y|
| ------ | ----------- | -------|
| 0| 0| 0|
| 1| 0| 1|
| 0| 1| 1|
| 1| 1| 0|