使用深度神经网络学习XOR

时间:2019-06-26 19:40:28

标签: matlab neural-network deep-learning

我不是深度学习的新手,所以我从最简单的测试用例开始:异或学习。

在G&W发行的新版《数字图像处理》中,作者举了一个通过3个层的深层网络进行XOR学习的示例:输入,隐藏和输出(每个层有2个神经元。),以及一个S形。网络激活功能。

对于网络的信息化,他们说:“我们使用alpha = 1.0,这是初始的高斯随机权重集,均值为零,标准偏差为0.02 ”(alpha是梯度下降学习率)。 培训有4个带有标签的示例:

X = [1 -1 -1 1;1 -1 1 -1];%MATLAB syntax
R = [1 1 0 0;0 0 1 1];%Labels

我编写了以下MATLAB代码来实现网络学习过程:

function output = neuralNet4e(input,specs)


NumPat = size(input.X,2);%Number of patterns
NumLayers = length(specs.W);
for kEpoch = 1:specs.NumEpochs

    % forward pass

    A = cell(NumLayers,1);%Output of each neuron in each layer
    derZ = cell(NumLayers,1);%Activation function derivative on each neuron dot product 
    A{1} = input.X;

    for kLayer = 2:NumLayers

       B = repmat(specs.b{kLayer},1,NumPat);
       Z = specs.W{kLayer} * A{kLayer - 1} + B;
       derZ{kLayer} = specs.activationFuncDerive(Z);
       A{kLayer} = specs.activationFunc(Z);

    end

    % backprop

    D =  cell(NumLayers,1);
    D{NumLayers} = (A{NumLayers} - input.R).* derZ{NumLayers};
    for kLayer = (NumLayers-1):-1:2

        D{kLayer} = (specs.W{kLayer + 1}' * D{kLayer + 1}).*derZ{kLayer};

    end

    %Update weights and biases

    for kLayer = 2:NumLayers

        specs.W{kLayer} = specs.W{kLayer} - specs.alpha * D{kLayer} * A{kLayer - 1}' ;
        specs.b{kLayer} = specs.b{kLayer} - specs.alpha * sum(D{kLayer},2);

    end

end

output.A = A;

end

现在,当我使用它们的设置时(即,标准设置为0.02的权重初始化)

clearvars
s = 0.02;
input.X = [1 -1 -1 1;1 -1 1 -1];
input.R = [1 1 0 0;0 0 1 1];
specs.W = {[];s * randn(2,2);s * randn(2,2)};
specs.b = {[];s * randn(2,1);s * randn(2,1)};
specs.activationFunc = @(x) 1./(1 + exp(-x));
specs.activationFuncDerive = @(x) exp(-x)./(1 + exp(-x)).^2;
specs.NumEpochs = 1e4;
specs.alpha = 1;
output = neuralNet4e(input,specs);

我(在10000次练习之后)得到了网络的最终输出是 output.A{3} = [0.5 0.5 0.5 0.5;0.5 0.5 0.5 0.5]

但是当我将s = 0.02;更改为s = 1;时,我得到了output.A{3} = [0.989 0.987 0.010 0.010;0.010 0.012 0.0.98 0.98]

是否可能以s = 0.02;得到这些结果?我在代码中做错了什么?还是标准偏差0.02只是一个错字?

1 个答案:

答案 0 :(得分:1)

根据您的代码,我看不到任何错误。据我所知,您得到的结果,

class Solution(object):
    def isBalanced(self, root):
        """
        :type root: TreeNode
        :rtype: bool
        """
        if not root or not root.left and not root.right:
            return 0
        a = self.isBalanced(root.left)
        b = self.isBalanced(root.right)
        if abs(a-b)<=1:
            return 1 + max(a,b)
        else:
            return False
        return True

这是过度拟合的典型结果。发生这种情况的原因很多,例如时期太多,学习率太大,样本数据太小等等。

在您的示例中,s = 0.02限制了随机权重和偏差的值。将其更改为s = 1会使随机值保持不变/不按比例缩放。

要使s = 0.02有效,您可以尝试减少时期数或降低alpha。

希望这会有所帮助。