未分類

パーセプトロンとは。

パーセプトロンとは
視覚と脳の機能をモデル化したものであり、パターン認識を行う、とwikiにある。

神経回路をプログラミングで表したものって感じですかね。

もうちょい言うと、
入力信号に対して内部で計算し、ある閾値を超えると発火するもの。
てな感じです。

図で書くとこういったイメージ。
persepu1
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

実行画像はこちら。
xor1

どうでしょうか。
単層パーセプトロンではできなかった処理が、
多層にすればできるってことですね。

この考え方が、後のニューラルネットワークにつながっていくって訳です。

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です