4

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

反向傳播

被初始化0
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

有誰知道我的錯誤在哪裏?

+0

請顯示weight初始化('theta'的開始值)。猜測,這可能是你的問題。如果是的話,我會解釋。 – 2014-12-06 18:43:02

+0

'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

+0

我的預感是錯誤的,但至少現在我可以看到我是否複製了結果 – 2014-12-06 19:44:35

回答

5

在初始化權重時從更大範圍開始,包括負值。你的代碼很難在正面權重和負面權重之間「交叉」,而你可能打算放* 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層隱藏的神經元,基本梯度下降和上述initialisations,並正確獲悉XOR。我也試着增加動量術語,學習速度更快,更可靠,所以我建議你接下來看看。

+0

哇,我沒有意識到它會需要_that_許多迭代。感謝您的建議,我會接下來看看動力學條款! – Torax 2014-12-06 21:13:23

+0

我沒有意識到這一點,我非常感謝你。 – 2015-08-23 13:43:43

1

您至少需要隱藏層中的3個神經元,並根據第一個答案的建議更正初始值。 如果sigmoidGradient(z2)表示a2。*(1-a2),那麼所有其餘的代碼對我來說似乎都可以。

最好的reggards,

+0

異或將與2個隱藏的神經元一起工作。 – 2014-12-19 21:12:43