奇幻的神經網路進化之旅
Flappy Bird x 神經進化網路
當你看到螢幕上那些小鳥神奇地穿越障礙物時,也許會想:「這些賽博小鳥是怎麼變得這麼聰明的?」今天就讓我們一起揭開 Flappy Bird 背後的神秘面紗,探索那個讓小鳥從笨拙到優雅飛翔的進化之旅。
什麼是神經進化演算法?
如果你不曾聽過「神經進化演算法」(Neuroevolution),別擔心 - 它聽起來像是科幻電影裡的名詞,但實際上概念出奇簡單。
想像一下:
- 神經網路 = 模仿人腦的電腦程式
- 遺傳演算法 = 模仿達爾文進化論的優勝劣汰過程
- 神經進化 = 將上面兩者結合在一起的絕妙點子
簡單說,就是讓一群「電子鳥腦」彼此競爭,然後讓表現最好的「鳥腦」傳遞基因到下一代。就像現實生物的進化一樣,但速度快了幾百萬倍!
鳥腦解剖學:簡易版
我們的 AI 鳥有一個極其簡單的「大腦」結構:
- 輸入:只有兩個神經元,分別接收鳥的高度和下一個管子的高度
- 隱藏層:有兩個神經元進行數據處理
- 輸出:一個神經元,決定是否拍動翅膀
就這樣!沒有什麼深度學習,沒有複雜的卷積,就這麼簡單的結構。但別小看這個「鳥腦」,它能創造奇蹟!
從菜鳥到鳥霸王:進化的秘訣
第一步:隨機大亂鬥
// 初始化 50 隻完全隨機的鳥
const neuvol = new Neuroevolution({
population: 50,
network: [2, [2], 1], // 2個輸入, 2個隱藏神經元, 1個輸出
});
最初,所有的鳥都是「菜鳥」- 完全隨機行動。就像把 50 個初學者丟進鋼管舞教室,然後看誰能不摔斷腿堅持最久。大部分會悲慘撞牆,但總會有幾隻運氣好一點的。
第二步:優生學(不是邪惡的那種)
// 保留成績最好的 20%
elitism: 0.2,
// 讓 20% 完全隨機(防止陷入局部最優)
randomBehaviour: 0.2,
// 其餘 60% 是優秀鳥的後代
我們會做幾件事:
- 保留表現最好的鳥(菁英主義萬歲!)
- 引入一些全新的隨機鳥(新鮮血液!)
- 讓菁英鳥「交配」產生後代(不要想太多…只是混合它們的神經權重)
第三步:突變基因,創造未來
// 10% 的機率讓神經連接發生突變
mutationRate: 0.1,
// 突變幅度最大為 ±0.5
mutationRange: 0.5,
為了避免「近親繁殖」問題,我們會隨機改變一些神經連接的權重。這就像是自然界的基因突變,有時候會創造出超能力,有時候…嗯,就是災難。
AI 鳥類行為學:奇怪但有效的策略
經過幾十代進化後,你會發現這些 AI 鳥發展出一些有趣的行為模式:
- 驚慌失措鳥:總是在最後一刻才跳,看起來像是有嚴重的拖延症。
- 超級保守鳥:保持在畫面中央,就像一個不願冒險的會計師。 1.節奏大師鳥:發展出幾乎有音樂感的律動,讓人不禁想放些背景音樂。 1.作弊鳥?:有時候看起來它們找到了遊戲的漏洞,但實際上只是演算法最佳化的結果。
為什麼這麼簡單的東西能有效?
你可能會問:「真的這麼簡單就能讓 AI 學會玩遊戲?」
答案是:是的!因為:
- 問題很單純:Flappy Bird 是一個狀態簡單、動作有限的遊戲。
- 大量嘗試錯誤:電腦可以在短時間內嘗試數千次,比你自己練習幾百小時還有效。
- 適者生存:這是自然界最古老的學習法則之一,就算應用在虛擬鳥身上也一樣有效。
技術實現的獨特之處
breed(g1: Genome, g2: Genome, nbChilds: number): Genome[] {
const datas: Genome[] = []
for (let nb = 0; nb < nbChilds; nb++) {
// 深度複製第一個基因組
const data = new Genome(0, JSON.parse(JSON.stringify(g1.network)))
if (g1.network && g2.network && data.network) {
for (let i = 0; i < g2.network.weights.length; i++) {
// 基因交叉:50% 機率採用第二個父母的基因
if (Math.random() <= 0.5) {
data.network.weights[i] = g2.network.weights[i]
}
}
// 隨機突變
for (let i = 0; i < data.network.weights.length; i++) {
if (Math.random() <= self.options.mutationRate) {
data.network.weights[i]
+= Math.random() * self.options.mutationRange * 2
- self.options.mutationRange
}
}
}
datas.push(data)
}
return datas
}
這段代碼是整個系統的「DNA 實驗室」,負責將兩個成功的神經網路「基因」混合並產生下一代。這就像是把兩隻聰明鳥的「腦細胞連接方式」攪拌在一起,再加點突變調味料。
結論:AI 與達爾文的共舞
下次當你看到那些小鳥優雅地穿越管道時,請記住:它們不是被編程要這樣做的,而是「學會」了這樣做。通過無數代的失敗、學習和進化,從隨機行動到精確控制,這些虛擬生物展示了一個簡單而深刻的真理:
有時候,成功的秘訣不是聰明的設計,而是給予足夠的嘗試機會和適應環境的能力。
如果一群像素鳥能通過簡單的進化演算法學會玩遊戲,那麼我們人類是否也是通過類似的過程學會我們所有技能的呢?也許我們每個人都是自己基因和經驗的神經進化實驗品…
好了,深度思考時間結束。去調整那個速度按鈕,設定為 x1000,讓我們看看幾代之後那些小傢伙能有多厲害!
技術補充
如果你對神經進化演算法背後的數學和更多技術細節感興趣,可以參考以下資源:
- Kenneth O. Stanley 的 NEAT 論文 (NeuroEvolution of Augmenting Topologies)
- 《The Quest for Artificial Intelligence》 - Nils J. Nilsson
- 《Evolutionary Optimization Algorithms》 - Dan Simon