3

我已經構建了自己的神經網絡,並且我有一個奇怪的問題。我的神經網絡學習sin x但不是cos x

該網絡是一個相當簡單的前饋1-N-1網絡,具有反向傳播學習功能。 Sigmoid被用作激活功能。

我的訓練集由[-PI,PI]和它們的[0,1] - 縮放正弦值之間的隨機值生成(這是因爲「Sigmoid-net」僅生成[0,1]和非標定正弦函數產生[-1,1]之間的值)。

使用該訓練集,網絡設置爲1-10-1,學習率爲0.5,一切都很好,網絡學會了應有的正弦函數。但是,如果我對COSINE功能以完全相同的方式做所有事情,網絡將不會學習它。沒有任何隱藏層大小或學習率的設置。

任何想法?我錯過了什麼嗎?

編輯:我的問題似乎與this applet可以看到相似。它似乎不會學習正弦函數,除非首先爲權重教授一些「更容易」的東西(比如1400次二次函數)。小程序中的所有其他設置都可以保持原樣。因此,在正弦或餘弦的情況下,似乎在找到解決方案之前,權重需要一些提升至至少部分正確的方向。爲什麼是這樣?

+1

它代之以什麼?這可能有助於我們猜測問題出在哪裏。 –

+0

我注意到sin(x + 0.5 * PI)(它等於cos x)也不起作用。功率函數(^ 2,^ 3等)似乎也不起作用。線性函數可以工作。代碼中可能存在一些問題,並且sin [-PI,PI]函數的成功只是一個奇怪的副作用。 –

+0

張貼一些代碼可能會幫助我們來幫助你。 – g19fanatic

回答

1

我很努力地看到這是如何工作的。

據我所知,您有1個輸入,1個層中有N個節點,然後是1個輸出。所以網絡隱藏層中的任何節點之間沒有區別。假設你有一個輸入x和一組權重w i。然後輸出節點Y將具有值:

y = Σ w_i x

  = x . Σ w_i

因此,這是總是線性的。

爲了使節點能夠以不同的方式學習,它們必須以不同的方式進行連線和/或訪問不同的輸入。因此,您可以提供值的輸入,值的平方根(給出一定比例的效果)等,並將不同的隱藏層節點連接到不同的輸入,並且我懷疑至少還需要一個隱藏層。

神經網絡並不神奇。它爲加權和產生一組特定的權重。既然你可以導出一組權重來逼近一個正弦函數或餘弦函數,那麼它必須告訴你有關神經網絡需要什麼輸入才能獲得成功的想法。

一個明顯的例子:指數函數的Taylor series是:

exp(x) = 1 + x/1! + x^2/2! + x^3/3! + x^4/4! ... 

所以,如果你提供的與1 6輸入指出,X ,X 等,然後一個神經網絡,只是接收到的每個輸入到一個對應的節點,並且通過它的權重乘以它然後進料到所有那些輸出到所述輸出節點將能夠6術語泰勒展開的指數的:

in  hid  out 

1 ---- h0 -\ 
x -- h1 --\ 
x^2 -- h2 ---\ 
x^3 -- h3 ----- y 
x^4 -- h4 ---/ 
x^5 -- h5 --/ 

沒有太多的神經網絡,但你明白了。

繼續下載泰勒級數的維基百科頁面,有關於sin和cos的擴展,它們分別用x的奇次冪和x的冪次給出(想想看,sin是奇數,cos是偶數,是的,這是直截了當的),所以如果你提供x的所有權力,我會猜測sin和cos版本看起來與交替零權重非常相似。 (sin:0,1,0,-1/6 ...,cos:1,0,-1/2 ...)

+1

我對神經網絡不太瞭解,但我不同意。反向傳播學習方法調整網絡的所有權重,使得當前輸入的一些「節點路徑」將比其他路徑更正確地調整到正確的值。對多個樣本做這件事最終會導致一些隱藏節點更容易接受某些輸入值和其他一些隱藏節點。假設隱藏層中有足夠的節點,則輸出中的那些節點+激活函數的總和可以學習爲任何輸入的任何值(在act.func的範圍內)。 –

0

我認爲你總是可以計算正弦,然後在外部計算餘弦。我認爲你的關注點是爲什麼神經網絡在學習正弦函數時沒有學習餘弦函數。假設這個神器如果不是因爲你的代碼;我建議如下:

  1. 它肯定看起來像學習算法中的錯誤。可能是因爲你的出發點。嘗試從權重開始,給出第一個輸入的正確結果,然後前進。
  2. 檢查您的學習是否存在重大偏差 - more + ve比-ve
  3. 由於餘弦可以通過正弦90負角度計算,因此您可以找到權重,然後重新計算餘弦的一步權重。