2章 パーセプトロン / ゼロから作る Deep Learning
パーセプトロンとは
パーセプトロンは複数の信号を入力として受け取り、ひとつの信号を出力
入力x1とx2にそれぞれ重みw1とw2が乗算され、その総和が閾値θを越えるとニューロンが発火する
$ y = \left\{ \begin{array}{c} 0 & (w1x1 + w2x2 \leqq \theta ) \\ 1 & (w1x1 + w2x2 \gt \theta ) \end{array} \right.
ANDゲート
ANDを満たすパラメータの例
(w1, w2, θ) = (0.5, 0.5, 0.7)
(0.5, 0.5, 0.8)
(1.0, 1.0, 1.0)
(選び方は無限にある)
NANDゲートとORゲート
table:ORゲート
x1 x2 y
0 0 0
1 0 1
0 1 1
1 1 1
ORゲートの例
(w1, w2, θ) = (1.0, 1.0, 0.9)
table:NANDゲート
x1 x2 y
0 0 1
1 0 1
0 1 1
1 1 0
NANDゲートの例
(w1, w2, θ) = (-0.5, -0.5, -0.7)
0 + 0 > -0.7 → 1
-0.5 + 0 > -0.7 → 1
0 + -0.5 > -0.7 → 1
-0.5 + -0.5 > -0.7 = -1.0 > -0.7 → 0
パーセプトロンの実装(簡単な実装)
code:chap2/and.py
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を出力
code:sh
$ python and.py
0
0
0
1
重みとバイアスの導入
上述の式のθを-bとすると以下のようになる
$ y = \left\{ \begin{array}{c} 0 & (b + w1x1 + w2x2 \leqq 0 ) \\ 1 & (b + w1x1 + w2x2 \gt 0 ) \end{array} \right.
b → バイアス
w1とw2 → 重み
code:chap2/gate.py
import numpy as np
def AND(x1, x2):
b = -0.7
tmp = np.sum(x*w) + b
if tmp <= 0:
return 0
else:
return 1
def OR(x1, x2):
# 重みとバイアスだけがANDと違う
b = -0.9
tmp = np.sum(x*w) + b
if tmp <= 0:
return 0
else:
return 1
def NAND(x1, x2):
# 重みとバイアスだけがANDと違う
b = 0.7
tmp = np.sum(x*w) + b
if tmp <= 0:
return 0
else:
return 1
print("*** AND ***")
print(AND(0, 0)) # 0を出力
print(AND(1, 0)) # 0を出力
print(AND(0, 1)) # 0を出力
print(AND(1, 1)) # 1を出力
print("*** OR ***")
print(OR(0, 0)) # 0を出力
print(OR(1, 0)) # 1を出力
print(OR(0, 1)) # 1を出力
print(OR(1, 1)) # 1を出力
print("*** NAND ***")
print(NAND(0, 0)) # 1を出力
print(NAND(1, 0)) # 1を出力
print(NAND(0, 1)) # 1を出力
print(NAND(1, 1)) # 0を出力
code:sh
$ python gate.py
*** AND ***
0
0
0
1
*** OR ***
0
1
1
1
*** NAND ***
1
1
1
0
パーセプトロンの限界
単層パーセプトロンではXORゲートは表現できない
https://gyazo.com/7229516a2c5994eb36e4562fdd0016da
多層パーセプトロンでは表現できる
code:chap2/gate.py
...
def XOR(x1, x2):
s1 = NAND(x1, x2)
s2 = OR(x1, x2)
return AND(s1, s2)
...
print("*** XOR ***")
print(XOR(0, 0)) # 0を出力
print(XOR(1, 0)) # 1を出力
print(XOR(0, 1)) # 1を出力
print(XOR(1, 1)) # 0を出力
参考
Scrapboxで使えるTeX記法まとめ