【问题标题】:Neural Network not fitting XOR神经网络不适合 XOR
【发布时间】:2015-02-04 16:55:04
【问题描述】:

我创建了一个 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

有人知道我的错误在哪里吗?

【问题讨论】:

  • 请显示权重初始化(theta 的起始值)。猜测一下,这可能是你的问题。如果是,我会解释。
  • epsilon_init = 0.12; theta1 = rand(hiddenCount, inputCount + 1) * 2 * epsilon_init * epsilon_init; theta2 = rand(outputCount, hiddenCount + 1) * 2 * epsilon_init * epsilon_init; 不知道如何在评论中正确格式化,对此感到抱歉!
  • 我的直觉错了,但至少现在我可以看看我是否复制了你的结果
  • 我又试了一次,它实际上不适用于 OR 和 AND,尽管它会收敛到不同的值。

标签: matlab machine-learning neural-network octave backpropagation


【解决方案1】:

初始化权重时从更大的范围开始,包括负值。您的代码很难在正负权重之间“交叉”,而您可能打算输入* 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。我还尝试了添加动量项,学习更快更可靠,所以我建议你接下来看看。

【讨论】:

【解决方案2】:

您需要在隐藏层中至少有 3 个神经元,并按照第一个答案的建议更正初始化。 如果 sigmoidGradient(z2) 表示 a2.*(1-a2) ,那么我觉得所有其余的代码都可以。

最好的问候,

【讨论】:

    猜你喜欢
    • 2023-03-23
    • 2014-05-09
    • 2019-03-15
    • 2016-05-13
    • 2015-07-21
    • 2016-11-28
    • 1970-01-01
    • 2012-03-28
    • 2017-01-30
    相关资源
    最近更新 更多