我创建了一个Octave脚本,用于使用反向传播训练具有1个隐藏层的神经网络,但似乎无法拟合XOR函数。神经网络不合适XOR
x
输入4×2矩阵[0 0; 0 1; 1 0; 1 1]
y
输出4X1矩阵[0; 1; 1; 0]
theta
隐藏/输出层的权重z
加权和施加到加权和m
采样计数a
激活功能(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;
反向传播
被初始化0delta2 = (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
。
有谁知道我的错误在哪里?
请显示weight初始化('theta'的开始值)。猜测,这可能是你的问题。如果是的话,我会解释。 – 2014-12-06 18:43:02
'epsilon_init = 0.12;' 'theta1 = rand(hiddenCount,inputCount + 1)* 2 * epsilon_init * epsilon_init;' 'theta2 = rand(outputCount,hiddenCount + 1)* 2 * epsilon_init * epsilon_init;'Do not知道如何在评论中正确地格式化它! – Torax 2014-12-06 19:31:13
我的预感是错误的,但至少现在我可以看到我是否复制了结果 – 2014-12-06 19:44:35