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

震驚!《Flappy Bird》火了這麼多年,竟然沒有中文名字。
沒事。這不妨礙各路AI大觸用這款遊戲練手。比方說今天這個HTML5教程,就是教你使用神經網絡+遺傳算法,搭建一個玩轉小鳥的AI。
提前說一下,教程最後有這個AI的代碼下載下傳。所有的代碼都是使用Phaser架構使用HTML5完成的。另外,神經網絡使用了突觸神經網絡(Synaptic Neural Network)庫,而不是從零開始搭建。
上面是Demo示範的截圖,通路下面這個網址,能夠看到這套算法的實際效果。
http://www.askforgametask.com/html5/tutorials/flappy/
不友善觀看上面線上Demo,或者沒有耐心的同學,可以選擇觀看下面這個視訊示範短片,中間有幾倍速度的畫面快進。
這套系統的算法,主要是基于NeuroEvolution(神經進化)。這種機器學習方法,使用遺傳算法(GA)等進化方法來訓練人工神經網絡(ANN)。
也就是說,這個例子中的機器學習=遺傳算法+神經網絡
人工神經網絡是機器學習算法的一個子集,它受到生物神經網絡結構和功能的啟發,這些網絡是由很多彼此發送信号的神經元組成。
一個神經網絡由輸入層,一個或多個隐藏層,以及輸出層組成。每層都有一些神經元,輸入和輸出層的神經元直接與外部環境相連。
在這個項目中,每個智能體(也就是小鳥)都有自己的神經網絡作為闖關的AI大腦。這些大腦由三層組成,結構如下:
一個輸入層,兩個神經元,代表小鳥到豁口的水準距離和垂直距離
一個隐藏層,六個神經元
一個輸出層,一個神經元,執行如下動作:如果輸出>0.5就飛一下
上述文字,也可以用下面這張圖表示:
我們在這裡使用遺傳算法,來訓練和改進神經網絡。
遺傳算法顧名思義,是一種借鑒了自然選擇和遺傳過程的基于搜尋的優化技術。這種算法使用相同的選擇、組合交叉和變異的組合,來進行初始的随機演化。
以下是我們遺傳算法實作的主要步驟:
使用随機神經網絡建立10個初始的小鳥(種群)
讓小鳥使用他們自己的神經網絡,同時起飛玩遊戲
對于每個小鳥,計算适應度函數來衡量飛行品質
當所有小鳥死亡時,使用遺傳算子把目前種群評估到下一代
重複步驟2
對于上面的第3步,我們深入談一下适應度函數的細節,以及如何定義。
由于我們想要使用最好的個體(小鳥)來進化種群,是以需要定義一個适應度函數。
一般來說,适應度函數用來衡量對象的品質。我們隊每一隻小鳥都進行測量,并從中選擇合适的個體,用以生成下一代種群。
在這個項目中,我們按照小鳥的飛行距離給予獎勵。另外,我們會根據小鳥和下一個豁口的距離給予懲罰。按照這種方式,就可以差別哪些飛行了同樣距離的小鳥。
對于上面第4步中遺傳算法,下面是實作的步驟。基本上,最好的小鳥個體會生存下來,它們的後代會取代表現最差的那些。
現有種群的個體按照适應度進行排序
選擇前四名給予獎勵,直接把它們傳給下一代種群
排名最高的兩個個體,進行交叉組合,生成一個後代
前四名中随機選擇兩個個體,交叉組合産生三個後代
前四名中随機選擇兩個個體,生成兩個直接複制的後代
對于每個後代,施加一些随機變異
上述代碼,可以通路如下位址擷取:
https://github.com/ssusnic/Machine-Learning-Flappy-Bird
在這個教程中,我們成功的讓AI學會玩Flappy Bird這個遊戲。在幾次疊代之後,我們可以得到一個幾乎無敵的小鳥。為了實作這一目标,我們采用了兩種機器學習算法:人工神經網絡+遺傳算法。
如果你對這個項目感興趣,未來可以嘗試改變代碼中的一些參數,看看會發生什麼。例如,可以改變隐藏層中的神經元數量或者每一代種群的個體數量。當然還可以對适應度函數進行修改,比方加入障礙物之間的距離、重力等等因素。
以及,你可以嘗試把類似的理念應用到其他遊戲中去!
祝好運~
— 完 —
本文作者:問耕
原文釋出時間:2017-08-21