學習成功噉玩多個遊戲 From Wikipedia, the free encyclopedia
舉個例說明,好似係設計嚟捉圍棋嘅 AI 程式 AlphaGo 噉,AlphaGo 喺 2016 年勁到成功打低九段(即係最高等級)圍棋棋手,但除咗捉圍棋之外,AlphaGo 就乜嘢都唔識;噉係因為 AlphaGo 用嘅演算法唔具有普遍性(generality),淨係曉攞「玩緊嗰盤圍棋現時嘅狀態」做自己嘅輸入,唔會識得(例如)考慮「玩緊嗰盤象棋現時嘅狀態」,更加唔好話會識玩棋類之外嘅遊戲[5]。
遊戲 AI 嘅極高專化性對 AI 研究嚟講係一個問題:理論上,AI 研究嘅終極目的係想創造出喺智能上同人無異嘅 AI 程式[6];而齋靠日常生活嘅觀察已經可知,一個智能正常嘅人類係能夠學識玩多隻唔同嘅遊戲嘅,所以如果學界想創造出响智能上同人無異嘅 AI 程式,必需要成功達致普遍玩遊戲。除此之外,普遍玩遊戲嘅技術亦都被指喺軍事同遊戲製作等方面有實用價值[3]。
遊戲(game)係源自玩嘅一種重要文化產物。遊戲最主要嘅特徵係有一定嘅規則同埋定輸贏條件,會要求玩家思考點樣喺遊戲規則嘅限制下,最大可能噉達到自己嘅目的[7][8]。遊戲好多時(但唔一定[9])仲有競爭性-好多遊戲都涉及多過一個玩家,要玩家各自選擇自己嘅策略,並且嘗試打低其他玩家,例如象棋、團隊運動以及各種各樣嘅射擊同格鬥電子遊戲等等,都屬於有競爭性嘅遊戲[10][11]。有陣時瓣瓣掂玩遊戲嘅研究者會以「首先製作出能夠普遍噉玩某一類遊戲嘅 AI」做目的,諗住搞掂嗮某一個類型嘅遊戲先至去諗真正完全嘅瓣瓣掂玩遊戲,例如瓣瓣掂玩電子遊戲(general video game playing,GVGP)係瓣瓣掂玩遊戲嘅一個子領域,顧名思義研究能夠玩任何電子遊戲嘅 AI [12]。
一般認為喺最抽象嘅層面睇,遊戲可以想像成由以下部份組成嘅數學物體:
... 等等。
一個達到普遍玩遊戲嘅 AI 程式實要識得以任何遊戲嘅狀態做自己嘅輸入:最基本上,一個玩遊戲嘅 AI 程式要做嘅係攞「現時遊戲狀態做輸入」,並且以某啲類型嘅演算法計個輸出;一個達到普遍玩遊戲嘅 AI 程式就一定要能夠以任何遊戲嘅遊戲狀態做輸入,所以研究普遍玩遊戲嘅工作者第一步要做嘅係諗出一個抽象化嘅模型表示「遊戲」呢樣嘢,即係搵出一柞所有被視為「遊戲」嘅事物有嘅特性,並且以呢啲特性作為「個 AI 程式收到嘅輸入實會有嘅參數」[3][13]。
遊戲可以抽象噉想像成馬可夫決策過程(Markov decision process):例如係以下呢幅圖當中嘅馬可夫決策過程噉;個過程模擬咗一個虛擬世界,個虛擬世界有三個狀態(、 同 ),喺每一個狀態當中,玩家都有兩個可能嘅選擇( 同 )同埋相應嘅報償,而每個選擇有若干機會率會令到個世界變成另外一個狀態(由啲箭咀同箭咀側邊嘅數字表示)。呢一個模型可以好容易噉用電腦程式表達出嚟,可以攞嚟教電腦喺玩遊戲嗰陣做決策[14][15]。
如果要用程式語言嚟表達上述嘅馬可夫決策過程嘅話,設計者可以用好似以下噉嘅一個矩陣(matrix)嚟表示唔同狀態之間轉化嘅機會率,當中每個橫行表示「如果喺呢個狀態揀咗呢個選擇,會去另外一個狀態嘅機會率」-喺狀態 揀咗 ()嘅話,遊戲狀態會有 50% 機會變成 、50% 機會變成 ,如此類推[16]:
齋用數字(冇咁易睇)嘅話:
現實世界嘅遊戲好多時都好複雜(complex),好少可會好似上面嗰個馬可夫決策過程(得三個可能狀態)咁簡單:例如係教個 AI 程式捉棋噉,國際象棋喺兩個棋手都行咗第一步之後個棋盤會有 400 個可能嘅形勢,喺兩個棋手都行咗第二步之後個棋盤會有 197,742 個可能嘅形勢,而喺兩個都行咗第三步之後呢個數字會超過 100 萬(可以睇組合爆發),就算用先進嘅電腦行都要嘥極大量嘅時間先能夠考慮嗮所有嘅可能性;而圍棋仲複雜,有成 10170 個可能情況-部電腦運算能力再勁都唔會喺限定時間之內計得嗮[17][18]。
因為噉,AI 研究當中有好多都集中於思考點樣喺有限嘅數據同時間之內盡可能令 AI 程式學最多嘅嘢,其中一個方向係思考點由「所有可能嘅情況」當中揀一小部份最有可能啱用嘅情況出嚟考慮[17]。例如係因為喺 2016 年打低咗九段(最高等級)圍棋棋手李世石而出名嘅 AI 程式 AlphaGo 噉,就用咗蒙地卡羅樹搜索(Monte Carlo Tree Search)嘅做法,噉講意思係指,foreach 棋步,AlphaGo 會用一啲特殊演算法估計邊一啲可能棋步嘅後果最有需要睇,再做若干次嘅模擬,想像每一個呢啲可能棋步行完之後自己嘅贏面(自己贏嘅機會率)會點變,然後就按模擬結果揀要行邊步[19]。
一個達致瓣瓣掂玩遊戲嘅 AI 程式一定要做到能夠理解佢未接觸過嘅遊戲嘅規則:想像一個 AI 程式,佢能夠攞一隻遊戲嘅規則做輸入,由規則嗰度大致噉推算隻遊戲有乜可能狀態,並且再按經驗調整自己心目中描述隻遊戲嘅馬可夫決策過程嗰啲參數,做到「唔使設計者講明嗮俾佢知遊戲有邊啲可能狀態」嘅效果。遊戲描述語言(game description language,GDL)係瓣瓣掂玩遊戲研究上會用嘅一種邏輯編程語言,即係一種理論上可以用嚟描述任何遊戲嘅規則嘅形式化語言[20][21][22]。
喺最抽象嘅層面嚟講,遊戲描述語言做嘅通常都係枚舉(enumerate)以下嘅嘢[20][23]:
wk
(white king)、棋盤上嘅第五行第三格叫 square (e,3)
... 等等;role(player 1)
同 role(player 2)
;move
表示郁某一隻棋,move(e1,e2)
表示將某隻棋由 e1
移去 e2
;e1
嗰格」(句法:true(p)
,當中 p
係評估緊佢係咪真嗰句命題)呢一句嘢喺每一個遊戲可能狀態下一係一係真一係假,而呢句嘢係咪真會影響邊一啲可能行動係啱規矩-如果「白色國王喺 e1
嗰格」呢句嘢係真,噉 wk, move(e5,e6)
唔會係一個可能行動;init(p)
,當中 p
係一句喺遊戲開始嗰陣係真嘅命題;... 等等。例如井字過三關可以用以下噉嘅碼表達[註 1][20]:
... role(x) # 遊戲有 X 同 O 兩個玩家 role(o) ... input(R,mark(M,N)) :- role(R) & index(M) & index(N) #一個可能行動係「玩家 R 填 M, N 嗰格」 input(R,noop) :- role(R) ... base(cell(M,N,x)) :- index(M) & index(N) # 命題類型 1:「M,N 嗰格俾 X 填咗」 base(cell(M,N,o)) :- index(M) & index(N) # 命題類型 2:「M,N 嗰格俾 O 填咗」 base(cell(M,N,b)) :- index(M) & index(N) # 命題類型 3:「M,N 嗰格係空嘅」 base(control(x)) # 命題類型 4:「而家到 X 行」 base(control(o)) # 命題類型 4:「而家到 O 行」 ... init(cell(1,1,b)) # 遊戲原始狀態:1,1 嗰格係空嘅 init(cell(1,2,b)) # 遊戲原始狀態:1,2 嗰格係空嘅 ... # ... 如此類推 legal(W,mark(X,Y)) :- # 啱規則嘅嘢之一:要喺「X,Y 嗰格係空嘅」同「到 W 行」呢兩句命題都係真嗰陣,「玩家 W 填 X, Y 嗰格」先至有可能發生。 true(cell(X,Y,b)) & true(control(W)) ...
如果一隻遊戲係 foreach 玩家都有最少一個啱規則嘅可能行動嘅,噉呢隻遊戲就算係玩得(playable)。如果一隻遊戲係 foreach 玩家都有最少一串可能嘅玩家共同行動係會令個玩家贏嘅,隻遊戲就算係弱可贏(weakly winnable);如果一隻遊戲係 foreach 玩家都有最少一串嗰位玩家嘅單方面行動係會令個玩家贏嘅,隻遊戲就算係強可贏(strongly winnable)。一隻單人遊戲必需要係強可贏(玩家可以靠自己單方面嘅行動引致遊戲結束,無論電腦控制嘅玩家做出乜嘢行動),而多人遊戲(由多位人類玩家一齊玩)淨係需要做到弱可贏[3]:p. 7。
一個達到瓣瓣掂玩遊戲嘅 AI 程式必需要曉攞遊戲狀態做輸入,然後再做一啲運算,最後俾出一個表示「自己要作出乜嘢行動」嘅輸出;喺呢個過程當中,瓣瓣掂玩遊戲程式嘅運算過程好多時會模擬人類玩遊戲嗰陣用嘅認知功能。
一個玩遊戲嘅 AI 程式要做嘅運算類型視乎遊戲嘅複雜度而定:最傳統(廿世紀)嘅 AI 做法係所謂嘅老派 AI(good old-fashioned AI,GOFAI),老派 AI 做嘅係將所受嘅輸入數值用一大柞邏輯符號計算,再按呢啲計算俾個輸出數值出嚟睇;舉個例說明,如果家吓有個設計者想教部電腦幫手睇病(輸入值係「有關病人嘅資訊」,而輸出值係「診斷」),噉就要教佢
... 等嘅若干條法則[24][25];呢種做法喺隻遊戲好簡單-例如係井字過三關-嗰陣仲行得通,不過事實表明,一旦隻遊戲有返咁上下複雜-例如頭先提到,國際象棋喺兩個棋手都行咗第一步之後,個棋盤會有成 400 個可能形勢[17]-嗰陣,「吓吓要設計者教個 AI 程式要作出乜行動」嘅做法就會搞唔掂[3]:p. 7。
因為複雜性嘅問題,設計嚟玩遊戲嘅 AI 一般都唔會用老派 AI,而係會諗一啲相對簡單嘅法則(可以睇啟發法嘅概念)嚟解決問題。好似係有關普遍玩紅白機遊戲嘅 AI 嘅研究噉,有研究者就試過主張,好多遊戲嘅目標都可以簡化噉想像成「盡力令某個數字(叫進度變數)有咁大得咁大」-例如玩一隻平台遊戲過關可以想像成「令過咗嘅關嘅數量有咁大得咁大」,而 AI 可以用機械學習嘅方式嚟學「要將邊個數值最大化」,即係俾 AI 睇一大柞描述「玩家玩一隻遊戲玩到爆機為止」嘅數據,再要個程式搵出邊個或者邊啲變數嘅數值喺成個過程當中最會係噉垂直一路上升[註 2],跟住再教個程式用神經網絡等嘅方法學「邊樣或者邊啲行動最能夠令進度變數(長遠嚟講)上升」[26]。
要模擬人玩複雜嘅遊戲,研究者可以用啲方法教 AI 有技巧噉揀選一部份嘅可能性嚟考慮,而揀可能性嘅過程好多時會用到機械學習(machine learning)技術:喺呢方面,蒙地卡羅樹搜索(Monte Carlo tree search,MCTS)係一種相當出名嘅技術;MCTS 簡單啲講就係有技巧噉搜索一樖決策樹-會揀定一個深度值 表示「要考慮幾多步」,並且喺每步按某啲準則揀邊啲節點嘅下一步值得睇[27][28],而如果上述嘅演算法設計得夠好,MCTS 可以有效噉教電腦普遍玩遊戲[29][30][31]。
以 AlphaGo 做例子。AlphaGo 係由 Google 旗下嘅人工智能公司 Deepmind 開發嘅 AI 程式[32][33],採取咗一套當時嶄新嘅做法-AlphaGo 個程式包含兩組深度神經網絡(deep neural network):
然後工作組用監督式學習(supervised learning)訓練政策網絡,俾 AlphaGo 睇大量專業棋手捉棋嘅數據,學計 ;然後用強化學習(reinforcement learning)訓練政策網絡,俾 AlphaGo 係噉同佢自己捉棋同學計邊啲 能夠帶嚟勝利;再用強化學習訓練價值網絡計 [34]。
喺真係捉棋嗰陣,個程式就會用 MCTS:喺價值網絡同政策網絡嘅引導下揀要行邊步,即係 foreach 步,按價值網絡同政策網絡嘅 output
決定要睇邊一個可能性,做若干次嘅模擬,然後再按模擬嘅結果揀要行邊一步。雖然 AlphaGo 淨係設計嚟捉圍棋,不過「用機械學習教部電腦估算 同 」呢家嘢理論上喺多數遊戲都會用得著[19][35]。
瓣瓣掂玩遊戲嘅概念源於廿世紀尾:喺 1992 年,美國電腦科學家巴尼·啤(Barney Pell)開發出「Meta-game Playing」(粵譯:「廣義玩遊戲」、「高層玩遊戲」)呢個系統,曉自動噉產生好似國際象棋噉嘅遊戲嘅規則(即係某程度上曉創作新遊戲);巴尼·啤跟住開發咗「Metagamer」嘅系統,個系統曉玩由 Meta-game Playing 製作出嚟嘅棋類遊戲[36]。打後冇幾耐,有人開發出《Zillions of Games》呢隻棋類遊戲合輯,當中仲有曉學識玩多種棋類遊戲嘅 AI [37]。上述呢啲創新為「識玩多過一款遊戲嘅 AI」呢一個諗法創咗先河,而且仲有俾人應用落去博弈論領域嘅研究上[38]。
喺廿一世紀初,瓣瓣掂玩遊戲係 AI 當中一個頗為受重視嘅領域。加州史丹福大學(Stanford University)喺 2005 年開咗個叫「General Game Playing」嘅項目,旨在想俾搞瓣瓣掂玩遊戲嘅人交流,會追求將瓣瓣掂玩遊戲研究標準化(例:要個個都用遊戲描述語言嚟做程式嘅輸入,等唔同嘅研究者交流起上嚟方便),而且仲會定時搞有相當份量(以千美元計)獎金嘅比賽,俾唔同人寫嘅瓣瓣掂玩遊戲 AI 程式互相競技,以求鼓勵人幫手推動瓣瓣掂玩遊戲技術嘅進步[39]。
Seamless Wikipedia browsing. On steroids.