Pythonの勧め(4)パーセプトロンについて

Pythonの勧め(4)パーセプトロンについて

パーセプトロンとはニューラルネットワークを学習する上でその起源となるものです。パーセプトロンを理解することは機械学習を勉強する上で重要な入り口となるでしょう。
そして神経細胞の仕組みをアルゴリズムに取り入れたのがパーセプトロン(人口ニューロン)です。

ニューロンとは

人の神経細胞のことをニューロン(neuron)といいます。RIKEN BRAIN SCIENCE INSTITUTE のページを読むと神経細胞の概ねを知ることができると思いますが、その中でもその情報のやりとりの手法に着目しておきたいのが次の部分になります。

樹状突起が受け取った電気信号は、“出力装置”である「軸索」を通って、次の神経細胞に伝達される。

つまりこれをアルゴリズムで表すと、複数の入力値に対して結果として出力する値は0か1のどちらかで出力する。つまりそのような結果を返す関数を考えてやれば良いことになります。

この考え方を数学の式で考えると嫌になりますが、プログラムで考えると造作ないことです。
ある入力値が何らかの基準を満たせば、1。そうでなければ0を返したいとなると通常のプログラミングの初級レベルの問題ですね。
if文の入った関数でも作ればできてしまいます。

ではPythonで考えてみましょう。

Pythonで考えるパーセプトロン

まずはANDゲートを関数化してみます。ANDゲートとは論理積の論理ゲートです。つまり、1か0の入力値を用意して、どちらの入力値も1だった場合のみtrueを返し、そうでない場合はfalseを返す回路です。

以下のサンプルはAND関数を作成したものです。
x1とx2の値は1か0のどちらかです。
w1,w2は重みです。また、thetaはバイアスです。

ANDゲートのコード

import numpy as np
def AND(x1,x2):
    w1 = 0.5
    w2 = 0.5
    theta = 0.7
    tmp = x1*w1 + x2*w2
    if tmp <= theta:
        return 0
    elif tmp > theta:
        return 1

上記のコードはNumPy配列を使って次のように書き換えることができます。

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関数を実際に試して見るとx1=0,x2=0の場合は結果は0になります。

AND(0,0)

結果
0

x1=1,x2=0の場合は結果は0になります。

AND(1,0)

結果
0

x1=0,x2=1の場合は結果は0になります。

AND(0,1)

結果
0

x1=1,x2=1の場合は結果は1になります。

AND(1,1)

結果
1

次はNANDゲードを試してみます。
NANDゲードのコード

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

x1=0,x2=0の場合は結果は1になります。

NAND(0,0)

結果
1

x1=1,x2=0の場合は結果は1になります。

NAND(1,0)

結果
1

x1=0,x2=1の場合は結果は1になります。

NAND(0,1)

結果
1

x1=1,x2=1の場合は結果は0になります。

NAND(1,1)

結果
0

ORゲードを試してみます。
ORゲートコード

import numpy as np
def OR(x1,x2):
    x = np.array([x1,x2])
    w = np.array([0.5,0.5])
    b = -0.2
    tmp = np.sum(w*x) + b
    if tmp <= 0:
        return 0
    else:
        return 1

x1=0,x2=0の場合は結果は0になります。

OR(0,0)

結果
0

x1=1,x2=0の場合は結果は1になります。

OR(1,0)

結果
1

x1=0,x2=1の場合は結果は1になります。

OR(0,1)

結果
1

x1=1,x2=1の場合は結果は1になります。

OR(1,1)

結果
1

ここまでみてきたようにパーセプトロンは入力値からある結果を導き出すことができますが、問題点としてw1,w2のような重みや、thetaのようなバイアスを結果を導き出すために手動で決定して行かなければならない点です。
また、実はこのやり方ではXORゲートを表現できません。ここまでがは単層パーセプトロンの限界なのです。そしてXORゲートを表現するにはパーセプトロンを多層化する必要が出てきます。