パーセプトロンとは
視覚と脳の機能をモデル化したものであり、パターン認識を行う、とwikiにある。
神経回路をプログラミングで表したものって感じですかね。
もうちょい言うと、
入力信号に対して内部で計算し、ある閾値を超えると発火するもの。
てな感じです。
図で書くとこういったイメージ。
x1、x2から入力値が入ります。
それぞれの入力値をw1、w2で重み付けします。
で、できた値の総和を取り、その値がある一定の閾値を超えると
yが1を出力すると。
これを「発火する」なんて言うらしい。
こんなイメージです。
このパーセプトロンをpython3コードで表現したい。
ある信号に対して結果を返すのだから、下記のゲートをまず作る。
AND
NAND
OR
それぞれのゲートをpython3コードで書いてみよう。
まずANDゲート
[py] ################ここから import numpy as np def AND(x1,x2): x=np.array([x1,x2]) #入力値である引数を配列に入れる w=np.array([0.5,0.5]) #重み付け baia=-0.7 #バイアスで調整する tori = np.sum(w*x)+baia #計算処理 if tori <= 0: #結果値をそれぞれ返す return 0 else: return 1 ################ここまで [/py]
ここで、1回python3のインタプリタで実行してみましょう。
上記のコードを書いて、AND.pyで保存。
で、python3を起動します。
今保存したAND.pyをモジュールとしてインポートします。
>>>import AND
で、実行します。
>>>AND.AND(0,0)
0
>>>AND.AND(1,0)
0
>>>AND.AND(0,1)
0
>>>AND.AND(1,1)
1
どうでしょう。実行結果はOKですね。
では続いて
NANDゲート
[py] ################ここから import numpy as np def NAND(x1, x2): x = np.array([x1, x2]) w = np.array([-0.5, -0.5]) baia = 0.7 tori = np.sum(w*x) + baia if tori <= 0: return 0 else: return 1 ################ここまで [/py]
ORゲート
[py] ################ここから import numpy as np def OR(x1, x2): x = np.array([x1, x2]) w = np.array([0.5, 0.5]) baia = -0.2 tori = np.sum(w*x) + baia if tori <= 0: return 0 else: return 1 ################ここまで [/py]
NANDゲートもORゲートも
ANDゲートの重みとバイアスの値を変えただけっていう単純さがいいですね。
で、いろいろ本で調べていたのだが、
パーセプトロンは単層の場合、XORゲートを作れないことが証明されたそうです。
XORゲートってのは、排他的論理和ってやつですね。
この単純な処理すらできない。
この事が、実はかつてのAIブームを終わらせたひとつの原因らしいです。
ところがここで終わらないのが人間のすごいところ。
単層のパーセプトロンでXORゲートが作れないんだったら、
多層にすればいいんじゃないってことに気づくんですね。
そう、今書いた
AND
NAND
OR
それぞれのコードの結果値を組み合わせて、
XORゲートを書けるんじゃないかと。
で、できたのがこれ。
XORゲート1
[py] ################ここから def XOR(x1, x2): s1 = NAND(x1, x2) s2 = OR(x1, x2) y = AND(s1, s2) return y ################ここまで [/py]
単純明快ですよね。
NAND→OR→ANDゲートと結果値を渡していき、最後の値は
XORゲートになるなんて。
たいしたもんです。
じゃあ、これらを全部まとめて
XORゲートを動かしてみましょう。
XORゲート2
[py] ################ここから import numpy as np def AND(x1,x2): x=np.array([x1,x2]) w=np.array([0.5,0.5]) baia=-0.7 tori = np.sum(w*x)+baia if tori <= 0: return 0 else: return 1 def NAND(x1, x2): x = np.array([x1, x2]) w = np.array([-0.5, -0.5]) baia = 0.7 tori = np.sum(w*x) + baia if tori <= 0: return 0 else: return 1 def OR(x1, x2): x = np.array([x1, x2]) w = np.array([0.5, 0.5]) baia = -0.2 tori = np.sum(w*x) + baia if tori <= 0: return 0 else: return 1 def XOR(x1, x2): s1 = NAND(x1, x2) s2 = OR(x1, x2) y = AND(s1, s2) return y ################ここまで [/py]
こいつをXOR.pyとして保存。
python3を起動してモジュールとして読み込みます。
>>>import XOR
で、実行します。
>>>XOR.XOR(0,0)
0
>>>XOR.XOR(1,0)
1
>>>XOR.XOR(0,1)
1
>>>XOR.XOR(1,1)
0
実行画像はこちら。
どうでしょうか。
単層パーセプトロンではできなかった処理が、
多層にすればできるってことですね。
この考え方が、後のニューラルネットワークにつながっていくって訳です。