們創建一個人工智能機器人,它能夠學習如何把Flappy Bird這個游戲玩出最高分。這樣,我們的小鳥就能安全地飛過一些障礙物了。在最好的情況下,它永遠不會死。
歡迎閱讀這篇完整的HTML5教程,本文展示了針對Flappy Bird游戲設計的**機器學習算法**。本實驗的目標是使用**神經網絡**和**遺傳算法**編寫一個人工智能游戲控制器。
因此,我們打算創建一個人工智能機器人,它能夠學習如何把Flappy Bird這個游戲玩出最高分。這樣,我們的小鳥就能安全地飛過一些障礙物了。在最好的情況下,它永遠不會死。
在閱讀項目背后原理的時候,你可以在本教程末尾下載源代碼。所有的代碼都是基于Phaser框架編寫的。此外,我們還使用了Synaptic神經網絡庫來實現神經網絡。
演示程序
首先,讓我們從演示程序開始,看一下游戲過程中的算法:
點擊此處進入全屏演示(需科學上網)
視頻演示
除了上面的演示程序之外,你還可以觀看這部簡單展示了算法的視頻短片。這對那些喜歡快進的人來說簡直太棒了!
https://youtu.be/aeWmdojEJf0(需科學上網)
什么是機器學習算法
根據1959年亞瑟·塞繆爾(Arthur Samuel)的說法,機器學習是讓計算機在不顯式編程的情況下行動的科學。一般來說,這是一個循序漸進地改進初始隨機系統的學習過程。
因此,實現人工智能的目標是通過對一個差的系統進行模型參數的微調來找到一個適當的解決方案。為此,機器學習算法使用了許多不同的方法。
對于本項目,機器學習算法(ML,Machine Learning)的主要方法是基于神經演化的。這種機器學習在形式上使用了遺傳算法(GA,Genetic Algorithm)等進化算法來訓練人工神經網絡(ANN,Artificial Neural Network)。
所以,在這個例子中,我們可以說:機器學習=遺傳算法 + 人工神經網絡(ML=GA + ANN)。
人工神經網絡
人工神經網絡是機器學習算法的一個子集。它的誕生受到了生物神經網絡結構和功能的啟發。這些網絡由許多發送信號的神經元組成。
因此,要創建一個人造大腦,我們需要模擬出神經元并將它們連接成一個神經網絡。
通用人造神經網絡是由輸入層、一個或多個隱藏層,以及輸出層組成。每一層都有一定數量的神經元。輸入和輸出神經元直接與外部環境相連,而隱藏的神經元則將以上兩者連接起來。
在本項目中,每個單元(小鳥)都有自己的神經網絡作為AI大腦來玩游戲。它由以下三層組成:
一個具有2個神經元的輸入層,表示一只小鳥看到的東西: - 與最近間隙的水平距離 - 與最近間隙的高度差
具有6個神經元的隱藏層
具有1個神經元的輸出層,提供如下動作: - 如果 輸出 > 0.5,則扇動翅膀,否則什么也不做
下圖顯示了本演示程序的神經網絡架構:
遺傳算法
在談論到機器學習算法的時候,可以說,遺傳算法可以用來訓練和改進神經網絡。
遺傳算法是一種基于搜索的優化技術,其靈感來自于自然選擇和遺傳過程。它采用選擇、交叉和變異相結合的方法來進化初始隨機種群。
以下是遺傳算法實現的主要步驟:
用**隨機神經網絡**創建10個單元(小鳥)的初始鳥群
讓所有的單元同時使用自己的神經網絡進行游戲。
對于每個單元,計算其**適應度**函數來衡量其質量(詳情請參閱下面的“適應度函數”章節)
當所有的單元都死亡時,使用遺傳算子來評估當前鳥群以生成下一個鳥群(詳情請參閱下面的“替換策略”章節)
返回到步驟2
適應度函數
除了遺傳算法(步驟3)之外,下面我們將了解一下有關適應度函數的一些細節,例如,適應度函數是什么,如何定義。
因為我們希望通過使用最好的小鳥來進化鳥群,所以需要定義一個適應度函數。
通常來說,適應度函數是衡量對象質量的指標。我們會度量每只鳥的質量,然后選擇最適合的小鳥,并用它來重新生成下一批小鳥。
在本項目中,我們會根據小鳥飛行的距離來進行獎勵。同時,根據小鳥當前到最近間隙的距離進行懲罰。所以,在這過程中,飛行了相同距離的小鳥之間就會產生差別。
因此,適應度函數是“小鳥飛行的總距離”和“與最近間隙的距離”之間的差。
替代策略
除了遺傳算法(步驟4)之外,以下是將自然進化應用于小鳥死亡的步驟。最好的小鳥生存下來,然后他們的孩子就以下面這種方式來替代最糟糕的小鳥:
按照適應度對當前所有的小鳥進行排序
選擇前4名(勝利者),并將他們直接傳遞給下一個鳥群
創建一個后代作為兩個最佳勝利者的交叉產品
創建3個后代作為兩個隨機勝利者的交叉產品
創建2個后代作為兩個隨機勝利者的直接副本
對每個后代應用隨機突變,以增加一些變異
源代碼
這是源代碼下載鏈接: https://github.com/ssusnic/Machine-Learning-Flappy-Bird
要求
由于程序是使用HTML5基于Phaser框架和Synaptic神經網絡庫編寫的,因此需要這些文件:
phaser.min.js
synaptic.min.js
gameplay.js
整個游戲邏輯在**gameplay.js**文件中實現。它由以下類組成:
App.Main
,主程序,包含以下基本功能:
_preload()_
預加載所有資源
_create()_
創建所有對象并初始化一個新的遺傳算法對象
_update()_
運行游戲的主循環,并使用遺傳算法進化鳥群
_drawStatus()_
顯示所有小鳥的信息
TreeGroup 類
,擴展了Phaser Group類,用于移動障礙物,包含頂部和底部的樹。
Tree 類
,擴展了Phaser Sprite類,用來表示一棵樹。
Bird 類
,擴展了Phaser Sprite類,用來表示一只鳥。
Text 類
,用于繪制文本的Phaser BitmapText類。
genetic.js
遺傳算法在**genetic.js**文件中實現,該文件由以下類組成:
GeneticAlgorithm 類
,處理所有遺傳算法操作的主類。它需要兩個參數:**_max_units_**用于設置小鳥的總數量,**_top_units_**用于設置獲勝者的數量。以下是其基本函數: - _reset()_
重置遺傳算法參數 - _createPopulation()_
創建新的鳥群 - _activateBrain()_
激活小鳥的AI神經網絡,并根據輸入獲取其輸出動作 - _evolvePopulation()_
通過使用遺傳算子(選擇、交叉和突變)來讓鳥群進化 - _selection()_
從當前鳥群中選擇最佳小鳥 - _crossOver()_
執行在兩個父節點之間的單點交叉 - _mutation()_
對后代進行隨機突變
結論
在本教程中,我們成功實現了一個會學習如何玩Flappy Bird游戲的AI機器人。經過幾次迭代,可以得到一個幾乎無敵的玩家。為了達到這一目標,采用了兩種機器學習算法:人工神經網絡和遺傳算法。
你可以嘗試更改代碼中的一些參數,看看會發生什么。例如,你可以更改隱藏層中的神經元數量或小鳥的數量。此外,你還可以嘗試以某種方式修改適應度函數,修改一些物理參數,比如障礙物之間的距離、重力等等!
試著將這里的進化理念應用到其他游戲中去吧!
文章原標題《Machine Learning Algorithm for Flappy Bird using Neural Network and Genetic Algorithm》,作者:SRDJAN,譯者:夏天,審校:主題曲哥哥。
耕 編譯整理
量子位 出品 | 公眾號 QbitAI
震驚!《Flappy Bird》火了這么多年,竟然沒有中文名字。
沒事。這不妨礙各路AI大觸用這款游戲練手。比方說今天這個HTML5教程,就是教你使用神經網絡+遺傳算法,搭建一個玩轉小鳥的AI。
提前說一下,教程最后有這個AI的代碼下載。所有的代碼都是使用Phaser框架使用HTML5完成的。另外,神經網絡使用了突觸神經網絡(Synaptic Neural Network)庫,而不是從零開始搭建。
上面是Demo演示的截圖,訪問下面這個網址,能夠看到這套算法的實際效果。
http://www.askforgametask.com/html5/tutorials/flappy/
這套系統的算法,主要是基于NeuroEvolution(神經進化)。這種機器學習方法,使用遺傳算法(GA)等進化方法來訓練人工神經網絡(ANN)。
也就是說,這個例子中的機器學習=遺傳算法+神經網絡
人工神經網絡是機器學習算法的一個子集,它受到生物神經網絡結構和功能的啟發,這些網絡是由很多彼此發送信號的神經元組成。
一個神經網絡由輸入層,一個或多個隱藏層,以及輸出層組成。每層都有一些神經元,輸入和輸出層的神經元直接與外部環境相連。
在這個項目中,每個智能體(也就是小鳥)都有自己的神經網絡作為闖關的AI大腦。這些大腦由三層組成,結構如下:
一個輸入層,兩個神經元,代表小鳥到豁口的水平距離和垂直距離
一個隱藏層,六個神經元
一個輸出層,一個神經元,執行如下動作:如果輸出>0.5就飛一下
上述文字,也可以用下面這張圖表示:
我們在這里使用遺傳算法,來訓練和改進神經網絡。
遺傳算法顧名思義,是一種借鑒了自然選擇和遺傳過程的基于搜索的優化技術。這種算法使用相同的選擇、組合交叉和變異的組合,來進行初始的隨機演化。
以下是我們遺傳算法實現的主要步驟:
使用隨機神經網絡創建10個初始的小鳥(種群)
讓小鳥使用他們自己的神經網絡,同時起飛玩游戲
對于每個小鳥,計算適應度函數來衡量飛行質量
當所有小鳥死亡時,使用遺傳算子把當前種群評估到下一代
重復步驟2
對于上面的第3步,我們深入談一下適應度函數的細節,以及如何定義。
由于我們想要使用最好的個體(小鳥)來進化種群,所以需要定義一個適應度函數。
一般來說,適應度函數用來衡量對象的質量。我們隊每一只小鳥都進行測量,并從中選擇合適的個體,用以生成下一代種群。
在這個項目中,我們按照小鳥的飛行距離給予獎勵。另外,我們會根據小鳥和下一個豁口的距離給予懲罰。按照這種方式,就可以區別哪些飛行了同樣距離的小鳥。
對于上面第4步中遺傳算法,下面是實現的步驟?;旧?,最好的小鳥個體會生存下來,它們的后代會取代表現最差的那些。
現有種群的個體按照適應度進行排序
選擇前四名給予獎勵,直接把它們傳給下一代種群
排名最高的兩個個體,進行交叉組合,生成一個后代
前四名中隨機選擇兩個個體,交叉組合產生三個后代
前四名中隨機選擇兩個個體,生成兩個直接復制的后代
對于每個后代,施加一些隨機變異
上述代碼,可以訪問如下地址獲?。?/p>
https://github.com/ssusnic/Machine-Learning-Flappy-Bird
在這個教程中,我們成功的讓AI學會玩Flappy Bird這個游戲。在幾次迭代之后,我們可以得到一個幾乎無敵的小鳥。為了實現這一目標,我們采用了兩種機器學習算法:人工神經網絡+遺傳算法。
如果你對這個項目感興趣,未來可以嘗試改變代碼中的一些參數,看看會發生什么。例如,可以改變隱藏層中的神經元數量或者每一代種群的個體數量。當然還可以對適應度函數進行修改,比方加入障礙物之間的距離、重力等等因素。
以及,你可以嘗試把類似的理念應用到其他游戲中去!
祝好運~
— 完 —
誠摯招聘
量子位正在招募編輯/記者,工作地點在北京中關村。期待有才氣、有熱情的同學加入我們!相關細節,請在量子位公眾號(QbitAI)對話界面,回復“招聘”兩個字。
量子位 QbitAI
?'?' ? 追蹤AI技術和產品新動態
耕 編譯整理
量子位 出品 | 公眾號 QbitAI
震驚!《Flappy Bird》火了這么多年,竟然沒有中文名字。
沒事。這不妨礙各路AI大觸用這款游戲練手。比方說今天這個HTML5教程,就是教你使用神經網絡+遺傳算法,搭建一個玩轉小鳥的AI。
提前說一下,教程最后有這個AI的代碼下載。所有的代碼都是使用Phaser框架使用HTML5完成的。另外,神經網絡使用了突觸神經網絡(Synaptic Neural Network)庫,而不是從零開始搭建。
上面是Demo演示的截圖,訪問下面這個網址,能夠看到這套算法的實際效果。
http://www.askforgametask.com/html5/tutorials/flappy/
這套系統的算法,主要是基于NeuroEvolution(神經進化)。這種機器學習方法,使用遺傳算法(GA)等進化方法來訓練人工神經網絡(ANN)。
也就是說,這個例子中的機器學習=遺傳算法+神經網絡
人工神經網絡是機器學習算法的一個子集,它受到生物神經網絡結構和功能的啟發,這些網絡是由很多彼此發送信號的神經元組成。
一個神經網絡由輸入層,一個或多個隱藏層,以及輸出層組成。每層都有一些神經元,輸入和輸出層的神經元直接與外部環境相連。
在這個項目中,每個智能體(也就是小鳥)都有自己的神經網絡作為闖關的AI大腦。這些大腦由三層組成,結構如下:
一個輸入層,兩個神經元,代表小鳥到豁口的水平距離和垂直距離
一個隱藏層,六個神經元
一個輸出層,一個神經元,執行如下動作:如果輸出>0.5就飛一下
上述文字,也可以用下面這張圖表示:
我們在這里使用遺傳算法,來訓練和改進神經網絡。
遺傳算法顧名思義,是一種借鑒了自然選擇和遺傳過程的基于搜索的優化技術。這種算法使用相同的選擇、組合交叉和變異的組合,來進行初始的隨機演化。
以下是我們遺傳算法實現的主要步驟:
使用隨機神經網絡創建10個初始的小鳥(種群)
讓小鳥使用他們自己的神經網絡,同時起飛玩游戲
對于每個小鳥,計算適應度函數來衡量飛行質量
當所有小鳥死亡時,使用遺傳算子把當前種群評估到下一代
重復步驟2
對于上面的第3步,我們深入談一下適應度函數的細節,以及如何定義。
由于我們想要使用最好的個體(小鳥)來進化種群,所以需要定義一個適應度函數。
一般來說,適應度函數用來衡量對象的質量。我們隊每一只小鳥都進行測量,并從中選擇合適的個體,用以生成下一代種群。
在這個項目中,我們按照小鳥的飛行距離給予獎勵。另外,我們會根據小鳥和下一個豁口的距離給予懲罰。按照這種方式,就可以區別哪些飛行了同樣距離的小鳥。
對于上面第4步中遺傳算法,下面是實現的步驟?;旧希詈玫男▲B個體會生存下來,它們的后代會取代表現最差的那些。
現有種群的個體按照適應度進行排序
選擇前四名給予獎勵,直接把它們傳給下一代種群
排名最高的兩個個體,進行交叉組合,生成一個后代
前四名中隨機選擇兩個個體,交叉組合產生三個后代
前四名中隨機選擇兩個個體,生成兩個直接復制的后代
對于每個后代,施加一些隨機變異
上述代碼,可以訪問如下地址獲?。?/p>
https://github.com/ssusnic/Machine-Learning-Flappy-Bird
在這個教程中,我們成功的讓AI學會玩Flappy Bird這個游戲。在幾次迭代之后,我們可以得到一個幾乎無敵的小鳥。為了實現這一目標,我們采用了兩種機器學習算法:人工神經網絡+遺傳算法。
如果你對這個項目感興趣,未來可以嘗試改變代碼中的一些參數,看看會發生什么。例如,可以改變隱藏層中的神經元數量或者每一代種群的個體數量。當然還可以對適應度函數進行修改,比方加入障礙物之間的距離、重力等等因素。
以及,你可以嘗試把類似的理念應用到其他游戲中去!
祝好運~
— 完 —
誠摯招聘
量子位正在招募編輯/記者,工作地點在北京中關村。期待有才氣、有熱情的同學加入我們!相關細節,請在量子位公眾號(QbitAI)對話界面,回復“招聘”兩個字。
量子位 QbitAI
?'?' ? 追蹤AI技術和產品新動態
*請認真填寫需求信息,我們會在24小時內與您取得聯系。