2009-12-01 99 views
19

如何設置神經網絡以使它們接受並輸出連續的值範圍而不是離散值? 從幾年前做神經網絡課程的記憶中,激活函數將是一個sigmoid,它會產生一個介於0和1之間的值。如果我想讓我的神經網絡產生一個實值的標量,我應該怎麼做做?我想也許如果我想要一個介於0和10之間的值,我可以將值乘以10?如果我有負面價值呢?這是人們通常做的還是有其他方式?怎麼樣的輸入?神經網絡中的連續輸出

由於

回答

26

neuroevolution的大部分工作都涉及使用具有連續輸入和輸出的神經網絡。

有幾種常用的方法:

每值
  • 一個節點
    • 線性激活功能 - 正如其他人指出的那樣,你可以,如果輸出節點上使用非乙狀結腸激活功能您擔心的是sigmoid函數的範圍有限。但是,這可能會導致您的輸出變得任意大,這可能會在訓練過程中導致問題。
    • 乙狀結腸激活函數 - 簡單地縮放乙狀結腸輸出(或移位和縮放,如果要負值)是在neuroevolution的常用方法。然而,這是值得確保你的雙曲線函數是不是太陡:陡峭的激活功能是指「有用」的值範圍小,這就迫使網絡的權重小。 (這主要是與遺傳算法,它使用一個固定的重量修飾策略,當小的權重所需的不很好地工作的問題。)

regular sigmoid http://natekohl.net/media/sigmoid-reg.gif steep sigmoid http://natekohl.net/media/sigmoid-steep.gif

每值
  • 多個節點 - 擴頻在多個節點上的單個連續值是用於表示連續輸入的共同戰略。它具有爲網絡提供更多「功能」的好處,其代價是增加網絡規模。
    • 分級 - 分佈在多個節點的單個輸入(例如RBF networks,其中每個節點是具有不同的中心,將通過輸入被部分地激活的基函數)。您可以獲得離散輸入的一些好處,而不會失去平滑表示。
    • 二進制表示 - 將單個連續值分成2 N塊,然後將該值作爲二進制模式饋送到N個節點。這種方法是緊湊的,但有點脆弱,導致輸入以非連續方式變化。
6

沒有規則需要的輸出(*)爲任何特定功能。事實上,我們通常需要添加一些算術運算在每本身在給定節點實現的功能結束後,以規模和否則輸出強制到特定的形式。

使用全有或全無輸出和/或0.0到1.0歸一化輸出的優點是它使事情更容易處理,並且還避免了溢出等問題。 (*)「輸出」在這裏可以理解爲網絡內給定節點(神經元)或整個網絡的給定節點(神經元)的輸出。
正如馬克貝西所指出的,[整個網絡]和[網絡]的輸出通常都會接收一些過濾/轉換。正如在這個迴應中以及Mark的評論中所暗示的那樣,可能最好在網絡的「隱藏」層中具有標準化/標準節點,並根據輸入和/或輸出的要求應用一些標準化/轉換/離散化網絡;然而,這種做法只是一個實用性的問題,而不是神經網絡的一般要求。

3

您通常需要對輸入和輸出進行一些過濾(電平轉換等)。顯然,過濾輸入會改變內部狀態,所以需要考慮一些問題,以避免丟失你正在訓練的信號。

+0

既然我敢肯定有人會提到它 - 你可以定義網絡,這樣你不*有*做當然的輸入或輸出,任何轉換。但是,通用節點通常會更容易,並且會進行一些明確的過濾。 – 2009-12-01 02:14:55