我創建了一個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