2

在學習階段的神經網絡中,有兩種機制發生。前饋和後向傳播。以異或操作爲例。神經網絡學習階段的反向傳播後會發生什麼?

A B Q 
0 0 0 
0 1 1 
1 0 1 
1 1 0 

對於第一遍(0,0-> 0)的前饋發生時,然後反向傳播happens.After此步驟被重新計算所有的權重。
現在會發生什麼?

問題1:同樣的輸入0,0是用新計算的權重(反向傳播期間)前饋,然後反向加工直至錯誤變爲無效?如果是的話,如果錯誤從來沒有發生過,會發生什麼?這使我想到下一個問題。

問題2:何時會發生下一次傳球(0,1-> 1)的學習?

問題3:假設第一遍的結束權重爲10.3,-2.3,5.5。第二遍(0,1-> 1)以第一遍的結束權重開始前饋?


如果我必須通過代碼來描述下面的代碼將是正確的

常用代碼,下列選項中的每個計算

averageErrorUntilLearn = 0.002; 
inputs = [ 
[0, 0], 
[0, 1], 
[1, 0], 
[1, 1] 
]; 
outputs = [0, 1, 1, 0]; 
inputNeurons = 2; 
hiddenLayers = 1; 
outputNeurons = 1; 

//initialize the Neural Net 
neuralNetObj = NeuralNet(); 
neuralNetObj.createTopology(inputNeurons, hiddenLayers, outputNeurons); 
weightsForTheNetwork = randomWeights(); 


問題3個scenario- 權重通過發送到下一個通道

問題1 scenario-每個過程都與它自己的權重計算,直至達到理想的學習,然後在權重發下來的新通

//learn 
for i in range(0,len(input)): 
    while (averageError > averageErrorUntilLearn): 
     console.log("Current Pass-" + i); 
     neuralNetObj.learningParams(inputs[i], outputs[i]); 
     neuralNetObj.initializeWeights(weightsForTheNetwork); 
     neuralNetObj.feedforward(); 
     neuralNetObj.backPropagate(); 
     weightsForTheNetwork = neuralNetObj.getNewWeights(); 
     averageError = neuralNetObj.getAverageError(); 


還是我完成什麼錯在這裏並沒有以上情況是真正?

回答

0

1)是的,backprop步驟將繼續更新權重,直到前饋步驟出現0錯誤。無論是否達到0錯誤,您都必須定義停止標準以告訴它何時停止。最簡單的方法是設置固定數量的迭代進行訓練。這是一個很好的,簡單的入門方法。真正的問題會使用更復雜的東西,例如定期檢查單獨驗證步驟的準確性,並在準確性停止改進時停止。但是,對於XOR問題,只需使用固定次數的迭代。由您來決定並告訴它停止標準是什麼。

2)您不想在一個實例(例如0,0-> 0)上反覆訓練,然後切換到另一個實例。如果您一次只訓練一個實例,則先執行一次(前進和後退步驟),然後再執行下一個實例,直到訓練數據結束。然後再重新開始並再次通過每個實例。以這種方式,它對訓練數據中表示的每種情況的訓練進行交錯。正如@Maxim所說,分批培訓更爲常見。在一個批次中,它將同時完成所有前向傳球,並收集有關答案的所有網絡猜測。然後,它將計算批處理的每個實例的錯誤,並反向傳播一次,以糾正批處理中所有實例的平均錯誤。因此它正在學習如何同時處理批次中的所有情況。這比一次執行一個實例要快,但網絡應該能夠以任何方式學習問題。這裏重要的一點是,它正在同時學習培訓數據中的所有案例,而不是一個接一個。

3)是的,一旦你做了backprop步驟,它會將更新應用到權重,下一個訓練步驟將使用新的權重。

+0

1)Backprop不會在「錯誤爲0時停止」,當梯度爲0時它會「停止」,錯誤可以是任意的。 2)實際上相反 - 使用「全批」是訓練神經網絡的正確方式,而小批量或單個實例一次是隨機逼近,其主要用於計算效率,但事實上他們仍然學習「任何一種方式」是一個不平凡的數學問題(儘管一次學習整個訓練集是微不足道的數學證明)。 – lejlot

1

前進 - 後退傳遞是訓練的一個步驟,它計算稍後用於通過近似方法(SGD,RMSProp,Adam等)調整權重的梯度。

你的描述是學習一個輸入同時什麼,這是一個前後通是爲(0,0->0)完成,然後向前向後的通行證(0,1->1)等。每個步驟都使用前一步計算的權重,它不知道之前的數據是什麼。

然而,實際上,培訓通常在完成,也就是說,網絡採取批量[(0,0->0), (0,1->1)]一步,然後爲下一批等等。訂單是隨機的,所以批次可以不同形式。在某些模型中,每個下一個批次都是隨機抽取的,因此可能相同的輸入會連續多次輸入到網絡中,儘管不太可能。但通常的方法是:洗牌所有訓練數據(在你的案例中有4個例子),並批量迭代所有數據。然後重複。

在極少數情況下,該批次包含所有的培訓數據,這基本上意味着它是一個普通的梯度下降(不是隨機)。在這種情況下,每一步都會一遍又一遍地輸入相同的輸入。

總結:您可以按照自己想要的任何順序自由提供網絡,但通常人們會按隨機順序進行操作。此外,該錯誤永遠不會完全爲空,所以您只需經過若干次迭代即可停止。

+0

因此,對於一批[(0,0-> 0),(0,1-> 1)],發生前後傳遞。然後,對於下一批次[(1,0-> 1), ,1-> 0)]另一個前進傳球發生。我仍然在努力理解這是如何工作的。我只有兩個輸入,這意味着即使我批量發送數據,在這種情況下每個通道仍然必須在單個特徵值(0,0)上發生。 –

+0

我可以看到批量學習讓你感到困惑,但這很重要。兩個或多個輸入同時進入網絡,在一個矩陣中。您可以使用單個輸入完成的任何操作都可以通過矩陣完成。由於並行化,它的執行速度比逐個更快,對梯度更好。 – Maxim