我的简化神经网络无法学习XOR门

时间:2016-09-11 09:29:16

标签: matlab neural-network xor

我正在尝试验证本书的结果:'Artificial Intelligence: A guide to Intelligent Systems 2nd Edition' by Michael Negnevitsky,第181-183页,关于神经网络XOR门。

该算法很简单,本书要求NN在224个时期或896个迭代中学习。它显示了手动计算的第一个迭代,我的程序计算相同的值。但这就是相似之处停止的地方。

我无法让它在本书附图6.11所示的任何地方执行。书中的网络(图6.10)如下图所示,然后是我的MATLAB代码。

网络

Network
图6.10 用于解决异或操作的三层网络

操作学习曲线异或:

LearningCurve
图6.11 操作学习曲线“异或”

代码:

close all; clear; clc;
alpha = 0.1; % Learning rate parameter

% Initial conditions in the book
w13 = 0.5;
w14 = 0.9;
w23 = 0.4;
w24 = 1.0;

w35 = -1.2;
w45 = 1.1;

t3 = 0.8;
t4 = -0.1;
t5 = 0.3;
cost = zeros(1,4);

X = [1 0 1 0;
     1 1 0 0];

Y = [0 1 1 0];

for epoch=1:250
    for i=1:4
        x1 = X(1,i);
        x2 = X(2,i);
        yd = Y(i);

        y3 = logsig(x1 * w13 + x2 * w23 - t3); % neuron 3 output
        y4 = logsig(x1 * w14 + x2 * w24 - t4); % neuron 4 output

        y5 = logsig(y3 * w35 + y4 * w45 - t5); % network output

        e = yd - y5; % error
        cost(epoch,i) = e^2;
        delta5 = y5 * (1 - y5) * e;

        % output neuron weight differentials
        dw35 = alpha * y3 * delta5;
        dw45 = alpha * y4 * delta5;
        dt5 = alpha * (-1) * delta5;

        delta3 = y3 * (1 - y3) * delta5 * w35;
        delta4 = y4 * (1 - y4) * delta5 * w45;
        % Hidden neuron weight differentials
        dw13 = alpha * x1 * delta3;
        dw23 = alpha * x2 * delta3;

        dt3 = alpha * (-1) * delta3;

        dw14 = alpha * x1 * delta4;
        dw24 = alpha * x2 * delta4;

        dt4 = alpha * (-1) * delta4;

        % Weight updates
        w13 = w13 + dw13;
        w14 = w14 + dw14;
        w23 = w23 + dw23;
        w24 = w24 + dw24;
        w35 = w35 + dw35;
        w45 = w45 + dw45;

        t3 = t3 + dt3;
        t4 = t4 + dt4;
        t5 = t5 + dt5;
    end
    if(sum(cost,2) < 0.001)
        break
    end
end

semilogy(1:250, sum(cost,2))
%% Test
for i=1:4
    x1 = X(1,i);
    x2 = X(2,i);
    yd = Y(i);

    y3 = logsig(x1 * w13 + x2 * w23 - t3);
    y4 = logsig(x1 * w14 + x2 * w24 - t4);

    y5 = logsig(y3 * w35 + y4 * w45 - t5);

    disp(['         YD      Y'])
    disp([yd y5])
end

我希望有人看到我做错了什么。或者,在不太可能的情况下,确认书中的结果不可能与给出的信息(我怀疑它,因为根据我发现,2-2-1 NN应该能够轻松学习XOR) 。我只想拥有一个非常简单的2-2-1神经网络,只需要很少的代码。

0 个答案:

没有答案