今日はよく寝れて空を飛べる気がしている大学生のMotmuuです.
パーセプトロンというアルゴリズムを用いて,ANDゲート・NANDゲート・NORゲートを実装してきました.
これからXORゲートを実装していきたいと思います.
#開発環境
以下の環境で勉強していきたいと思います.
・Python 3.6.5 ・Mac OS X 10.13.2 ・Atom 1.10.2
サンプルコードはこちら
#XORゲート
XORとは exclusive OR (排他的論理和)です.
x1とx2の排他的論理和をとるとすると,排他的という言葉のイメージの通りx1とx2が同じ入力を示す時は0,それ以外は1を出力します.真理値表は以下です!
x1 | x2 | y |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
それではこれをパーセプトロンで実装していきましょう.
パラメータは...定められますか??
#パーセプトロンは万能ではない?!
ここまで色々なことができたパーセプトロンですが,できないこともあります.
まずパーセプトロンの論理について解釈を少し広げます.
これまで
(式1)
y = 0 (w1 * x1 + w2 * x2 ≦ θ)
y = 1 (w1 * x1 + w2 * x2 > θ)
w1,w2 : 重み θ : 闘値
と定義してきましが,この闘値を左辺に持っていきましょう.
すなわちこれまでは定数のように扱っていましたが,新たにバイアス(b)という変数を与えます.
パワーアップした定義は以下のようになります.
(式2)
y = 0 (b + w1 * x1 + w2 * x2 ≦ 0)
y = 1 (b + w1 * x1 + w2 * x2 > 0)
w1,w2 : 重み b : バイアス
あまり変わっていない気がしますが,少しニュアンスが変わりました.
バイアスは1を出力させる度合いを決定するパラメータとして働きます.
ここで,この式を眺めていると気づくことがありませんか???
(式2)はx1とx2を変数とする2次元座標での領域を示しています.
この領域は線形(直線)によって分断されていますね...ここがポイントになります.
パーセプトロンが表すことができるのは,直線で分断することができる場合のみになります.よって,XORの場合を考えるとx1とx2の値の分布をうまく分けるような直線が引けないことがわかります.すなわちXORは非線形な領域をもつと言えます.
百聞は一見にしかず,下の図を見てください.
NADゲートは直線で分断できているのに対してXORゲートは直線では分断できていません.
では,XORゲートは諦めるしかないのでしょうか.
#それでもXORゲート
諦める必要はありません!なんとパーセプトロンは重ね合わせることができます.
では層を重ね合わせることで,XORゲートを実現させていきたいと思います.
x1 | x2 | s1 | s2 | y |
---|---|---|---|---|
0 | 0 | 1 | 0 | 0 |
0 | 1 | 1 | 1 | 1 |
1 | 0 | 1 | 1 | 1 |
1 | 1 | 0 | 1 | 1 |
s1 = x1 NAND x2
s2 = x1 OR x2
y = s1 AND s2
XORゲートが実現できましたね.
このように何層もパーセプトロンを重ねたものを 多層パーセプトロン と言います.
ではこれをPythonで実装していきましょう.
# これまで作った論理ゲートクラスをインポート
import AND
import NAND
import OR
# XORクラスの作成
class XOR():
def __new__(self,x1,x2):
return AND.AND(NAND.NAND(x1,x2),OR.OR(x1,x2))
# 確かめてみる
print(XOR(0,0))
print(XOR(0,1))
print(XOR(1,0))
print(XOR(1,1))
Terminalでの実行結果は以下のようになります.
********$ python XOR.py
0
1
1
0
無事,XORを実装することができました.
#まとめ
論理ゲートについては以上になります.
次はこれらの論理ゲートがどのようにコンピュータを構成しているのかをちょっとだけ勉強してみようかと思います.
次はこちら -> #5 NANDは全ての論理ゲート