首页 文章

神经网络不适合XOR

提问于
浏览
4

我创建了一个Octave脚本,用于使用反向传播训练具有1个隐藏层的神经网络,但它似乎不适合XOR函数 .

  • x 输入4x2矩阵 [0 0; 0 1; 1 0; 1 1]

  • y 输出4x1矩阵 [0; 1; 1; 0]

  • theta 隐藏/输出图层权重

  • z 加权总和

  • a 激活函数应用于加权和

  • m 样本数量( 4 此处)

我的权重初始化如下

epsilon_init = 0.12;
theta1 = rand(hiddenCount, inputCount + 1) * 2 * epsilon_init * epsilon_init;
theta2 = rand(outputCount, hiddenCount + 1) * 2 * epsilon_init * epsilon_init;

前馈

a1 = x;
a1_with_bias = [ones(m, 1) a1];
z2 = a1_with_bias * theta1';
a2 = sigmoid(z2);
a2_with_bias = [ones(size(a2, 1), 1) a2];
z3 = a2_with_bias * theta2';
a3 = sigmoid(z3);

然后我计算逻辑成本函数

j = -sum((y .* log(a3) + (1 - y) .* log(1 - a3))(:)) / m;

反向传播

delta2 = (a3 - y);
gradient2 = delta2' * a2_with_bias / m;

delta1 = (delta2 * theta2(:, 2:end)) .* sigmoidGradient(z2);
gradient1 = delta1' * a1_with_bias / m;

使用梯度检查验证梯度是正确的 .

然后我使用这些渐变来使用梯度下降找到theta的最佳值,尽管使用Octave的 fminunc 函数会产生相同的结果 . 成本函数收敛于 ln(2) (或 0.5 表示平方误差成本函数),因为无论我使用多少隐藏单位,网络都会为所有四个输入输出 0.5 .

有谁知道我的错误在哪里?

2 回答

  • 1

    在初始化权重时从较大范围开始,包括负值 . 您的代码很难在正负权重之间进行"cross-over",而您可能意味着在放置 * 2 * epsilon_init * epsilon_init; 时放入 * 2 * epsilon_init - epsilon_init; . 修复可能会修复您的代码 .

    根据经验,我会做这样的事情:

    theta1 = ( 0.5 * sqrt ( 6 / ( inputCount + hiddenCount) ) * 
        randn( hiddenCount, inputCount + 1 ) );
    theta2 = ( 0.5 * sqrt ( 6 / ( hiddenCount + outputCount ) ) * 
        randn( outputCount, hiddenCount + 1 ) );
    

    乘数只是我在课程中提到的一些建议,我认为它得到了一份研究论文的支持,该论文比较了几种不同的方法 .

    此外,如果运行基本梯度下降,则可能需要大量迭代才能学习XOR . 我建议在宣布学习不起作用之前至少运行10000次 . fminunc 函数应该做得更好 .

    我用2个隐藏的神经元,基本的梯度下降和上面的初始化来运行你的代码,并且它正确地学习了XOR . 我也试过添加动量术语,学习更快更可靠,所以我建议你再看一下 .

  • 5

    隐藏层中至少需要3个神经元,并在第一个答案建议时更正初始化 . 如果sigmoidGradient(z2)表示a2 . *(1-a2),那么剩下的代码对我来说似乎没问题 .

    最好的关注,

相关问题