【发布时间】: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