【編者按】Flappy Bird雖然下架了,但是相信仍有一大部分人還掙扎在它的陰影之下――游戲看似簡單,但得分只在小兩位數(shù)上徘徊,有時(shí)甚至是可憐的一位數(shù)。搜狗產(chǎn)品經(jīng)理@光芊源更簡單的分析了這個(gè)游戲會(huì)火的原因:用戶往往抱著“可以拿高分”的心態(tài),卻總是因?yàn)椤皼]注意”而失敗。在回答中,網(wǎng)友@任杰還進(jìn)行了適當(dāng)?shù)难a(bǔ)充:1,Restart成本很低,秒秒鐘的事情;2,平滑的難度曲線,再開始不會(huì)感到突兀。不管出于什么原因,F(xiàn)lappy Bird確實(shí)火了一把――不僅穩(wěn)坐App Store和Google Play免費(fèi)應(yīng)用排行榜將近一個(gè)月,下載量高達(dá)5000萬次,好評(píng)59萬條,應(yīng)用內(nèi)平均每天廣告收入更達(dá)5萬美元。然而,這個(gè)火爆絕對(duì)是建立在無數(shù)玩家的“痛苦”之上,于是在幾番高分無果的情況下,來自CAMPUS BUZZ的小伙SarvagyaVaish決定從自己的專業(yè)入手,使用機(jī)器學(xué)習(xí)玩轉(zhuǎn)這頭笨拙的小鳥。
以下為譯文:
觀看視頻請(qǐng)?jiān)L問原文
這是流行游戲Flappy Bird上的一次極客運(yùn)動(dòng),盡管這個(gè)游戲已經(jīng)在App Store和Google Play下架,但是網(wǎng)絡(luò)上還流行著許多山寨應(yīng)用,比如Flappy Bird Typing Tutor和Flappy Math Saga。在玩了幾分鐘這個(gè)游戲后,我看到了一個(gè)檢驗(yàn)自己機(jī)器學(xué)習(xí)技巧的實(shí)踐機(jī)會(huì)――讓小鳥學(xué)會(huì)如何自己來玩游戲,而上面這個(gè)視頻也證明了經(jīng)過良好訓(xùn)練的Flappy Bird基本上已經(jīng)可以完全躲避障礙。
開始時(shí)我的選擇是Android應(yīng)用,計(jì)劃使用Monekyrunner來獲取畫面和點(diǎn)擊命令,然而Monekyrunner 1到2秒的畫面捕捉時(shí)間完全滿足不了我的最低需求。隨后,我發(fā)現(xiàn)了@mrspeaker的游戲引擎、Omega500以及用于typing的Flappy Bird版本,這些都非常適合我們的用例,于是我就果斷拆掉了它的typing組件并添加了一些Q Learning代碼。
強(qiáng)化學(xué)習(xí)
這里有一些基本規(guī)則:智能體,也就是這里的Flappy Bird,在某個(gè)狀態(tài)下總會(huì)執(zhí)行一個(gè)特定的動(dòng)作,而在狀態(tài)發(fā)生改變后會(huì)得到相應(yīng)的獎(jiǎng)勵(lì)。基于情況的不同,有許多不同的變體會(huì)被使用,比如:Policy Iteration、Value Iteration、Q Learning。
關(guān)于Q Learning的詳細(xì)介紹可以點(diǎn)擊這里,下面則是算法:
狀態(tài)矢量空間
在這里一共設(shè)計(jì)了3個(gè)參數(shù):1,小鳥與低管道的垂直距離;2,小鳥與下一個(gè)管道出口的水平距離;3,小鳥是否死亡。
行為
對(duì)每個(gè)狀態(tài),我設(shè)計(jì)了兩個(gè)可能存在的行為:點(diǎn)擊或者是什么都不做。
獎(jiǎng)勵(lì)
獎(jiǎng)勵(lì)完全依賴于“Life”參數(shù),仍然存活則+1,失敗則-1000。
學(xué)習(xí)循環(huán)
數(shù)組Q初始化為0,同時(shí)也總采取最佳操作,這些操作將最大化我的預(yù)期獎(jiǎng)勵(lì)。
第一步,觀察Flappy Bird所處的狀態(tài),并執(zhí)行可以最大化預(yù)期獎(jiǎng)勵(lì)的操作。讓游戲引擎執(zhí)行“tick”操作,隨之Flappy Bird進(jìn)入下一個(gè)狀態(tài)s’。
第二步,觀察s’及狀態(tài)下的獎(jiǎng)勵(lì),+1則表示小鳥還活著。
第三步,通過Q Learning規(guī)則來修改Q數(shù)組。Alpha的值被設(shè)置成0.7,因?yàn)槲覀冃枰粋€(gè)確定的狀態(tài),也讓學(xué)習(xí)的可能最大化;同時(shí),Y和lambda都被設(shè)置成了1。
第四步,將當(dāng)前狀態(tài)設(shè)置為s’并重新開始。
完整視頻請(qǐng)?jiān)L問原文
初步訓(xùn)練成功大約花了6-7個(gè)小時(shí)(得分150+),學(xué)習(xí)速度通過使用更多的例子來提升,最后將它們的經(jīng)驗(yàn)貢獻(xiàn)給同一個(gè)數(shù)組。另一個(gè)提升學(xué)習(xí)途徑的方式是輸入更好的學(xué)習(xí)數(shù)據(jù)。更多代碼詳情可見FlappyBirdRL GitHub頁面。
原文鏈接:
Flappy Bird hack using Reinforcement Learning(編譯/仲浩 審校/毛夢琪)