フィードフォワードニューラルネットワーク(パラメーター自己シミュレーション)を使用して、XOR問題を解決します(Python実装)

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)))

おすすめ

転載: blog.csdn.net/mahoon411/article/details/112299993