[英]neural network-back propagation, error in training
在閱讀了一些關於神經網絡(反向傳播)的文章后,我嘗試自己編寫一個簡單的神經網絡。
我決定XOR神經網絡,我的問題是當我試圖訓練網絡時,如果我只使用一個例子來訓練網絡,那么就說1,1,0(作為input1,input2,targetOutput)。 500列車后+ - 網絡回答0.05。 但是,如果我嘗試更多的一個例子(讓我們說2個不同或所有4種可能性),網絡的目標是0.5作為輸出:(我在谷歌搜索我的錯誤沒有結果:病了盡量給我盡可能多的細節幫助找到錯誤:
-ive嘗試使用2,2,1和2,4,1(輸入層,隱藏層,輸出層)的網絡。
- 每個神經元的輸出定義為:
double input = 0.0;
for (int n = 0; n < layers[i].Count; n++)
input += layers[i][n].Output * weights[n];
而'i'是當前圖層,而權重是前一圖層的所有權重。
- 最后一層(輸出層)錯誤定義如下:
value*(1-value)*(targetvalue-value);
而'value'是神經輸出,'targetvalue'是當前神經元的目標輸出。
- 其他神經元的錯誤定義為:
foreach neural in the nextlayer
sum+=neural.value*currentneural.weights[neural];
- 所有網絡中的權重都適應這個公式(來自神經的權重 - >神經2)
weight+=LearnRate*neural.myvalue*neural2.error;
而LearnRate是紐約學習率(在我的網絡中定義為0.25)。 - 每個神經元的偏重量由下式定義:
bias+=LearnRate*neural.myerror*neural.Bias;
bias是const值= 1。
幾乎所有我都可以詳細說明,因為我說輸出目標是0.5與不同的訓練例子:(
非常感謝你的幫助^ _ ^。
如果沒有看到完整的代碼,很難分辨出錯誤的位置。 您應該仔細檢查的一件事是,您對每個單元的局部誤差梯度的計算與您在該層上使用的激活函數相匹配。 看看這里的通用公式: http : //www.learnartificialneuralnetworks.com/backpropagation.html 。
例如,您對輸出層執行的計算假定您使用的是邏輯sigmoid激活函數,但是您沒有在上面的代碼中提到它,所以看起來您正在使用線性激活函數。
原則上,2-2-1網絡應該足以學習XOR,盡管訓練有時會被困在局部最小值而不能收斂到正確的狀態。 因此,重要的是不要從單個訓練課程中得出關於算法性能的結論。 請注意,簡單的backprog必然會很慢,例如Rprop就有更快更強大的解決方案。
有關於這個主題的書籍提供了一個簡單網絡的詳細逐步計算(例如,“人工智能:Negnevitsky的智能系統指南”),這可以幫助您調試算法。 另一種方法是使用現有框架(例如Encog,FANN,Matlab)設置完全相同的拓撲和初始權重,並將計算與您自己的實現進行比較。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.