天天看點

使用神經網絡+遺傳算法玩轉Flappy Bird | 教程Demo算法人工神經網絡遺傳算法适應度函數替代政策代碼結論

本文來自AI新媒體量子位(QbitAI)

使用神經網絡+遺傳算法玩轉Flappy Bird | 教程Demo算法人工神經網絡遺傳算法适應度函數替代政策代碼結論

震驚!《Flappy Bird》火了這麼多年,竟然沒有中文名字。

沒事。這不妨礙各路AI大觸用這款遊戲練手。比方說今天這個HTML5教程,就是教你使用神經網絡+遺傳算法,搭建一個玩轉小鳥的AI。

提前說一下,教程最後有這個AI的代碼下載下傳。所有的代碼都是使用Phaser架構使用HTML5完成的。另外,神經網絡使用了突觸神經網絡(Synaptic Neural Network)庫,而不是從零開始搭建。

使用神經網絡+遺傳算法玩轉Flappy Bird | 教程Demo算法人工神經網絡遺傳算法适應度函數替代政策代碼結論

上面是Demo示範的截圖,通路下面這個網址,能夠看到這套算法的實際效果。

http://www.askforgametask.com/html5/tutorials/flappy/

不友善觀看上面線上Demo,或者沒有耐心的同學,可以選擇觀看下面這個視訊示範短片,中間有幾倍速度的畫面快進。

這套系統的算法,主要是基于NeuroEvolution(神經進化)。這種機器學習方法,使用遺傳算法(GA)等進化方法來訓練人工神經網絡(ANN)。

也就是說,這個例子中的機器學習=遺傳算法+神經網絡

人工神經網絡是機器學習算法的一個子集,它受到生物神經網絡結構和功能的啟發,這些網絡是由很多彼此發送信号的神經元組成。

一個神經網絡由輸入層,一個或多個隐藏層,以及輸出層組成。每層都有一些神經元,輸入和輸出層的神經元直接與外部環境相連。

在這個項目中,每個智能體(也就是小鳥)都有自己的神經網絡作為闖關的AI大腦。這些大腦由三層組成,結構如下:

一個輸入層,兩個神經元,代表小鳥到豁口的水準距離和垂直距離

一個隐藏層,六個神經元

一個輸出層,一個神經元,執行如下動作:如果輸出>0.5就飛一下

上述文字,也可以用下面這張圖表示:

使用神經網絡+遺傳算法玩轉Flappy Bird | 教程Demo算法人工神經網絡遺傳算法适應度函數替代政策代碼結論

我們在這裡使用遺傳算法,來訓練和改進神經網絡。

遺傳算法顧名思義,是一種借鑒了自然選擇和遺傳過程的基于搜尋的優化技術。這種算法使用相同的選擇、組合交叉和變異的組合,來進行初始的随機演化。

以下是我們遺傳算法實作的主要步驟:

使用随機神經網絡建立10個初始的小鳥(種群)

讓小鳥使用他們自己的神經網絡,同時起飛玩遊戲

對于每個小鳥,計算适應度函數來衡量飛行品質

當所有小鳥死亡時,使用遺傳算子把目前種群評估到下一代

重複步驟2

對于上面的第3步,我們深入談一下适應度函數的細節,以及如何定義。

由于我們想要使用最好的個體(小鳥)來進化種群,是以需要定義一個适應度函數。

一般來說,适應度函數用來衡量對象的品質。我們隊每一隻小鳥都進行測量,并從中選擇合适的個體,用以生成下一代種群。

在這個項目中,我們按照小鳥的飛行距離給予獎勵。另外,我們會根據小鳥和下一個豁口的距離給予懲罰。按照這種方式,就可以差別哪些飛行了同樣距離的小鳥。

使用神經網絡+遺傳算法玩轉Flappy Bird | 教程Demo算法人工神經網絡遺傳算法适應度函數替代政策代碼結論

對于上面第4步中遺傳算法,下面是實作的步驟。基本上,最好的小鳥個體會生存下來,它們的後代會取代表現最差的那些。

現有種群的個體按照适應度進行排序

選擇前四名給予獎勵,直接把它們傳給下一代種群

排名最高的兩個個體,進行交叉組合,生成一個後代

前四名中随機選擇兩個個體,交叉組合産生三個後代

前四名中随機選擇兩個個體,生成兩個直接複制的後代

對于每個後代,施加一些随機變異

上述代碼,可以通路如下位址擷取:

https://github.com/ssusnic/Machine-Learning-Flappy-Bird

在這個教程中,我們成功的讓AI學會玩Flappy Bird這個遊戲。在幾次疊代之後,我們可以得到一個幾乎無敵的小鳥。為了實作這一目标,我們采用了兩種機器學習算法:人工神經網絡+遺傳算法。

如果你對這個項目感興趣,未來可以嘗試改變代碼中的一些參數,看看會發生什麼。例如,可以改變隐藏層中的神經元數量或者每一代種群的個體數量。當然還可以對适應度函數進行修改,比方加入障礙物之間的距離、重力等等因素。

以及,你可以嘗試把類似的理念應用到其他遊戲中去!

祝好運~

— 完 —

本文作者:問耕

原文釋出時間:2017-08-21

繼續閱讀