パーセプトロンとは
人間の脳の最小単位であるニューロンを真似して作られたアルゴリズムで、
複数の0か1の入力を基に一つの0か1を出力するアルゴリズムです。
図で表すと、以下のようになります。
出力する値を0か1かを決定するために入力された値には、重みづけをして、合計します。
以下の図のように入力値をx・重みをwとすると、計算式は、
x1×w1+x2×w2+x3×w3
となります。
出力を判定するためには、合計された値がいくら以上であれば1とするかを定義します。
たとえば、合計値が0.4以上であれば、1を出力するとなります。
単純な論理回路の実装
パーセプトロンのアルゴリズムをつかって、AND/OR/NAND/XORを表現します。
入力は二つで、出力は一つになります。
AND
import numpy as np def andGate(x1, x2): x = np.array([x1, x2]) w = np.array([0.5, 0.5]) #重みづけ b = -0.5 #閾値 tmp = np.sum(x * w) + b if tmp <= 0: return 0 else: return 1 print("andGateの確認") print("andGate(0,0)=" + str(andGate(0, 0))) print("andGate(1,0)=" + str(andGate(1, 0))) print("andGate(0,1)=" + str(andGate(0, 1))) print("andGate(1,1)=" + str(andGate(1, 1)))
実行結果
andGateの確認 andGate(0,0)=0 andGate(1,0)=0 andGate(0,1)=0 andGate(1,1)=1
OR
import numpy as np def orGate(x1, x2): x = np.array([x1, x2]) w = np.array([0.5, 0.5]) #重みづけ b = -0.4 #閾値 tmp = np.sum(x * w) + b if tmp <= 0: return 0 else: return 1
実行結果
orGateの確認 orGate(0,0)=0 orGate(1,0)=1 orGate(0,1)=1 orGate(1,1)=1
NAND(Not AND)
import numpy as np def nandGate(x1, x2): x = np.array([x1, x2]) w = np.array([-0.5, -0.5]) #重みづけ b = 0.7 #閾値 tmp = np.sum(x * w) + b if tmp <= 0: return 0 else: return 1
実行結果
nandGateの確認 nandGate(0,0)=1 nandGate(1,0)=1 nandGate(0,1)=1 nandGate(1,1)=0
AND/OR/NANDのポイント
AND/OR/NANDは、重みの値と閾値を変更するだけで、実現できます。
XOR
XOR(排他的論理和)は、AND/OR/NANDを組み合わせることで実現させます。
~省略~ def xorGate(x1, x2): s1 = nandGate(x1, x2) s2 = orGate(x1, x2) return andGate(s1, s2) print("xorGateの確認") print("xorGate(0,0)=" + str(xorGate(0, 0))) print("xorGate(1,0)=" + str(xorGate(1, 0))) print("xorGate(0,1)=" + str(xorGate(0, 1))) print("xorGate(1,1)=" + str(xorGate(1, 1)))
実行結果
xorGateの確認 xorGate(0,0)=0 xorGate(1,0)=1 xorGate(0,1)=1 xorGate(1,1)=0
パーセプトロンを確認する理由
パーセプトロンを多層化することで、より複雑な情報を処理できるようになります。
そして、パーセプトロンを参考にして、機械学習のニューラルネットワークが誕生し、
そして、ニューラルネットワークを何重にも多層化したものがディープラーニングなります。
最後に・・・
ようやく機械学習っぽい勉強になってきました。