0.問題
排他的論理和(排他的論理和、XOR、EOR、EX-OR)。1969年、マービンミンスキーは、ニューラルネットワークの2つの重要な欠陥を指摘した本「パーセプトロン」を出版しました。1つは、パーセプトロンが「排他的論理和」回路の問題を処理できないこと、もう1つは、当時のコンピューターが処理をサポートできないことです。大規模ニューラルネットワークの能力を計算します。これらの主張は、人々にパーセプトロンによって表されるニューラルネットワークに疑問を投げかけ、10年以上のニューラルネットワーク研究の「氷河期」につながりました。パーセプトロンはフィードフォワードニューラルネットワークの層(入力層なし)であると考えることができます。XOR問題を解決するには、2層フィードフォワードニューラルネットワーク(入力層なし)を使用してみてください。テストセットで100%の精度が必要です。具体的には、ニューラルネットワークのトレーニングセットとテストセットは同じであり、どちらもS = {(1、0、1)、(1、1、0)、(0、0、0)、(0、1、 1)}、各データの3番目の次元はラベルです。
1.問題分析
タイトルは、パーセプトロン(フィードフォワードニューラルネットワークの層)がXOR問題を実現できないことを指摘しています。これは主に、フィードフォワードニューラルネットワークの層が線形空間しか表現できず、XOR問題が非線形空間の問題であるためです。
デジタル回路の知識によれば、排他的ORゲートは、図に示すように、ANDゲート、NANDゲート、またはゲートを介して構成できます。
パーセプトロン(フィードフォワードニューラルネットワークの層)の知識によれば、ANDゲート、NANDゲート、およびORゲートはすべてニューラルネットワークの層によって実現できることがわかります。したがって、XORゲートは2層フィードフォワードニューラルネットワークによって実現できると推測できます。
2.実装手順
まず、図に示すように、ANDゲート、NANDゲート、ORゲート、XORゲートの真理値表をリストします。
真理値表の単純な論理により、ニューラルネットワークをトレーニングする必要はなく、2層ニューラルネットワークを構築するために重みとバイアスを直接設定します。
真理値表に従って構築された2層フィードフォワードニューラルネットワークを図に示します。
このニューラルネットワークの活性化関数は階段関数であり、ニューラルネットワークの各層の重みとバイアスは次の式で見ることができます。
これに基づいて、最初にpythonを使用して、ステップ関数を作成し、ニューラルネットワークを初期化し、フィードフォワード関数を作成できます。
import numpy as np
def step_function(x):
y = x > 0
return y.astype(np.int)
def init_network():
network = {
}
network['W1'] = np.array([[-0.5, 0.5], [-0.5, 0.5]])
network['b1'] = np.array([0.7, -0.2])
network['W2'] = np.array([0.5, 0.5])
network['b2'] = np.array([-0.7])
return network
def forward(network, x):
W1, W2 = network['W1'], network['W2']
b1, b2 = network['b1'], network['b2']
NAND_OR = step_function(np.dot(x, W1) + b1)
XOR = step_function(np.dot(NAND_OR, W2) + b2)
return XOR
最後に、テストセットS =((1、0、1)、(1、1、0)、(0、0、0)、(0、1、1))を構築された2層フィードフォワードに入力できますニューラルネットワークでは、出力結果がテストセットのラベルと比較され、最終的に精度が得られます。
network = init_network()
s_test = np.array([[1, 0, 1], [1, 1, 0], [0, 0, 0], [0, 1, 1]])
y = []
accuracy_cnt = 0
for i in range(0, 4):
y.append(forward(network, s_test[i, 0:2]))
if y[i] == s_test[i, 2]:
accuracy_cnt += 1
print('accuracy:', str(accuracy_cnt / len(s_test)))
3.実験結果と分析
コード実行後の出力を図に示します。
図に示すように、構築された2層フィードフォワードニューラルネットワークはXOR問題を解決し、テストセットの精度は100%です。
4.ソースコード
XOR.py
# -*- coding: utf-8 -*-
"""
Created on Wed Dec 23 20:30:24 2020
@author: jiawei
"""
import numpy as np
def step_function(x):
y = x > 0
return y.astype(np.int)
def init_network():
network = {
}
network['W1'] = np.array([[-0.5, 0.5], [-0.5, 0.5]])
network['b1'] = np.array([0.7, -0.2])
network['W2'] = np.array([0.5, 0.5])
network['b2'] = np.array([-0.7])
return network
def forward(network, x):
W1, W2 = network['W1'], network['W2']
b1, b2 = network['b1'], network['b2']
NAND_OR = step_function(np.dot(x, W1) + b1)
XOR = step_function(np.dot(NAND_OR, W2) + b2)
return XOR
network = init_network()
s_test = np.array([[1, 0, 1], [1, 1, 0], [0, 0, 0], [0, 1, 1]])
y = []
accuracy_cnt = 0
for i in range(0, 4):
y.append(forward(network, s_test[i, 0:2]))
if y[i] == s_test[i, 2]:
accuracy_cnt += 1
print('accuracy:', str(accuracy_cnt / len(s_test)))