游門弄斧40——遊戲AI與人工智慧
引子
今天要真的「弄斧」一波了,談談遊戲中的AI。
電子遊戲中的AI、電腦玩家是很多玩家非常熟悉的一類角色,往往陪伴著我們從一個遊戲小白逐漸成長為一個遊戲高手,在這個過程中孜孜不倦地作為我們的陪練對象、遊戲沙包。
可以說幾乎所有遊戲中都存在一些AI性質的內容,可能是「令人發狂的電腦」,可能是單機RPG里非玩家操作的隊友,也可能僅僅是網遊中的NPC。
近年來,隨著人工智慧技術的不斷發展,尤其是在谷歌的Alphago在圍棋的人機對戰中大放異彩後,很多玩家開始暢想未來的遊戲中會不會有了「像人一樣」的AI角色充當自己的助理、隊友甚至於對手,而那又將會是一種怎樣的體驗?
暴雪在WOW8.0里的「海島玩法」中將加入由AI控制的「高級NPC」作為玩家的對手
《魔獸世界:爭霸艾澤拉斯》前瞻:海島探險_嗶哩嗶哩 (゜-゜)つロ 乾杯~-bilibili
但另一方面,絕大多數玩家並不清楚遊戲中AI的實際工作原理,以及做一個「像人一樣」的AI覺得到底需要付出怎樣的代價,所以今天要就要談談遊戲中的AI到底是什麼。
但由於本人並未直接從事過這方面的相關工作,只是在工作學習中有一定的接觸和了解,所以只能儘可能地站在理論分析的角度,談談AI技術在遊戲行業中現狀以及未來發展,不涉及具體的實現細節,如有錯誤還請斧正。
老一輩的腳本AI
遊戲中的AI那是有著悠久的歷史了,可以說只要遊戲中不是只有「玩家」這一種變數,那麼另一種變數就是一種AI的表現形式,最常見的例子就是玩家所要對抗的「敵人」,畢竟絕大多數遊戲中都是有敵人存在的。
但是雖說都是敵人,都可以算AI,但是也有高低貴賤之分。最低級的AI都幾乎不能被稱之為AI,因為其行為方式是完全固定,沒有一丁點變化,典型的例子就是FC版超級馬里奧里的板栗仔(蘑菇仔)、烏龜等等怪物,只會傻頭傻腦地朝著一個方向走,碰到牆壁掉頭而已。
「稍微」高級一點的AI能引入了一些隨機的因素,比如超級瑪麗里扔鎚子的烏龜,其扔鎚子、起跳的時間帶有一定的隨機性,讓玩家不好預判。
可以說老式遊戲中敵人的AI都是上述2種方式的組合,例如文曲星上的「困獸斗」里的怪物既會進行一定的隨機走位,也會在玩家垂直移動時向玩家的方向移動(所以玩這個遊戲時走到角落裡瘋狂按下就能把吸引過來),本質上就是一段固定的程序腳本。
但是顯然這種很簡單的行為模式就太容易被玩家摸透了,糊弄糊弄小孩子還行,稍微聰明點的玩家很容易發現其中的規律,也就失去了鬥智斗勇的樂趣。因此,讓遊戲中的敵人的行為帶有一定的「策略」性,同時將行為的模式複雜化就成為了必然的選擇。一方面行為策略使得怪物的行為顯得合乎道理,而複雜的模式變化(數量、類型)使得怪物的表現形式不再單一。
例如「吃豆人」遊戲中的4個「幽靈」怪物就分別有自己的行為模式:紅色的一直跟在玩家屁股後面的,粉色的以玩家行進路線的下一個路口為目標,藍色的則再進一步,以下一個路口後的路口為目標(預判),最後橙色的完全隨機行動。
吃豆人里的4個怪物
[吃豆人]之父岩谷徹:以玩家的想法設計遊戲 | GameLook.com.cn
萬字長文,經典遊戲吃豆人Pac-Man製作檔案解析 | GamerBoom.com 遊戲邦
多數量、多類型的怪物使得玩家在初次接觸遊戲時不那麼容易摸清楚敵人的行為方式。而即使摸清楚了,想要在這種複雜的環境下從容取勝也不是那麼容易,因為需要同時預判多個怪物之後的路徑。最後輔以不同關卡下不同敵人的移動速度不同,從而使得遊戲有了豐富的變化和體驗。
不過,雖然怪物的行為方式有了變化,但是行為目的還是太過單一。在吃豆人這種小格局的遊戲中還好,因為本來就只有「抓住玩家」這一個目標,但到了目標更加複雜的遊戲中,例如策略類遊戲,那麼僅僅只按照一個預定好的目標一致走下去顯然還是過於「蠢」了。玩家希望遊戲中的敵人表現得更加靈活多樣一些,例如會在打不過時逃跑,會根據玩家的行為作出針對性的應對等等。
於是,以有限狀態機、行為樹為核心的遊戲AI模式出現了。
有限狀態機與行為樹AI
這2個詞對沒學過程序設計的朋友來說可能十分陌生,但其本質很好理解,就是很多個「if-else」判斷語句的組合,只是在大型遊戲程序中,為了開發、修改的便利,對這些if-else進行了包裝,形成了2種不同的套路。
所謂狀態機就是以電腦AI的「當前狀態」為主體,通過編寫不同狀態之間的轉換條件從而控制電腦AI的行為。例如在巡邏狀態中如果發現敵人則轉移到報警狀態,而如果聽到警報則進入迎敵狀態。剩下就只需要撰寫巡邏狀態、迎敵狀態、報警狀態下分別有怎樣的行為目標、策略以及具體做什麼就行了。
而行為樹則以電腦AI的「行為」為主體,通過編寫判斷條件,使得電腦AI每一次詢問「我現在該幹啥?」時通過一系列的判斷得出「現在應該XXX」的結論。例如先判斷周圍是否有敵人,如果有敵人則判斷是否已經進行過報警,如果沒報警則報警,如果已報警則迎敵。剩下就是寫每一個行為中的具體行為策略和行為內容。
2種設計、編程模式各有優劣,但通過上述分析可以看出,其本質都是遊戲設計者在編寫AI的代碼時已經提前預設好的各種策略、行為的組合,而且通常情況下是非常死板的。這也是為什麼絕大多數遊戲中的AI都會給人「操作很厲害,但是很蠢」的原因,因為操作是直接通過遊戲內部的代碼實現的,自然在反應、多操上強無敵;但由於策略是固定的,因此戰術死板、不懂變通、千篇一律,無法應對一些非常規戰術,顯得很「蠢」。
雖然這種遊戲AI的編寫方式雖然已經可以做到非常複雜、強大,但是畢竟是由設計者提前設計好的,而設計者不可能做到面面俱到,總會有一些特殊、詭異的場景沒有放到狀態機、行為樹中,從而形成「漏洞」。一旦玩家摸清了AI的規律,或者發現了設計者沒有考慮到的情形,就可以利用這些漏洞玩出花樣,輕則速通,重則觸發各種詭異的BUG。
例如紅警2中玩家不展開基地車電腦就不會造兵,因此玩家可以直接使用初始兵力利用操作打敗電腦的初始兵力直接獲勝(蘇聯最後一關甚至可以以此直接使用初始給的基洛夫空艇過關)
例如星際1中電腦完全不會應對堵口戰術,操作得當的話靠著這招可以做到1vN
例如WAR3中使用TR戰術可以Rush掉任何難度的電腦,包括幾乎所有可建造的戰役關卡(除了海加爾山這種敵人強無敵的關),操作得當1V2都不是問題
機器學習AI
到了最近的3-5年,機器學習技術的發展使得「人工智慧」這個詞在科技界和工業界變得熾手可熱。從以蘋果的siri、微軟的kotana為代表的語音智能助手,到現在賣得不錯的智能音箱,似乎實現「人工智慧」已經不再是遙不可及的一件事。
但是請關掉你腦中已經出現的各種科幻電影、遊戲中出現的人工智慧機器人的畫面,例如《星戰》系列裡R2D2、3PO,《光環》系列遊戲里的科塔娜,因為就目前的電腦技術而言,真正實現一個具有自我意識、感情,「像人一樣」的人工智慧還是遙不可及的一件事,現在的「人工智慧」距離大眾理解中的「人工智慧」還有相當長的一段距離
星球大戰中的R2D2和3PO
現階段「人工智慧」的本質是通過機器學習技術讓計算機能夠不依賴人工指導和干預,自發地解決實際生活中複雜、多變問題的能力,例如將語音轉換為文字,根據文字執行對應指令。但這其中並不真正包含「智能」的成分,只是通過大量數據的訓練,得到了一個「判別模型」,這個模型對於任意輸入數據(例如聲音、圖片)能夠輸出對應的判別答案(例如聲音對應的什麼文字、圖片是貓還是狗),但至於為什麼,電腦並不知道,甚至很多情況下連模型設計者也不知道。
其實「人工智慧」的訓練過程和馴獸師訓練動物很相似,做對了給獎勵,做錯了有懲罰,在大量的訓練之後,動物就知道什麼情況下應該做什麼,不應該做什麼了。但是動物並不一定知道為什麼應該這麼做,只是知道這麼做是對的。
以著名的Alphago為例,Alphago通過前期超大規模的模擬對局和已有的棋譜進行訓練(Alphago Zero已不需要棋譜),得到了一個以「當前局面」為輸入,「下一手落子位置」為輸出的模型,因此在實際對局中利用這個模型能根據當前局面做出判斷,不斷下棋。但是和人能講出為什麼應該這麼下不同,這個模型本身並不能解釋其判斷的原因。
其實這個道理很好理解,因為人自己都不知道自己是如何思考、得到結論的,以神經網路及其擴展演算法為例,演算法通過模擬大腦神經元之間互相刺激產生輸出的過程來進行學習,但是別說工程師了,研究大腦的科學家對人腦目前都沒有研究清楚呢,神經網路演算法不過是以神經系統的特性為靈感而設計出的演算法,並不代表神經網路演算法得到的模型就和人腦的思維方式是一樣的。
當然這裡我們不談機器學習的演算法細節,談談在遊戲AI領域機器學習所面臨的問題和挑戰。
首先是輸入數據的維度問題。
機器學習過程中,數據的維度是指一條數據中包含多少項細節數據。
以圍棋為例,棋盤共有19*19=361個交叉點,因此要完整地描述「當前棋盤的狀態」,就需要說清楚這361個點各自處於什麼狀態,那麼這一條數據應該包含361個取值為0、1、2的數,0代表這個沒有子,1代表是黑子,2代表白子,於是我們說圍棋的數據維度有361維(僅僅是舉個例子,實際可能並不是這麼表示的)。
機器學習訓練出的AI需要通過這些輸入數據判斷出當前情況下應該怎麼做,顯然輸入數據的維度越多,整個模型訓練和使用的過程就越複雜(得到模型所需要的訓練時間和實際使用中判斷當前狀態需要怎麼做所需要的時間都會更長)。
在圍棋中,使用361個數就能完整描述「當前遊戲狀態」了,但在電子遊戲中,要描述「當前遊戲狀態」到底需要多少個數?上千上萬是很可能的,例如RTS遊戲中雙方每個小兵的位置、血量、當前狀態等就需要上百個數字,更不提還有基地狀態、地圖狀態等等。
但是並不是「所有」數據都是有用、必要的,某些數據可有可無(野怪身上的buff),某些數據可以合併(只需要記錄家裡有幾個農民在採礦,不需要記錄具體每個農民的狀態),這些事情是需要一定程度的人工干預的,但如何取捨、精鍊這些數據,目前還缺少可靠的方法。
第二點是判斷時間。
不像圍棋一手可以考慮好幾十秒甚至數分鐘,遊戲中的操作間隔都是以毫秒為單位的,頂尖遊戲玩家、職業選手的APM(每分鐘操作數)能達到200、300以上,換算下來就是幾毫秒就要操作一次。
因此如果要通過機器學習AI來實現對遊戲中所有操作的判斷,即每一次操作都是模型對由當前遊戲狀態的判斷得到的,那麼每一次判斷所需要的時間必須在幾十毫秒這個量級上,否則一些關鍵操作(閃現躲技能)是無法實現的,這對於一些遊戲狀態複雜度極高的遊戲來說難度極大。
例如絕地求生中光描述周圍的環境就不知道要多少維數據,同時FPS遊戲中雖然APM較低,但反應時間要求極快,AI需要在十幾毫秒內做出是跑還是打、打誰、怎麼打的判斷。
第三點是訓練方式。
機器學習的訓練分為2種,一種是通過「左右互搏」的方式在模擬對戰中自己跟自己玩,根據模擬對戰的勝負來指導「什麼是正確的做法」「什麼是錯誤的做法」。另一種是通過實際人類對戰的數據來進行訓練,告訴機器「人是怎麼做的」「怎麼做能獲勝」。
從目前的論文上看,在實驗中已經實現的遊戲(圍棋、打磚塊、推箱子等)中,「左右互博」的強化學習(Reinforcement Learning)方式似乎獲得了更好的效果,但這些遊戲都無需依賴其他外部輸入,實現高效的模擬對戰。但隨著遊戲複雜度的提升,模擬對戰變得越來越低效,如果不與開發商合作得到遊戲的高效模擬平台(在AI自動化操作的情況下超快速度進行遊戲),那麼一局模擬對戰的時間就太長了,對於訓練模型所需要的動輒上千萬次的模擬對戰來說,這樣的訓練時間是無法接受的。
而另一種通過實際人類對戰的數據進行訓練的模仿學習(Imitation Learning)則很受限於使用到的數據的完備性,是否覆蓋到可能的各種戰術、各種情況,否則就可能造成訓練出的AI出現「偏科」的情況。而且說實話,人的決策也不見得就是最佳的。
目前來看,使用機器學習進行AI訓練最鮮活的例子是於2017年DOTA2國際邀請賽上亮相的由OpenAI公司訓練出的DOTA2 1V1 SOLO AI,在表演賽中以幾乎碾壓的形式戰勝了著名DOTA中單選手Dendi
該AI在補兵、控線、和技能釋放上幾乎做到了完美,顯示出了電腦AI在血量計算、距離把控上天生的優勢。
圖中AI操作的紅色血條的影魔完美地站在防禦塔的攻擊範圍邊緣對Dendi進行著壓制
但由於這個AI是通過左右互博的方式訓練的,於是在後來的玩家挑戰賽中,玩家通過繞後勾兵等「奇葩戰術」把這個AI耍得團團轉。
個人認為,在遊戲領域的AI設計中,一招通吃是不現實的,不能指望訓練出一個模型就通殺遊戲中方方面面的判斷和操作。
因為稍微有點深度的遊戲就已經相當複雜了,其訓練難度、判斷難度都十分高,想要實現一招通吃所需要的模型太過複雜。另一方面,遊戲中並不需要進行「大一統」的判斷,全局的戰略和局部的操作是存在一定的割裂性的,例如RTS遊戲中前線打架時並不需要考慮基地中農民的狀態,而下一步應該造什麼兵的判斷標準也和當前前線士兵的血量無關只和當前的整體戰局相關。
實際上真實玩家也是如此,例如MOBA遊戲中有的人大局觀好,知道什麼局面出什麼裝備選什麼戰術,但操作一塌糊塗,也有人反過來對線猛如虎,中期夢遊送人頭。
另一方面,遊戲中的操作並非一定要考機器學習的AI去直接進行,補刀、採礦、建造等行為是可以通過固定的腳本實現的,機器學習的AI只需要做出「目標判斷」,剩下的事情可以靠腳本實現。
一定要機器學習?
由於今年來機器學習和人工智慧的火熱,當談到遊戲中的AI時,很多玩家總會感到莫名的興奮,希望自己所玩的遊戲里也能有類似人工智慧的AI對手。但實際上雖然機器學習確實在很多領域(例如語音識別、智能推薦)中獲得了不錯的效果,但其在遊戲領域則很可能「水土不服」。
首先必須明確的是,並不是所有遊戲都需要遊戲中的AI「像人一樣」。
不同遊戲對玩家的要求是不同的,有的側重於個人操作、反應例如ACT遊戲,有的要求玩家團隊配合默契、分工明確,例如MMORPG里的副本戰,有的希望玩家能夠帶有沉浸感地體驗遊戲中的虛擬世界,例如很多單機RPG
因此在一些遊戲中,行為固定、死板的敵人就是設計目的的一部分,例如WOW里的BOSS都有著十分固定的行為方式,從仇恨系統到技能時間軸到轉階段流程等等,因為BOSS戰本來就是考驗團隊在巨大的實力不平衡下通過團隊的配合利用BOSS行為死板的特性戰勝它,要是BOSS真的智能到上來先秒治療再秒輸出最後蹂躪坦克,那還玩個毛啊
「死吧,蟲子!」
第二,即使是死板的AI腳本,在長時間不斷完善的情況下依然能夠取得很好的效果。
前面提到過的那些死板的AI撰寫方式,其死板的根源是設計者無法在設計之初就考慮到各種情況。這在以往的遊戲,尤其是單機遊戲中確實是一個比較明顯的問題。但如今隨著網路的普及,即使是單機遊戲也有各種在線更新機制,更不提現在網路對戰遊戲的火熱,AI並不是一定自出廠後就只能一成不變,遊戲設計者可以不斷完善,甚至可以開放介面讓玩家自己編寫AI
DOTA2的機器人腳本就是一個例子,通過封裝、公開API介面,讓玩家自行撰寫機器人AI腳本,甚至還可以組織AI腳本比賽「養蠱」
第三,和Alphago設計出來就是為了戰勝人類不同,對於遊戲公司來說遊戲中AI並不是一味地強就好,FPS遊戲中AI可以做得遠勝於人類,因為在「射擊」這個行為中AI的反應時間和瞄準精度都可以高到離譜。但是這樣的AI對於玩家來說沒有意義,除了部分追求極限的玩家可以作為挑戰自己的工具外,對其他玩家來說一文不值,誰願意跟一個自瞄鎖頭的掛逼對戰呢?
因此遊戲中的AI在製作、訓練的過程中並不是越強越好,而是越像人越好,和人一樣在緊張下會失誤、被擊中後不知道對方在哪裡、射擊不精準的AI才是大部分玩家在對戰中希望碰到的AI,過強或者過弱的AI都是不可取的。
如何看待騰訊《絕地求生:刺激戰場》有電腦人?最後,機器學習訓練出的AI在使用中對計算量的需求是十分大的,網路遊戲里的AI運算還能靠伺服器解決,如果單機遊戲中由於引入類似的AI導致遊戲卡頓,那就真是丟了西瓜撿了芝麻的蠢事了。
而且即使是能夠靠伺服器解決運算問題的網路遊戲,單個BOSS的場景還好,真要將世界地圖中的野怪、NPC都「人工智慧」一下,遊戲公司開不開心我不知道,收電費的肯定會很開心。
結語
機器學習技術的發展給了歷史悠久的遊戲AI打開了一個全新的大門,很多玩家也十分憧憬遊戲中能有AI的加入從而改善自己的遊戲體驗(至少AI不會罵人、送人頭)。
但就目前而言,將機器學習技術應用到遊戲AI里還有許多問題需要解決,遊戲AI的設計也不僅僅是把機器學習技術照搬照用這麼簡單。
但是必須肯定的是,隨著未來計算機硬體的發展和機器學習技術的完善,遊戲AI會迎來一波革命式的發展,對各類對抗性質的遊戲帶來翻天覆地的變化。
參考閱讀:
在DOTA2中獲勝的AI真的比AlphaGo厲害嗎?
馬斯克的OpenAI是如何擊敗dota2頂級人類選手的
給貓看的遊戲AI實戰(三)基於狀態機的AI系統
遊戲 AI 進化史,能阻止 AlphaGo 的或許只有狼人殺了
推薦閱讀:
※熊出沒2這個遊戲好玩嗎?
※爾冬陞重拍《三少爺的劍》,對此你有何期待?
※傳奇手游哪個好玩?
※不用乾瞪眼,《進擊的巨人2》全新上架配置要求不高
※我的安吉拉無限金幣鑽石版怎麼玩啊?