案例 :深度学习 V.S. 谜题游戏
作者:Kabalan Gaspard ?翻譯:王紫岳 ??校對(duì):陳漢青
本文約4000字,建議閱讀10+分鐘。
本文為大家介紹了作者使用不同的算法來解決Free Flow謎題游戲的心路歷程,從一開始的A*,Q-learning,到最后的卷積神經(jīng)網(wǎng)絡(luò),作者詳細(xì)的介紹了在使用這些算法時(shí)遇到的困難和得到的啟示。
深度學(xué)習(xí)比古老的蠻力技術(shù)更適合解決FlowFree問題嗎?
我們都有過這種經(jīng)歷。你拿著手機(jī)發(fā)呆,想要消磨一些時(shí)間,于是你決定放棄自己優(yōu)秀的思考,打開應(yīng)用商店的游戲區(qū),看看游戲排行榜。你找到了一個(gè)看起來很有趣的謎題游戲,但其實(shí)游戲是否有趣并不重要,因?yàn)槟阒幌胪姘雮€(gè)小時(shí),然后就刪掉、忘記它,對(duì)么?
?
2個(gè)月以后,我完成了兩千多關(guān)的Flow Free①游戲,并且堅(jiān)持每一關(guān)都得到“完美”評(píng)分。這一游戲(自2012年發(fā)行以來,這款游戲在iOS和Android平臺(tái)上都是最受歡迎的游戲之一)的設(shè)定相當(dāng)簡(jiǎn)單:將不同顏色的閥門分別連起來,并且不能有線相交。
?
FreeFlow——你可以通過這個(gè)截圖來了解游戲
?
截圖中的關(guān)卡可能看起來很簡(jiǎn)單,但是它的難度確實(shí)在不斷提升。隨著關(guān)卡的進(jìn)行,我發(fā)現(xiàn)我自己想出了一些可以幫助我更快完成這些高級(jí)關(guān)卡的策略(例如:盡可能的保留外層邊界空白,避免在未填滿的方形中創(chuàng)建“港灣”等)。瀏覽網(wǎng)上論壇時(shí),我看到其他的玩家都有他們自己的技巧,有的和我的一樣,有的則略微不同。這就引出了問題——計(jì)算機(jī)能否通過“經(jīng)驗(yàn)”,而非蠻力,來學(xué)習(xí)這些技術(shù)?
一個(gè)人類解決FreeFlow謎題
從基礎(chǔ)開始:A*?
如今的深度學(xué)習(xí)問題大部分可以歸結(jié)為要使用哪種算法。我以A*搜索作為開始。盡管它本身不是深度學(xué)習(xí),但是它也很好的說明了這個(gè)問題內(nèi)部的復(fù)雜性,并且也給了我們一些機(jī)會(huì),來使用更高級(jí)的、能夠自我驅(qū)動(dòng)的啟發(fā)式算法。
?
由于空間的復(fù)雜性太大,以至于我無法一次性解決問題。所以我開始按顏色遞歸地解決問題(如果給定路徑被“堵塞”,就回溯到上一種顏色)。在啟發(fā)式算法中,我使用了較為可信的曼哈頓距離。我在四種尺寸的板子上測(cè)試了我的算法:微型(2?4)、小型(5?5)、中型(8?8)、大型(14?14)。我保證了大型和中型的板子上的顏色比一般的顏色要少。因?yàn)榇蟆⒅行偷陌遄拥拇_會(huì)使問題更難,對(duì)人和計(jì)算機(jī)都是如此(更多可能的路徑/選擇/狀態(tài))。
?
這個(gè)算法在小型板子上運(yùn)行的很好,但是花了相當(dāng)多的時(shí)間。因此,我為下一個(gè)狀態(tài)的函數(shù)增加了一些規(guī)則,以此希望強(qiáng)化學(xué)習(xí)的算法能夠自己找出這些規(guī)則:防止同色相鄰方格不連接,或者出現(xiàn)空“港灣”。
我那臺(tái)7歲的電腦得到的結(jié)果是很讓人開心的,但是仍需改進(jìn):
慚愧地說,我可能花在Tkinter圖形函數(shù)上的時(shí)間比實(shí)際的AI要多
?
如果你覺得你是第一個(gè)這么做的,那你很有可能就錯(cuò)了
在我使用強(qiáng)化學(xué)習(xí)之前,我一直嘗試優(yōu)化我的A*算法。當(dāng)我發(fā)現(xiàn)Matt Zucker的一篇優(yōu)秀的博客文章②時(shí),他已經(jīng)為Flow Free建立了一個(gè)A*解算器(很高興的看到,我不是唯一一個(gè)有這種困擾的人),并且更加仔細(xì)地考慮過要把這些狀態(tài)從他的A*搜索中剔除。更讓人驚訝的是,他發(fā)現(xiàn)了一個(gè)只有6條規(guī)則的簡(jiǎn)單SAT算法,這比他最好的A*搜索法還表現(xiàn)還要好,而且在SAT中求解時(shí)間也非常短(對(duì)于14x14的板甚至低于1秒)。
?
到目前為止,我們似乎都得出了同樣令人沮喪的結(jié)論:對(duì)于這類(非對(duì)抗性的,封閉的)謎題游戲,簡(jiǎn)單的蠻力技術(shù)將超過基本的人工智能算法。
?
不過,我不可能止步不前。畢竟,引發(fā)這一實(shí)驗(yàn)的問題仍然存在:作為人類玩家,在玩了幾個(gè)關(guān)卡后,我們就能發(fā)現(xiàn)一些能夠更有效地打敗Flow Free謎題特定的技巧。為什么機(jī)器不能學(xué)習(xí)同樣的技術(shù)呢?
提到強(qiáng)化學(xué)習(xí)
我非常興奮地在Flow Free問題中嘗試了Q-learning算法,因?yàn)椤癆I”中的“I”即將要發(fā)揮它真正的作用了。A*搜索的工作也絕不是浪費(fèi)時(shí)間,因?yàn)槲覀兛梢允褂盟慕Y(jié)果作為Q-learning智能體的狀態(tài)-動(dòng)作空間。狀態(tài)空間由板上的方塊顏色和哪條路徑(顏色)目前是“活躍的”兩部分組成。一個(gè)“動(dòng)作”是指填充活躍路徑的下一個(gè)方塊。
?
在一開始犯了一些基礎(chǔ)的錯(cuò)誤之后,智能體很快就學(xué)會(huì)了如何解決小型板問題(1.5秒內(nèi)100次迭代)——到目前為止看起來還不錯(cuò)。但在中板上,花了10分鐘,經(jīng)過10000次迭代后,仍然沒有結(jié)果:
當(dāng)你聽到“人工智能”時(shí),你想的結(jié)果可能和這個(gè)不一樣。
?
為了改善這種情況,我開始調(diào)試標(biāo)準(zhǔn)Q-learning的參數(shù)(學(xué)習(xí)率α、貼現(xiàn)率γ、勘探/開發(fā)率ε),但這并沒有很大幫助,所以我將注意力轉(zhuǎn)向到獎(jiǎng)勵(lì)函數(shù)。除了實(shí)際的“獎(jiǎng)勵(lì)”之外,還需要一個(gè)參數(shù)與獎(jiǎng)勵(lì)函數(shù)進(jìn)行權(quán)衡(否則風(fēng)險(xiǎn)就會(huì)變得規(guī)范化,這會(huì)不利于整個(gè)機(jī)器學(xué)習(xí)活動(dòng)):智能體是否會(huì)因?yàn)榻鉀Q了一條路徑獲得獎(jiǎng)勵(lì),而不是解決了整個(gè)謎題之后。不幸的是,這并沒有起到多大作用。
?
最后,逐漸清晰的是,算法之所以會(huì)在更大的板上苦苦掙扎,僅僅是因?yàn)椴僮骺臻g太大了。相比于A*搜索,Q-learning在這種情況下確實(shí)做出了更明智、更有幫助的選擇,但在大多數(shù)情況下,即使在10000次迭代之后,Q-learning 智能體還沒有看到確切的結(jié)果。因此,下一步自然就是:
?
近似 Q-learning
近似Q-learning的應(yīng)用是十分有吸引力的,尤其是在游戲中。與其讓智能體在給定的狀態(tài)下決定最佳的操作,不如讓它在每一步都能快速計(jì)算出一些直觀、獨(dú)立于具體狀態(tài)(棋盤的配置)之外的特性,并讓它自己決定哪些是最重要的。這在游戲中會(huì)擔(dān)任游戲改變者的角色,例如Pcaman(舉個(gè)例子,下一步的決策是基于最近的豆子和最近的幽靈,而不是在每種可能狀態(tài)下的一個(gè)動(dòng)作),當(dāng)然也可以是狀態(tài)數(shù)量太多,以至于讓準(zhǔn)確Q-learning失效的Flow Free。
?
現(xiàn)在是開發(fā)人員需要權(quán)衡利弊挑選“正確”的特征的時(shí)候了。于是,我將列表精簡(jiǎn)到只有我認(rèn)為在很多情況下重要的特征(例如,每條路徑的剩余曼哈頓距離)。還有一些我認(rèn)為重要的、只需要讓算法計(jì)算的特征(但無法證明)。這些特征包括:
“轉(zhuǎn)彎”的個(gè)數(shù);
“盒子”的個(gè)數(shù);
盒子中閥門的個(gè)數(shù);
沒有閥門的盒子的數(shù)量(人們可以從邏輯上證明這是不可能發(fā)生的——我想看看算法能不能算出來);
一條路徑是否“抱墻”(即,一條路徑是否可以與相鄰的另一條路徑相連)。
不幸的是,有了這些特征之后,Q-learning智能體甚至不能解決小型板問題,即使我們改變了Q-learning的參數(shù)也不行。但是,這也是個(gè)有趣的實(shí)踐。例如,該算法在“沒有閥門的盒子”上附加了一個(gè)強(qiáng)大的負(fù)權(quán)重,這意味著它能夠了解到,沒有閥門的盒子會(huì)導(dǎo)致謎題無法解決。
?
近似Q-learning發(fā)現(xiàn)了更好的游戲策略
或許有了更大的謎題樣本,它就能更好地學(xué)會(huì)如何真正地解決它們,但我很興奮地看到它能真正地找到重要的東西。這在AI中是一個(gè)非常有趣的現(xiàn)象,尤其是在游戲AI中非常普遍:即使一個(gè)算法不能贏得游戲,它也可以幫助人類找到玩的更好的技巧。
?
走向監(jiān)督學(xué)習(xí):卷積神經(jīng)網(wǎng)絡(luò)
?
一開始,我對(duì)通過監(jiān)督的方法來實(shí)現(xiàn)Free Flow的想法存有偏見。首先,這需要大量的Free Flow游戲樣本,而這些游戲很難在公共互聯(lián)網(wǎng)上找到。其次,似乎與Free Flow最接近的監(jiān)督學(xué)習(xí)方法——神經(jīng)網(wǎng)絡(luò)——是一個(gè)臭名昭著的黑盒算法,它會(huì)妨礙這個(gè)練習(xí)最有趣的部分:查看算法學(xué)習(xí)何種技術(shù)來解決這個(gè)難題。
?
然而,后來我偶然讀到了Shiva Verma在《Towards Data Science 》③雜志上的一篇文章,他在其中做了一些與數(shù)獨(dú)游戲非常相似的事情:本質(zhì)上是把一個(gè)數(shù)獨(dú)游戲板當(dāng)作一個(gè)圖像,然后使用卷積神經(jīng)網(wǎng)絡(luò)(CNN)來解決它。作者在數(shù)獨(dú)游戲中取得了很好的效果,這讓我重新審視了我最初的想法,并嘗試了這種方法來實(shí)現(xiàn)Flow Free。
?
當(dāng)然,第一個(gè)困難是獲得輸入的數(shù)據(jù):用解析文本格式來尋找Free Flow謎題的答案,要比數(shù)獨(dú)謎題更困難。最初,我發(fā)現(xiàn)尋找文件最好的方法是查看Android應(yīng)用程序的代碼,它有一千多個(gè)以文本格式存儲(chǔ)的謎題:
CNN的初始結(jié)果是令人失望的:盡管CNN正在學(xué)習(xí)它任務(wù)是創(chuàng)建路徑,而不是僅僅在孤立地填充顏色,但在測(cè)試樣本中只有0%的謎題被解決了。
?
我們需要更多的數(shù)據(jù)
調(diào)整分層、訓(xùn)練次數(shù)、內(nèi)核大小和其他類似的常見疑點(diǎn)并沒有多大幫助。這似乎又回到了數(shù)據(jù)科學(xué)家最常見的問題:沒有足夠的數(shù)據(jù),世界上最好的算法也什么都不是。我找到的其他最好的數(shù)據(jù)來源是www.flowfreesolutions.com,它有成千上萬的對(duì)于全新的Free Flow問題的解法,比我的解法要多... 但是是圖片格式的。
?
盡管我嘗試了無數(shù)次,通過各種渠道聯(lián)系他們(甚至提供了經(jīng)濟(jì)獎(jiǎng)勵(lì)),我還是沒能讓他們給我發(fā)送一個(gè)可解析的文本版本的解決方案。好吧,這不是一篇免費(fèi)的人工智能文章——當(dāng)一個(gè)人有現(xiàn)代圖像處理器的時(shí)候,誰還需要底層的解決方案矩陣呢?使用子項(xiàng)目建立一個(gè)Free Flow④解決方案圖像處理器:
Scikit-image FTW
利用對(duì)稱性來增加我們可用的數(shù)據(jù)
這就產(chǎn)生了幾千個(gè)用來研究的數(shù)據(jù)點(diǎn),但這仍然不是很多。但后來我意識(shí)到,就CNN而言,顏色的確切值并不重要,重要的是顏色是不同的。所以我們可以將顏色重新排列,并且仍然有另一個(gè)非冗余的數(shù)據(jù)點(diǎn)。即使對(duì)一個(gè)只有六種顏色的5x5的板來說,這可以給我們的CNN提供多達(dá)6!= 720倍的研究數(shù)據(jù)點(diǎn)(當(dāng)然,等大的板和更多的顏色會(huì)有更多可選的組合)。
?
數(shù)學(xué)家將從群論中認(rèn)識(shí)對(duì)稱群S_n
?
一位朋友指出,這實(shí)際上是游戲AI中增加數(shù)據(jù)點(diǎn)的常見方式。在720x的數(shù)據(jù)點(diǎn)的情況下,我們最終在一個(gè)20-epoch模型,使用大小約為200k的數(shù)據(jù)點(diǎn)測(cè)試集,在我7歲的GPU上運(yùn)行了20分鐘后得到的準(zhǔn)確率為12%。需要注意的是,我們?cè)谶@里使用了一個(gè)嚴(yán)格的衡量成功的標(biāo)準(zhǔn):即使板子少用了一個(gè)單元格,我們也將其視為失敗。
?
但是,失敗比成功有趣得多。在幾乎所有的失敗中,CNN正確地解決了板子的很大一部分,剩下的部分人們則很容易完成它。從這個(gè)意義上講,CNN能夠解決文章最初的問題:憑直覺學(xué)習(xí)人類的技巧:
CNN的誤差分布
結(jié)論
對(duì)于解決基于網(wǎng)格的、非對(duì)抗性的謎題游戲來說,簡(jiǎn)單的方法通常更好。事實(shí)上隨著方法逐漸變得高級(jí),他們的表現(xiàn)會(huì)越來越差。
然而,盡管更高級(jí)的機(jī)器學(xué)習(xí)方法不能很快地解決這個(gè)難題,但它們確實(shí)發(fā)現(xiàn)了一些有趣的見解,并幫助人類得到更好的解決方案——卷積神經(jīng)網(wǎng)絡(luò)在這方面做得最好。而且,它們的性能比傳統(tǒng)的解決方法更好。
更好的數(shù)據(jù)比更好的算法重要。
后續(xù):讀者和編者的建議
我們請(qǐng)了一些更有經(jīng)驗(yàn)的AI/ML專家(非常感謝Matt Zucker⑤、Youssef Keyrouz⑥和Mark Saroufim⑦)來檢閱這篇文章,他們建議嘗試以下想法來改進(jìn)CNN算法。第2部分文章的主題可能會(huì)詳細(xì)介紹,您也可以在https://github.com/kgaspard/flow-free ai上自己動(dòng)手嘗試這些想法(以及本文中詳細(xì)介紹的方法):
改變CNN的層數(shù)(減少特征看上去似乎沒有什么用);
除了使用對(duì)稱來增加我們的數(shù)據(jù)點(diǎn),還使用旋轉(zhuǎn)、反射等方法;
使用CNN的預(yù)測(cè)結(jié)果作為特征的強(qiáng)化學(xué)習(xí)智能體。
鏈接:
①:https://www.bigduckgames.com/
②:https://mzucker.github.io/2016/08/28/flow-solver.html
③:https://towardsdatascience.com/solving-sudoku-with-convolution-neural-network-keras-655ba4be3b11
④:https://github.com/kgaspard/flow-free-ai/blob/master/imageParser.py
⑤:https://mzucker.github.io/swarthmore/
⑥:https://www.researchgate.net/profile/
Youssef_Keyrouz
⑦:https://medium.com/@marksaroufim
原文標(biāo)題:
Deep Learning vs Puzzle Games
原文鏈接:
https://towardsdatascience.com/deep-learning-vs-puzzle-games-e996feb7616
譯者簡(jiǎn)介:王紫岳,悉尼大學(xué)Data Science在讀研究生,在數(shù)據(jù)科學(xué)界努力奮斗的求知者。喜歡有挑戰(zhàn)性的工作與生活,喜歡與朋友們熱切交談,喜歡在獨(dú)處的時(shí)候讀書品茶。張弛有度,才能夠以最飽滿的熱情迎接有點(diǎn)忙碌的生活。
轉(zhuǎn)自:?數(shù)據(jù)派THU 公眾號(hào);
END
版權(quán)聲明:本號(hào)內(nèi)容部分來自互聯(lián)網(wǎng),轉(zhuǎn)載請(qǐng)注明原文鏈接和作者,如有侵權(quán)或出處有誤請(qǐng)和我們聯(lián)系。
合作請(qǐng)加QQ:365242293??
數(shù)據(jù)分析(ID?:?ecshujufenxi?)互聯(lián)網(wǎng)科技與數(shù)據(jù)圈自己的微信,也是WeMedia自媒體聯(lián)盟成員之一,WeMedia聯(lián)盟覆蓋5000萬人群。
總結(jié)
以上是生活随笔為你收集整理的案例 :深度学习 V.S. 谜题游戏的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python实现密码破解
- 下一篇: 人工智能、机器学习及深度学习视频教程大合