続きやっていきます。パーセプトロンですが、以前Cで実装したことがあるので、軽く流す程度にします。
パーセプトロン
- アルゴリズム、人口ニューロンとも言い、ニューロンの仕組みを真似ている
- ローゼンブラットというアメリカの研究者によって1957年に考案された
- 複数の信号を入力として受け取り、ひとつの信号を出力する
- ニューロンの仕組みを基にしているので信号の出力を発火と読んでいる
- パーセプトロンは発火する・しないの二値しか出力しない
- このアルゴリズムを使ってANDゲートの作成するのは簡単
- NANDゲートもANDゲートの符号を逆にするだけで実装可能
- ORは閾値=入力信号x重み としておけば実装可能
パーセプトロンの実装
ANDゲートの実装
1 2 3 4 5 6 7 8 9 10 11 |
def AND(x1, x2): w1, w2, theta = 0.5, 0.5, 0.7 tmp = x1 * w1 + x2 * w2 if tmp <= theta: return 0 return 1 print('%s' % AND(0, 0)) # 0 print('%s' % AND(0, 1)) # 0 print('%s' % AND(1, 0)) # 0 print('%s' % AND(1, 1)) # 1 |
numpyを使って表現した場合(xは信号、wは重み、bはバイアス)
1 2 3 4 5 6 7 8 9 10 |
>>> import numpy as np >>> x = np.array([0, 1]) >>> w = np.array([0.5, 0.5]) >>> b = -0.7 >>> w*x array([ 0. , 0.5]) >>> np.sum(w*x) 0.5 >>> np.sum(w*x) + b -0.19999999999999996 |
numpyでANDゲートの関数化
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
# -*- coding: utf-8 -*- 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; return 1; print('%s' % AND(0, 0)) # 0 print('%s' % AND(0, 1)) # 0 print('%s' % AND(1, 0)) # 0 print('%s' % AND(1, 1)) # 1 |
バイアスは発火のしやすさを調整する。
NANDゲートとORゲートの実装
NANDゲートは重みとバイアスの符号をANDと逆にしています。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
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; return 1; print('%s' % NAND(0, 0)) # 1 print('%s' % NAND(0, 1)) # 1 print('%s' % NAND(1, 0)) # 1 print('%s' % NAND(1, 1)) # 0 |
ORはAND、NANDと値が違います
1 2 3 4 5 6 7 8 9 10 11 12 13 |
def OR(x1, x2): x = np.array([x1, x2]); w = np.array([1, 1]); b = 0.0 tmp = np.sum(w*x) + b if tmp <= 0: return 0; return 1; print('%s' % OR(0, 0)) # 0 print('%s' % OR(0, 1)) # 1 print('%s' % OR(1, 0)) # 1 print('%s' % OR(1, 1)) # 1 |
パーセプトロンの限界
これまでOR, AND, NAND と実装しましたが、情報処理でよく見かけるのはXORですね。この実装例を記述しなかったのはパーセプトロンという仕組みではXORを実現できないからです。
実現できない理由としては、他は線形(直線)に分離できる問題でしたが、XORは線形に分離できないという他のゲートとはことなった事情があります。
多重パーセプトロン
パーセプトロンは層を重ねることでXORを実現することができ、これを多重パーセプトロンといいます。
これまで、AND、NAND、ORのゲートを作りましたが、を組み合わせて、XORを作れば良いのです。
情報処理に出てきそうな内容ですね。
XORゲートの実装
1 2 3 4 5 6 7 8 9 |
def XOR(x1, x2): s1 = NAND(x1, x2) s2 = OR(x1, x2) return AND(s1, s2) print('%s' % XOR(0, 0)) # 0 print('%s' % XOR(0, 1)) # 1 print('%s' % XOR(1, 0)) # 1 print('%s' % XOR(1, 1)) # 0 |
まとめ
- パーセプトロンでAND、NAND、ORゲートを表現できた
- 多重パーセプトロンを作ることでXORゲートを表現できた
- 多重パーセプトロンでは非線形領域を表現することができる