由於這個問題會持續很長時間,所以您可以在底部閱讀懸崖筆記,或者閱讀這裏的全文。我正在玩遺傳算法和神經網絡(即使用遺傳算法來演化神經網絡),但我遇到了一些問題,特別是我發現演變非常緩慢的趨同和往往不會收斂在所有想要的結果!然而,由於存在如此多的設置(人口規模,變異率,交叉率等),我不知道這是由於我的代碼中存在一些錯誤還是因爲我對上述參數進行了很差的選擇。或者,如果這種網絡如此之慢,正常情況下我預計結果會太早。遺傳算法問題的神經網絡
現在一些例子: 培訓網,使兩個數字的總和,提供了訓練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我知道,最有可能沒有人會看看它,但它是值得一試
個人有多少個重量?我的專業是GAs,而不是NN,我放棄了一段時間後試圖找出答案。這將影響你的突變率是否合適的問題。 –
每個個體都有許多等於網絡權重總數的權重,所以2個輸入2個隱藏輸出神經元和1個輸出神經元有6個權重。無論如何,我在我的代碼中修復了一個導致許多重複個體的錯誤,這解決了很多問題,儘管我仍然在尋找關於如何爲GA選擇參數的一般準則。 –