#最初に
以下は、ゼロから作るDeeplearning(オライリー)の学習メモです。ソースコードは、この本からほぼ写したものです。
#パーセプトロンとは
パーセプトロンは複数の信号を受け取って、一つの信号を出力するもの。この信号は、「流す・流さない(1か0)」である。ニューロンでは、送られてきた信号の総和が計算され、その総和が限界値を超えると1を出力する。
つまり、パーセプトロンは、入力信号に重みが乗算された値とバイアスの和が計算され、その値によって出力値が0か1か決まる。
#ANDゲート
2つの信号が1の時だけ1を出力し、それ以外は0を出力する。ちなみに以下のような表を真理値表と呼ぶ。
x1 | x2 | y |
---|---|---|
0 | 0 | 0 |
1 | 0 | 0 |
0 | 1 | 0 |
1 | 1 | 1 |
Pythonによる実装例
>>> 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
if tmp <= 0:
return 0
else:
return 1
>>> AND(0.0)
0
>>> AND(1.0)
0
>>> AND(0.1)
0
>>> AND(1.1)
1
NANDゲート
NANDゲートの出力は、ANDゲートの出力を逆にしたものになる。2つの信号の両方が1の時だけ0を出力し、それいがいは1を出力する。
x1 | x2 | y |
---|---|---|
0 | 0 | 1 |
1 | 0 | 1 |
0 | 1 | 1 |
1 | 1 | 0 |
Pythonによる実装例
>>> import numpy as np
>>> 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
>>> NAND(0.0)
1
>>> NAND(1.0)
1
>>> NAND(0.1)
1
>>> NAND(1.1)
0
ORゲート
ORゲートは入力信号の少なくともひとつが1であれば、出力が1になる。
x1 | x2 | y |
---|---|---|
0 | 0 | 0 |
1 | 0 | 1 |
0 | 1 | 1 |
1 | 1 | 1 |
Pythonによる実装例
>>> import numpy as np
>>> def OR(x1,x2):
x = np.array([x1,x2])
w = np.array([0.5,0.5]) # ANDと違うのは重みとバイアスだけ
b = -0.2
tmp = np.sum(w*x) + b
if tmp <= 0:
return 0
else:
return 1
>>> OR(0.0)
0
>>> OR(1.0)
1
>>> OR(0.1)
1
>>> OR(1.1)
1
#XORゲート
入力値のどちらかが1の時だけ出力が1となる。多層パーセプトロンであり、AND, NAND, ORゲートの組み合わせで表現できる。
x1 | x2 | y |
---|---|---|
0 | 0 | 0 |
1 | 0 | 1 |
0 | 1 | 1 |
1 | 1 | 0 |
Pythonによる実装例
def XOR(x1,x2):
s1 = NAND(x1,x2)
s2 = OR(x1,x2)
y = AND(s1,s2)
return(y)
>>> XOR(0.0)
0
>>> XOR(1.0)
1
>>> XOR(0.1)
1
>>> XOR(1.1)
0
#終わりに
・パーセプトロンは入出力のアルゴリズムである。
・重みとバイアスを設定する。
・XORゲートは、AND, NAND, ORゲートの組み合わせで表現できる。
・多層のパーセプトロンは、理論上コンピューターを表現できる。