2011-09-10 49 views
0

由於這個問題會持續很長時間,所以您可以在底部閱讀懸崖筆記,或者閱讀這裏的全文。我正在玩遺傳算法和神經網絡(即使用遺傳算法來演化神經網絡),但我遇到了一些問題,特別是我發現演變非常緩慢的趨同和往往不會收斂在所有想要的結果!然而,由於存在如此多的設置(人口規模,變異率,交叉率等),我不知道這是由於我的代碼中存在一些錯誤還是因爲我對上述參數進行了很差的選擇。或者,如果這種網絡如此之慢,正常情況下我預計結果會太早。遺傳算法問題的神經網絡

現在一些例子: 培訓網,使兩個數字的總和,提供了訓練20例集和遺傳算法使用以下設置:

#define MUTATION_RATE  0.5 
#define MAX_PERTURBATION 1 
#define POP_SIZE   500 
#define CROSSOVER_RATE  0.7 
#define NUM_TOUR   35 
#define ELITISM    4 

哪裏NUM_TOUR是個體的數量被選中參加比賽,而ELITISM則是我將當代最優秀個人傳播給下一代的副本數量。 有了這些設置和一個只有2個輸入和1個輸出神經元的網絡,我可以訓練它在2500代後相當精確地給出兩個數字的總和(這對我來說似乎是一個很大的地方,但無論如何),像:

2 + 2 = 4.01 

1 + 5 = 5.98 

使用相同的設置,並與2個輸入,1個輸出和2個神經元的1隱層的網絡,我儘量做到學習如何兩個數相乘:2500代以後,我沒有得到任何好的結果(如:0 * 10 = 3.7)。

我沒有嘗試任何其他操作,因爲我猜如果我不能想出一個學習如何繁殖的網絡,可能是我的代碼或我的設置有問題。正如我所說的,我使用錦標賽選擇,交叉是通過從兩個父母中的一個父母中選擇具有相同概率的每個基因,以及通過將0到MAX_PERTURBATION的值加上或減去當前值來實現的。

有什麼我在做明顯錯誤?你能指出我的任何教程,討論如何優化使用遺傳算法與神經網絡(什麼樣的交叉效果最好,什麼樣的人口規模更好,也是突變率,等等......)或可以給我有任何提示?

克里夫指出 我創建而它與遺傳算法訓練神經網絡,但它的表現非常糟糕,甚至沒有beign能學會兩個數相乘。一些示例顯示在完整的文本中:我正在尋找任何可以幫助我優化的東西,或者讓我意識到可能在我的代碼中存在錯誤。

我上傳了我的代碼(C++)在這裏:http://www.megaupload.com/?d=NW8FPZ6M我知道,最有可能沒有人會看看它,但它是值得一試

+0

個人有多少個重量?我的專業是GAs,而不是NN,我放棄了一段時間後試圖找出答案。這將影響你的突變率是否合適的問題。 –

+0

每個個體都有許多等於網絡權重總數的權重,所以2個輸入2個隱藏輸出神經元和1個輸出神經元有6個權重。無論如何,我在我的代碼中修復了一個導致許多重複個體的錯誤,這解決了很多問題,儘管我仍然在尋找關於如何爲GA選擇參數的一般準則。 –

回答

1

不是在神經網絡的專家,但我記憶神經元的行爲是線性的,即輸出是輸入乘以係數的總和。遺傳算法想要找到的是這些係數。只給出兩個神經元,我不認爲你可以計算乘法,因爲在計算過程中輸入操作數永遠不會相乘,除非將神經元輸出連接到神經元係數。

我的直覺告訴我你需要更多的神經元來做到這一點,以便虛擬大腦近似乘以多個線性運算。也許你還必須在你的虛擬神經元中引入一個非線性運算,例如輸出值鉗位。

+0

也有非線性響應神經元。 Sigmoidal是相當平常的。如果他在哪裏使用乘法神經元,這實際上很容易... – nulvinge

0

你的比賽尺寸爲35,是很高高。比賽規模很大,人口爲500人,實際上每一代人都會消除你的多樣性。 7將是一個相當典型的比賽規模,典型的範圍是3-11。

+0

我明白了,我不知道。無論如何,我剛剛修復了我的代碼中的一個錯誤,這幾乎解決了這個問題,儘管我仍然在尋找關於如何選擇參數的一般指導。 –

3

我在神經網絡的進化設計方面做了很多研究,我想提供一些提示。

從最簡單的算法開始,而不是使用有很多參數的遺傳算法:從隨機搜索,模擬退火和進化策略開始,當交叉導致破壞性效應時,通常效果更好。在NN設計中,交叉並不總是有效,因爲它傾向於「破壞」學習模式。您可以使用幾行代碼實現ES,模擬退火已經在MATLAB中實現。不要只使用GA,因爲它已經在MATLAB中實現了。至少保持簡單,消除交叉和精英主義以及不尋常的選擇機制。此外,您必須始終將您的算法與良好的神經網絡訓練算法進行比較,這樣您就可以知道何時某個問題對於特定的神經網絡來說太難(或幾乎不可能)。

0

我認爲神經網絡太小。嘗試在隱藏層中添加更多神經元,並嘗試添加一個圖層。