こんにちは。株式会社マックスネット 人工知能・AI開発チームのIsoです。
今回はパーセプトロンは単体だと、一体どこまで通用するのかを見てみましょう。
*********
さてpythonを使って、AND演算を作り、Numpyの使い方も学んだところで、このパーセプトロンはどこまで作れるのかという問題が出てきます。
いきなりですが、下の真理値表をご覧ください。
x1 | x2 | y |
0 | 0 | 0 |
1 | 0 | 1 |
0 | 1 | 1 |
1 | 1 | 0 |
これは排他的論理和と呼ばれるもので、この単純な仕組みをパーセプトロン単体でプログラムを組むことができません。
(線形問題は解けるが、非線形問題は解けない、なんて言い方をします)
かつてのAIの歴史で、この単純問題が解けない(実現できない)とのことで、冬の時代を迎えたこともあったようです。
しかし、この問題も工夫をすることでクリアできるんですね。
それが、多層パーセプトロンと呼ばれるものです。
さきほどのパーセプトロンは単体では解けないが、いくつも層を重ねて多層にすることで、解けるようになるんですね。
では、実際にやってみましょう。
まず前回までにAND演算というものが出てきましたが、
ここでNAND演算とOR演算をpythonで組んでいきます。
まずNAND演算の真理値表です。
x1 | x2 | y |
0 | 0 | 1 |
1 | 0 | 1 |
0 | 1 | 1 |
1 | 1 | 0 |
続いて、OR演算の真理値表です。
x1 | x2 | y |
0 | 0 | 0 |
1 | 0 | 1 |
0 | 1 | 1 |
1 | 1 | 1 |
では、NAND演算のpythonによる実装です。
1 2 3 4 5 6 7 8 9 |
def NAND(x1,x2): x = np.array([x1,x2]) w = np.array([-0.5,-0.5]) b = 0.7 kari = np.sum(w*x) + b if kari <= 0: return 0 else: return 1 |
次に、OR演算のpythonによる実装です。
1 2 3 4 5 6 7 8 9 |
def OR(x1,x2): x = np.array([x1,x2]) w = np.array([0.5,0.5]) b = -0.2 kari = np.sum(w*x) + b if kari <= 0: return 0 else: return 1 |
AND演算も使うので、こちらも載せておきます。
1 2 3 4 5 6 7 |
def AND(x1, x2): w1, w2, zzz = 0.5, 0.5, 0.7 tmp = x1*w1 + x2*w2 if tmp <= zzz: return 0 elif tmp > zzz: return 1 |
これで論理演算の代表格のゲートが揃いましたね。
この3つのゲートを組み合わせて、さきほど単体のパーセプトロンで解けなかった排他的論理和を解いていきます。
では、pythonで実装です。
1 2 3 4 5 6 7 8 9 |
def XOR(x1,x2): #NAND演算にx1、x2の値をそれぞれ代入 z1 = NAND(x1,x2) #同じくOR演算にそれぞれ代入 z2 = OR(x1,x2) #AND演算に上記2つの値を代入 #yの値を戻り値で得る y = AND(z1,z2) return y |
pythonのインタプリタで確認してみましょう。
上記の全コードをコピーして、貼り付けてください。
おっと、下記のコードも忘れずに。Numpy を使うので、これを入れないとエラーが出ます。
1 |
import numpy as np |
では、実行してみましょう。
>>> XOR(0,0)
0
>>> XOR(1,0)
1
>>> XOR(0,1)
1
>>> XOR(1,1)
0
さて、どうでしょうか。
排他的論理和の真理値表通りですね。
このように単体のパーセプトロンでも層を重ねることで、複雑な問題も解くことができるようになるんです。
ここから次に出てくるニューラルネットワークへと繋がっていきます。