2011-02-19 48 views
8

目前我正在研究一個項目,將使用遺傳算法來優化神經網絡。我意識到這可能不是優化它們的最佳方式,但我對兩者都是新手,所以我只是想嘗試使用它們。使用遺傳算法神經網絡

我的計劃如下(如有更改,很多)。我的輸入神經元會使用一個可能包含任何正數的數據集(包括小數點後兩位,所以它們實際上是浮點數),但最可能是0到20000之間。因爲重要性在於數字相互之間的價值相比,而不是他們有多大,他們會首先被除以所有值的最高數量將被輸入。他們會將它們乘以權重(任何積極或消極的浮動),然後去他們的隱藏層。隱藏層中的每個神經元將加總它的所有輸入,直到它們完成計算。然後他們將通過物流功能運行並輸出。

我的環境是Visual Studio C++ 2010 Express,我使用的是clr。

我的問題在於遺傳算法以及它如何工作。這將是調整權重。我的問題是,當它隨機改變一個權重值(突變率)時,它可能會使權重特別高或低,導致溢出或其他錯誤時,乘以輸入,並添加其他。我不知道如何組織我的染色體。那麼,通過選擇權重而不是隨機比特進行隨機化並更改爲定義範圍內的隨機數,會更好嗎?基本上,我正在尋找如何組織這些建議,而不會導致錯誤,導致值在保持性能時變得太大或太小。

謝謝,(和遺憾,這應該是在理論計算機科學,但我認爲它不適合在那裏)

+0

我不記得細節,但在這本書中:http://www.amazon.com/Techniques-Programming-Premier-Press-Development/dp/193184108X,作者幾乎完成了你所描述的任務,即使用基因突變的權值來優化神經網絡。 – 2011-02-19 02:27:47

+0

看到您提出的解決方案和更傳統的過程(可能甚至是非神經過程)之間的性能比較會很有趣。 – Predictor 2011-02-19 15:52:13

回答

6

(人工)神經網絡(人工神經網絡)是出了名的難以優化和遺傳算法(GAs)是一個合理的好方法(主要是因爲其他方面的工作能力非常有限)。當然,也有替代品可以很好地工作,但是它們對於正確編程和調整(使用模擬退火和學習動力進行反向傳播)更加複雜和微妙。我知道你們正在做這個項目,主要是爲了與這些事情一起玩。

您可能想看看進化神經控制器(ENC),這是一個應用遺傳算法(或進化算法)來訓練複雜導航任務的ANN的領域(例如,行星間空間任務是其中的一個應用我親自做過研究)。

對於ANN部分,我建議你不要限制自己的物流功能(我知道sigmoid是受生物神經元啓發的,但這並不意味着它們始終是最好的)。還有許多其他功能,物流功能的部分用途是因爲它們使反向傳播更快更簡單。但是,徑向基函數也可以起到很好的效果(國際海事組織和我所看到的,人工神經網絡的最成功的應用是使用徑向基函數,即RBF-NN)。通常,人們使用高斯函數,超球函數以及經常使用的三角函數(稱爲模糊網絡,另一類龐大的人工神經網絡)。

至於GA,我不會推薦你描述的那種類型的突變(即翻轉位),因爲你提到的原因。處理實值基因時,人們不會使用這種變異。一種非常容易的突變方法就是決定(以某種可能性)突變個體,然後選擇其基因的一個元件進行突變,然後簡單地生成一個新的基因元素以使用隨機數生成器(rand())替換它。有了這個,你可以限制生成的基因元素的規模,以避免個別退化(即一個完全錯誤的基因元素可能使整個個體無用)的問題。什麼是基因?那麼,對於人工神經網絡來說,通常是一個包含網絡中所有神經元的所有權重的大型向量。你可以猜測,如果神經元數量太大,人們很少應用GAs。我還建議您使用錦標賽選擇來選擇繁殖個體。至於交換(即混合兩個父母生一個孩子),只要保持權重的順序,並從孩子的每個元素中隨機選擇一個權重,並以相同的概率隨機選擇。

我已經親自完成了我上面描述的任務,並且對於某些問題(減小尺寸和高複雜度,即沒有明顯的最佳解決方案)非常有效。

最後,不要指望它很容易工作。通常情況下,它需要人口規模和一代人的數量遠遠高於你期望的數量(畢竟,進化是一個非常緩慢的過程!)。所以,不要嘗試10個人的人口並跑了50代,而且很遺憾地說「哦,我猜這不行......」。嘗試按人口數千人的順序進行更多的嘗試,並根據您正在應用的問題的規模,進行數千至數十萬代的嘗試。

+0

我對你說的很瞭解,並且非常詳細的答覆,但我有一個問題。關於隨機數的產生,什麼是最好的隨機數發生器,將產生包括小數在內的浮點隨機數,而不僅僅是整數(.net,標準C庫,增強等)。 – contrapsych 2011-02-19 20:29:05

3

你的問題在於染色體的表現。它被稱爲漢明懸崖問題。你可以使用Gray Code作爲沒有漢明懸崖問題的染色體表示