パーセプトロンとは?
パーセプトロンとは、複数の信号を入力として受取、一つの信号を出力します。
パーセプトロンの信号は1or0の二値の値です。今回は0を流さない、1を流すに対応させて記述します。
ゲートの種類
AND
x1 | x2 | y |
---|---|---|
0 | 0 | 0 |
1 | 0 | 0 |
0 | 1 | 0 |
1 | 1 | 1 |
NAND
x1 | x2 | y |
---|---|---|
0 | 0 | 1 |
1 | 0 | 1 |
0 | 1 | 1 |
1 | 1 | 0 |
OR
x1 | x2 | y |
---|---|---|
0 | 0 | 0 |
1 | 0 | 1 |
0 | 1 | 1 |
1 | 1 | 1 |
パーセプトロンの実装
簡単な実装
- AND関数を定義
def AND(x1, x2)
w1, w2, theta = 0.5, 0.5, 0.7
temp = x1*w1+x2*w2
if tmp <= theta:
return 0
elif tmp > theta:
return 1
パラメータのw1, w2, thetaは関数内で初期化し、重み付きの入力の総和が閾値を超えると1を返し、それ以外は0を返します。それでゃ、図2-2のとおり出力されるか確認しましょう。
AND(0, 0) # 0
AND(1, 0) # 0
AND(0, 1) # 0
AND(1, 1) # 1
期待した挙動が得られました。
同様にNANDもORも実装することができます。
重みとバイアスの導入
y = 0(b+w1x1+w2x2 <= 0)
1(b+w1x1+w2x2 > 0)
>>>import numpy as np
>>>x = np.array([0,1])
>>>w = np.array([0.5, 0.5])
>>>b = -0.7
>>>w*x
>>>array([0. , 0.5])
>>>np.sum(w*x)
0.5
>>>np.sum(w*x) + b
-0.19999999996
重みとバイアスによる実装
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
if tmp <= 0:
return 0
else:
return 1
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
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
XORゲート
XORゲートは排他的論理和とも呼ばれる論理回路です。
OR
x1 | x2 | y |
---|---|---|
0 | 0 | 0 |
1 | 0 | 1 |
0 | 1 | 1 |
1 | 1 | 0 |
この結果を式で表すことが難しい。
多層パーセプトロン
パーセプトロンではXORゲートを表現できませんでした。しかし、それは層を重ねることによって可能になる。
既存ゲートの組み合わせ
NANDとORの組み合わせの値とANDによってXORゲートは表現することが可能。
XOR
|x1|x2|s1|s2|y|
|---|---|---|
|0|0|1|0|0|
|1|0|1|1|1|
|0|1|1|1|1|
|1|1|0|1|0|
XORの実装
def XOR(x1, x2):
s1 = NAND(x1, x2)
s2 = OR(x1, x2)
y = AND(s1, s2)
XOR(0, 0) # 0
XOR(1, 0) # 1
XOR(0, 1) # 1
XOR(1, 1) # 0
XORは2層のパーセプトロンです。
複数重ねたパーセプトロンを多層パーセプトロンと言うことがあります。
層を重ねるとより柔軟な表現を行うことが可能。
まとめ
- パーセプトロンは入出力を備えたアルゴリズム。ある入力を与えたら、決まった値が出力される。
- パーセプトロンでは、[重み]と[バイアス]をパラメーターとして設定する。
- パーセプトロンを用いれば、ANDやORゲートなどの論理回路を表現できる。
- XORゲートは単相のパーセプトロンでは表現できない。
- 2層のパーセプトロンを用いれば、XORゲートを表現することができる。
- 単相のパーセプトロンは線形領域だけしか表現できないのに対して、多層のパーセプトロンは非線形領域を表現することができる。
- 多層のパーセプトロンはコンピューターを表現できる。