0

我使用this article來實現帶反向傳播的神經網絡,但計算錯誤時有問題。概括地說,我的S形函數擠壓我所有的節點輸出到1.0,然後導致誤差計算返回0:神經網絡:反向傳播期間計算錯誤

error = (expected - actual) * (1 - actual) * actual 
            ^^ this term causes multiply by 0 

所以我的錯誤總是0

我懷疑問題在於我的乙狀結腸實現,這是返回1.0,而不是漸進邊界低於1.0:

# ruby 
def sigmoid(x) 
    1/(1+Math.exp(-x)) 
end 

我是正確的是乙狀結腸從未實際上應該達到1.0,或者有我有別的東西了?

+0

是的,你的功能應該始終低於1.我認爲一些舍入問題可能是罪魁禍首...... –

回答

1

在數學上下文中,你是正確的,sigmoid應該永遠不會達到1.0。然而,在一個實際的編程環境中,Math.exp(-x)最終會變得非常小以至於它與0之間的差異可以忽略不計,您將得到1.0結果。取決於x的範圍,這不會是令人驚訝的結果。

爲了使用sigmoid方法,您應該使每個節點的輸入加權總和大約爲1。這將使S形輸出合理,並使您的權重更快地收斂。

+0

大約0..300。這很大,因爲我有大量的輸入和隱藏的節點。我試圖對20x20位圖進行分類,並輸出8位結果。 –

+0

因此,對於300,指數函數將會非常小,以至於它可能會是0,你會得到1.0的結果。當然,這不應該是這種情況。 – CrazyCasta

+0

Wolfram alpha甚至認爲結果是1.0,因爲指數項非常小http://www.wolframalpha.com/input/?i=1%2F%281%2Be^%28-300%29%29大約在 - 37和1.0之間的區別在正確的答案將低於雙精度型(可能是紅寶石使用的)。 http://www.wolframalpha.com/input/?i=log+base+2+%281-1%2F%281%2Be^%28-37%29%29%29對不起,如此搞砸了鏈接,你必須複製/粘貼。 – CrazyCasta