パーセプトロンでXORを作る

結論から言うとパーセプトロンでXORは作れません。
作ることができたら学会で発表できるレベルです。
どのように重みを設定しても、XORは実現できないはずです。

それは、XORが非線形問題であるからです。
これまでの課題はすべてグラフ上で直線で表現できました。
しかし、XORは直線ではないのです。
XORは入力値が異なる場合にのみ「1」となります。

しかし、XORはこれまでに作成したANDとORとNANDを組み合わせることで実現することができます。というか、そもそもNAND回路があればORとANDを作ることができるのでNAND回路でコンピュータを実現することができます。NAND回路が実現できている時点でパーセプトロンはコンピュータを表現できるということが証明されています。

# 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.5
    tmp = np.sum(w*x) + b
    if tmp <= 0:
        return 0
    else:
        return 1

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

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

def XOR(x1, x2):
    s1 = NAND(x1, x2)
    s2 = OR(x1, x2)
    y = AND(s1, s2)
    return y

print("(0, 0) -> " + str(XOR(0, 0)))
print("(0, 1) -> " + str(XOR(0, 1)))
print("(1, 0) -> " + str(XOR(1, 0)))
print("(1, 1) -> " + str(XOR(1, 1)))

 

ちょっと長いですが、これまでに出てきたコードばかりです。
意外と簡単であることに驚かされます。
出力結果は

(0, 0) -> 0
(0, 1) -> 1
(1, 0) -> 1
(1, 1) -> 0

となります。

システム開発

Posted by @erestage