在2018TGDC大會(huì)上,來(lái)自騰訊互動(dòng)娛樂(lè)游戲AI研究中心的總監(jiān)鄧大付先生,分享了《牌類游戲的AI機(jī)器人研究初探》主題演講,他在2005年加入騰訊,從事大數(shù)據(jù)計(jì)算和AI算法相關(guān)工作超過(guò)13年,目前是騰訊游戲?qū)<夜こ處?,主要?fù)責(zé)游戲AI相關(guān)的研究工作。以下是演講實(shí)錄:

112450bi9c9j9ipitzlctd.jpg
大家下午好,歡迎里到騰訊游戲開(kāi)發(fā)者大會(huì)。自從2016年AIpha GO和李世石的圍棋大戰(zhàn)之后,這兩年的AI特別的火,尤其是學(xué)術(shù)界的教授們,都開(kāi)始轉(zhuǎn)行把游戲作為他們研究AI算法的測(cè)試場(chǎng)。

反觀我們做游戲工業(yè)的。實(shí)際上大家從事游戲研發(fā)的同事都了解,游戲工業(yè)屆對(duì)AI的做法通常用行為樹(shù)或者狀態(tài)機(jī),基于規(guī)則來(lái)做。這套方法有它的好處。最開(kāi)始做的時(shí)候會(huì)比較簡(jiǎn)單,寫幾個(gè)規(guī)則AI就可以跑起來(lái)。但是它也有一個(gè)壞處,當(dāng)我們想要把AI的水平提高到一定的程度和階段的時(shí)候,會(huì)變得非常的困難。

這一次深度學(xué)習(xí)推動(dòng)了AI技術(shù),到底對(duì)我們游戲工業(yè)界帶來(lái)哪些好處?我們內(nèi)部也一直在進(jìn)行思考和探索。今天主要是給大家以斗地主牌類游戲?yàn)橹鞣窒硪幌挛覀冏龅乃伎己吞剿鳌?br />
我的分享分為三個(gè)部分,首先會(huì)簡(jiǎn)單的介紹一下我們所處理的問(wèn)題和背景?第二部分,會(huì)講述如何用深度學(xué)習(xí)的技術(shù)做基本的AI,它的水平到底是什么樣子?第三部分,用深度學(xué)習(xí)做出來(lái)的基本AI有那些問(wèn)題?我們?nèi)绾谓鉀Q這些問(wèn)題。

在講為什么要做斗地主的AI之前,這里有一個(gè)小故事。因?yàn)槲冶救艘脖容^喜歡玩斗地主,因?yàn)樗容^休閑,無(wú)聊的時(shí)候斗一兩把。有一次無(wú)聊躺在沙發(fā)上斗地主,我老婆在廚房做飯,我正好拿了一把好牌,一對(duì)鬼,一對(duì)2,還有一個(gè)炸彈,想著這把可以多贏一點(diǎn)。但是剛搶到地主的時(shí)候,我老婆在廚房的叫“大付,你趕快給我買點(diǎn)蔥,等著蔥下鍋”。沒(méi)辦法,家里領(lǐng)導(dǎo)有令,就馬上把APP收起來(lái),到樓下超市去買蔥。等回來(lái)再把斗地主的APP打開(kāi)的時(shí)候,發(fā)現(xiàn)沒(méi)有贏8倍,反而輸了8倍。

在斗地主里面,有一個(gè)托管AI,為了不讓周邊的人等,自動(dòng)AI會(huì)接管。當(dāng)時(shí)心里很不爽。后來(lái)跟做斗地主的項(xiàng)目的同學(xué)一起聊,能不能把AI的水平提高一點(diǎn)。項(xiàng)目組的同事跟我們說(shuō),現(xiàn)在基于規(guī)則的方法已經(jīng)很難對(duì)它進(jìn)行提高了。反過(guò)來(lái)跟我說(shuō),你不是做機(jī)器學(xué)習(xí)的嗎?能不能幫我們做一個(gè)AI,這個(gè)AI滿足以下三個(gè)條件就可以:

第一,智能水平要有一定的高度,比如說(shuō)要跟人類的高手差不多。當(dāng)然不需要跟AIpha GO那樣強(qiáng),可以擊敗人類頂尖高手。因?yàn)閾魯∪祟惖捻敿飧呤?,?duì)游戲本身來(lái)說(shuō)也沒(méi)有特別大的意義。

第二,行為要特別像人,在托管的時(shí)候?yàn)榱俗屍渌婕殷w驗(yàn)不出來(lái),必須要把整個(gè)行為模式做的特別像人。

第三,AI支撐用戶的運(yùn)營(yíng)成本不能太高。大家知道,斗地主是有上千萬(wàn)的用戶,如果說(shuō)我們做的太復(fù)雜,后臺(tái)的運(yùn)營(yíng)成本是受不了的。

如果能做出來(lái),我們這里就會(huì)有很多應(yīng)用場(chǎng)景。第一,在做托管的時(shí)候;第二,做匹配的時(shí)候,因?yàn)檫@是競(jìng)技類的游戲,會(huì)相互之間匹配,有的時(shí)候運(yùn)氣不好會(huì)匹配到一些水平比較高的,跟他玩的話輸?shù)母怕蕰?huì)比較大。假設(shè)這個(gè)時(shí)候要匹配一些水平比較低的人,水平比較低的人心情也不爽。這個(gè)時(shí)候如果有一個(gè)水平差不多的一起玩,用戶的體驗(yàn)會(huì)更好一些。

當(dāng)然,還有其他很多應(yīng)用場(chǎng)景,我們拿到這個(gè)項(xiàng)目之后做了一個(gè)調(diào)研,想看一下這個(gè)問(wèn)題到底有多難。簡(jiǎn)單的看一下,所有的棋牌類游戲,包括圍棋、中國(guó)象棋、斗地主、麻將升級(jí)等棋牌類的游戲,狀態(tài)空間都非常大。以圍棋為例子,有人做過(guò)這樣形象的比喻,圍棋盤面的復(fù)雜度相當(dāng)于太陽(yáng)系的原子個(gè)數(shù)那么多。斗地主雖然比圍棋要小一些,但是估計(jì)也跟整個(gè)深圳市所包含的原子數(shù)目差不多。依照牌面進(jìn)行窮舉來(lái)做出高智能的AI實(shí)際上是不太可能的。

當(dāng)然了,從這個(gè)對(duì)比過(guò)程中我們可以看到,斗地主的盤面的復(fù)雜度是10的30次方,圍棋是10的170次方,AIpha zero基本上所有的棋類困局基本上都已經(jīng)解決了,我們是不是使用AIpha zero的技術(shù),是不是可以達(dá)到項(xiàng)目組想要的目的。實(shí)際上問(wèn)題并沒(méi)有那么簡(jiǎn)單。對(duì)于棋類的游戲,牌面所有的信息都是雙方可以互見(jiàn)的。但是對(duì)于斗地主來(lái)說(shuō),一方是看不到其他兩方牌,這個(gè)時(shí)候?qū)嶋H上我們就要對(duì)其他兩方牌做各種不同的組合。這種組合之后,會(huì)使盤面的復(fù)雜度再度的進(jìn)行指數(shù)級(jí)的爆增,學(xué)術(shù)界把這個(gè)叫非完美信息的博弈問(wèn)題。

對(duì)于這種非完美信息的博弈問(wèn)題,學(xué)術(shù)界也有一些研究,最有名的是DeepStack和冷撲大師。DeepStack跟AIpha GO的整體思想很像,提出了基于把所有組合進(jìn)行可能性的擴(kuò)展之后,尋找博弈上的納什均衡點(diǎn)的方式來(lái)解決。冷撲大師相對(duì)來(lái)說(shuō)會(huì)聰明一些,會(huì)把整個(gè)盤面分為開(kāi)局、中局、殘局,分別用不同的方法解決這里面的問(wèn)題。去年冷撲大師的作者過(guò)來(lái)騰訊跟我們進(jìn)行交流,他給我們透露一個(gè)信息,2017年年初的時(shí)候,冷撲大師跟國(guó)際德州撲克進(jìn)行大師賽的時(shí)候,第一次機(jī)器人在非完美信息博弈上勝過(guò)人類的大師,后臺(tái)接的是CMU的超級(jí)計(jì)算機(jī),進(jìn)行在線的推導(dǎo)。如果說(shuō)用這種方式來(lái)做,要面對(duì)騰訊上千萬(wàn)級(jí)別的用戶,實(shí)際是不太可能的。

有沒(méi)有其他的方法呢?對(duì)于工業(yè)界來(lái)說(shuō),因?yàn)槎返刂髟诰€上運(yùn)營(yíng)的時(shí)間比較長(zhǎng),我們有海量的用戶數(shù)據(jù)。第二,我們后臺(tái)有比較多的CPU和GPU可以處理留下的海量數(shù)據(jù)。我們所做的第一個(gè)方法,看能不能通過(guò)監(jiān)督學(xué)習(xí),現(xiàn)在學(xué)術(shù)界換了一個(gè)名字,因?yàn)槭悄7氯祟惖膭?dòng)作,取了一個(gè)名字叫模仿學(xué)習(xí),用模仿學(xué)習(xí)的方法解決斗地主牌類的問(wèn)題。

下面這部分給大家大致的介紹一下我們是如何一步步構(gòu)建斗地主的基本AI過(guò)程。最原始的想法,從人類的數(shù)據(jù)中直接學(xué)人的行為,人在牌面的時(shí)候該怎么動(dòng),機(jī)器人就跟著去學(xué)。

對(duì)于牌類的問(wèn)題,實(shí)際上一個(gè)比較好的模型,通過(guò)CNN進(jìn)行分類。為什么要通過(guò)CNN來(lái)做呢?因?yàn)镃NN有一個(gè)特性,這個(gè)特性最開(kāi)始主要是針對(duì)圖片的處理,對(duì)空間特征進(jìn)行提取的能力和效率會(huì)比較高一些。

對(duì)于牌類游戲來(lái)說(shuō),我們可以把CNN的通道排成15個(gè)橫牌,豎牌4個(gè)的矩陣,橫排分別表現(xiàn)3456789,一直到小鬼和大鬼,豎牌表示不同的花色。這樣CNN就可以通過(guò)卷積編碼出斗地主規(guī)則的順子、對(duì)或3帶2的空間特征。這個(gè)模型的輸出,直接就是進(jìn)行什么樣的動(dòng)作。斗地主的動(dòng)作空間會(huì)很大,大概有13350多種,圍棋的盤面,每一步下子的可能性是361種,斗地主會(huì)有一萬(wàn)多,因?yàn)槎返刂饔胁煌慕M合。

有了這個(gè)基礎(chǔ)的模型,我們可以做第一步的初步訓(xùn)練,初步訓(xùn)練的效果不是特別理想,包括分類的準(zhǔn)確度和AUC都不是特別理想,因此我們對(duì)整個(gè)模型做了一下三個(gè)優(yōu)化。下面主要給大家介紹一下三個(gè)優(yōu)化。

第一種優(yōu)化,對(duì)模型的輸出做了比較大的梳理和優(yōu)化,(PPT)從左表可以看出斗地主出牌的可能動(dòng)作空間,可以看到13551種動(dòng)作當(dāng)中,大部分集中在4帶2或是飛機(jī)帶,因?yàn)榭梢詭蓮?,各種組合數(shù)據(jù)特別多。我們就把原始單一的模型拆成一個(gè)層次化的模型。有什么好處呢?在第一層把4帶2或飛機(jī)帶拆到第二層的模型去做。第一層只是識(shí)別可不可能存在這種情況,如果存在放在第二層模型再做預(yù)測(cè)和分類。這樣的話,整個(gè)模型跟飛機(jī)帶和4帶2比較像,像翅膀一樣,所以我們把這個(gè)模型叫層次化的翅膀模型。在第二層模型的時(shí)候,整個(gè)組合數(shù)就會(huì)變得比較小。只有百的級(jí)別。這就象人進(jìn)行分類的時(shí)候一樣,假設(shè)100多個(gè)種類的東西放在你面前,你可以比較清楚的識(shí)別出來(lái),但是1萬(wàn)多個(gè)東西放在你面前,你可能就會(huì)認(rèn)錯(cuò)。

第二種優(yōu)化,我們?nèi)斯さ淖隽艘恍╆P(guān)鍵特征。在機(jī)器學(xué)習(xí)領(lǐng)域,深度學(xué)習(xí)出來(lái)的時(shí)候,很多做機(jī)器學(xué)習(xí)的人都說(shuō)以后解放了,不要再做人工的特征提取。從我們自己實(shí)戰(zhàn)的結(jié)果來(lái)看,人工做一些抽象的特征總結(jié)和提取,對(duì)模型整體的精度還是有比較大的好處。這里舉了一個(gè)例子,左邊的排是3個(gè)3,一對(duì)5,一個(gè)7,一對(duì)J。從這個(gè)牌里面提取特征,提取出來(lái)的特征意義是,這副牌有沒(méi)有三個(gè)的,如果有三個(gè)的在CNN的通道加一層賦予全1,如果沒(méi)有就是全0。

左邊后面的排序是沒(méi)有加特征抽象之前的排序結(jié)果,會(huì)先出一對(duì)5,再出一個(gè)7,概率最大的是先出一對(duì)5。加了有通道的結(jié)果,3個(gè)3帶一對(duì)5,分類排序的時(shí)候可以得到更大的概率值。

第三種優(yōu)化,是在做CNN分類通常都會(huì)做的,二值化的處理。假設(shè)有一個(gè)特征值,取值范圍是1234。這個(gè)時(shí)候取了3,實(shí)際上在整個(gè)CNN通道有兩種表示方法,第一種表示方法是只用一個(gè)通道,上面附一個(gè)值是3;第二種表示方法是4個(gè)通道,在第三個(gè)通道上賦全1表示這個(gè)值的取值是3,對(duì)做卷積操作來(lái)說(shuō),二值化的處理通常會(huì)取得比較好的結(jié)果。

經(jīng)過(guò)了三種方法的優(yōu)化,整體模型的精度有了較大的提升。由于第一層優(yōu)化做層次化之后,直接提升了大約10%左右。第二個(gè)和第三個(gè)優(yōu)化也給整個(gè)模型的精度大概提升了5%左右。模型的精度達(dá)到86%左右的時(shí)候做了第一次大規(guī)模的訓(xùn)練。高倍場(chǎng)的玩家水平通常更高,我們隨機(jī)從高倍場(chǎng)的比賽中抽了400萬(wàn)局的對(duì)局出來(lái)。如果是一個(gè)人去玩斗地主的話,不吃不喝不睡估計(jì)要打8-10年才能達(dá)到400萬(wàn)局的規(guī)模。我們用了兩塊GPU的卡聯(lián)合一起訓(xùn)練,對(duì)400萬(wàn)局的數(shù)據(jù)用這個(gè)模型來(lái)訓(xùn)練。大概用了8個(gè)小時(shí)左右的時(shí)間,模型收斂到比較好的狀況,我們用一個(gè)例子看一下模型到底到什么樣的水平。

這個(gè)例子中,地主的牌非常好,有兩個(gè)大鬼,一對(duì)2,還有一個(gè)7炸。第一手牌出了6,因?yàn)橛?炸,假設(shè)拆了的話就會(huì)有3456789 10的順子全部變成單牌。出6的話有傾向把7炸拆掉,而不是說(shuō)把7炸留著單張打。從這點(diǎn)來(lái)看,這個(gè)AI實(shí)際上已經(jīng)學(xué)到了人類在打牌的時(shí)候,有從整體盤面的局勢(shì)進(jìn)行規(guī)劃和長(zhǎng)遠(yuǎn)考慮的趨勢(shì)。

從農(nóng)民二出的一對(duì)4,以及地主的一對(duì)7,農(nóng)民二用2拿到了發(fā)牌權(quán),這個(gè)時(shí)候?yàn)槭裁闯隽艘粚?duì)4呢?人在打牌的時(shí)候經(jīng)常也會(huì)這樣,地主首先出單牌,農(nóng)民二認(rèn)為地主的對(duì)或三個(gè)的會(huì)比較弱,農(nóng)民二學(xué)會(huì)了人在打牌的時(shí)候攻擊對(duì)手弱點(diǎn)的策略。當(dāng)?shù)刂骺吹揭粚?duì)4的時(shí)候,毫不猶豫把7炸拆了,貫徹之前規(guī)劃的打法。

農(nóng)民一通過(guò)一對(duì)9接到這手牌,因?yàn)樗诘刂鞯南录?,需要給地主壓力,盡可能的跑,人打牌的時(shí)候也會(huì)這樣,壓迫感的打法,使地主發(fā)慌,才可以從中謀取勝機(jī)。拿到牌之后,先出了3個(gè)J帶,接著把3個(gè)K的飛機(jī)直接打出去,迫使地主要用一對(duì)鬼來(lái)炸。后面通過(guò)快進(jìn)的方式看這一局,最后的結(jié)果,這兩個(gè)農(nóng)民通過(guò)一些精巧的配合,最終打勝了地主一副很好的牌。

我們對(duì)監(jiān)督學(xué)習(xí)的整體效果做一個(gè)總結(jié),當(dāng)然中間還有很多其他類似的經(jīng)典案例。從這里面來(lái)看,我們有了一個(gè)非常令人驚喜的結(jié)果,直觀上看整個(gè)對(duì)戰(zhàn),AI智能體的打法跟人幾乎區(qū)別不出來(lái)。我們自己在看的時(shí)候,每一步出牌的過(guò)程好像是經(jīng)過(guò)了思考一樣。從實(shí)際線上測(cè)試的數(shù)據(jù)來(lái)看,跟人進(jìn)行隨機(jī)匹配的時(shí)候,對(duì)戰(zhàn)的勝率超過(guò)人類選手的平均水平。

事情是不是就這么結(jié)束了呢?通過(guò)一個(gè)模仿學(xué)習(xí)的方法,通過(guò)三個(gè)階段的優(yōu)化就能夠很好的完成AI,實(shí)際上并沒(méi)有這么簡(jiǎn)單。它也有表現(xiàn)不好的一面,我們通過(guò)大量的觀察發(fā)現(xiàn)一些問(wèn)題,這些問(wèn)題尤其是在局末的時(shí)候表現(xiàn)的特別突出,兩個(gè)農(nóng)民的配合偶爾會(huì)出現(xiàn)失誤。下面的部分,主要給大家講一下都是些什么失誤,為什么會(huì)產(chǎn)生這些失誤?以及我們?nèi)绾谓鉀Q這些失誤。

舉個(gè)例子,到局末的時(shí)候,地主只剩下一對(duì)A,這個(gè)時(shí)候?qū)τ谵r(nóng)民二來(lái)說(shuō),分類器排名第一的是出一對(duì)6,排名第二是正確的打法,排名第一的打法是錯(cuò)誤的。因?yàn)檫@個(gè)概率排出來(lái)是一對(duì)6最大,農(nóng)民二毫不猶豫把一對(duì)6出去了,導(dǎo)致可以把地主打敗的牌失敗。為什么會(huì)出現(xiàn)這種現(xiàn)象呢?我們經(jīng)過(guò)仔細(xì)分析發(fā)現(xiàn),前面400萬(wàn)局是從人類選手實(shí)際打牌的過(guò)程中提取出來(lái)的出牌過(guò)程。因?yàn)槿硕紩?huì)犯錯(cuò),就會(huì)引入很多人類所犯過(guò)的錯(cuò)誤。通過(guò)前面的模仿學(xué)習(xí)或監(jiān)督學(xué)習(xí)的原理,實(shí)際上機(jī)器人并不明白斗地主到底是怎么一回事,只是在模仿人類在不同盤面下怎么出牌的動(dòng)作,或者說(shuō)模仿人類在不同盤面下動(dòng)作的概率分布。

AI不僅學(xué)會(huì)了人好的一方面,我剛才也給大家講了,人能夠抽象出來(lái)的有一些戰(zhàn)略性的思想方面的東西,而且學(xué)會(huì)了人類犯錯(cuò)誤的東西。有時(shí)候這些低級(jí)的錯(cuò)誤,比如說(shuō)農(nóng)民二,假設(shè)AI在線上在這種情況下出了一對(duì)6,另外一個(gè)農(nóng)民是人的話,他就會(huì)覺(jué)得很不爽,覺(jué)得太傻了。

我們?nèi)绾谓鉀Q呢?因?yàn)檫@個(gè)問(wèn)題的本質(zhì)是來(lái)自于數(shù)據(jù)的樣本,當(dāng)然我們做機(jī)器學(xué)習(xí)的同學(xué)可能會(huì)說(shuō),可以通過(guò)人工的方法把400萬(wàn)局過(guò)濾一遍,把錯(cuò)誤的樣本剔出去。正所謂人工智能全靠“人工”,傳統(tǒng)的方法確實(shí)這么做。對(duì)于我們來(lái)說(shuō),我們感覺(jué)代價(jià)有點(diǎn)大,第一次大規(guī)模的訓(xùn)練只用了400萬(wàn)局,未來(lái)的訓(xùn)練想用2000萬(wàn)或上億級(jí)的數(shù)量來(lái)訓(xùn)練AI,人不可能把樣本過(guò)一遍。

我們用什么方法來(lái)處理呢?大家想一下人怎么玩斗地主這個(gè)游戲。高手在打斗地主的時(shí)候,通常都會(huì)根據(jù)其他的人已經(jīng)出過(guò)的牌來(lái)猜對(duì)手手上可能還有什么牌,因?yàn)橛浀米∶總€(gè)人打過(guò)什么牌,來(lái)猜對(duì)手手上還有什么牌。通過(guò)猜出來(lái)其他人剩下的牌,結(jié)合自己手上的牌面制定打牌的策略。猜的人準(zhǔn)確率越高,記牌的能力越強(qiáng),這個(gè)人打牌的水平就會(huì)越高。

基于這點(diǎn)思考,我們就想可不可以做一個(gè)猜牌模型。當(dāng)然,因?yàn)槲覀兦懊姘l(fā)現(xiàn)的錯(cuò)誤案例主要集中在局末。為了使猜牌變得簡(jiǎn)單,我們做了一個(gè)簡(jiǎn)單的假設(shè),當(dāng)有一個(gè)人聽(tīng)牌的時(shí)候(手上牌的數(shù)目小于等于2)開(kāi)始猜牌,原始深度模型的學(xué)習(xí)輸入跟翅膀模型是一樣的。輸出變了,先猜還有兩張牌那個(gè)人手上的牌。總共有134種組合,假設(shè)有一張單的時(shí)候,有14種,假設(shè)有兩張,出現(xiàn)一對(duì)有14鐘,兩張單的各種組合105種,然后重新構(gòu)造樣本來(lái)做猜牌模型。

我們做了兩組不同的采樣,第一組跟第二組相比,相對(duì)來(lái)說(shuō)第一組在兩張單的時(shí)候準(zhǔn)確率會(huì)更高一些,第二組猜對(duì)牌型的準(zhǔn)確率更高一些。對(duì)于Top3的概率來(lái)看,Top3命中的準(zhǔn)確率可以達(dá)到93.86%,接近94%。兩種模型相比較,第二種模型整體表現(xiàn)會(huì)更好一些,可能是因?yàn)椋憾返刂髟诰帜┑臅r(shí)候,猜對(duì)牌型比猜對(duì)牌是什么值會(huì)更重要一些。

有了這么準(zhǔn)的猜牌模型,接下來(lái)就可以把前面所說(shuō)的非完美信息的問(wèn)題轉(zhuǎn)化成完美信息,就跟下棋一樣,已經(jīng)大概知道別人的牌是什么樣的,然后就可以進(jìn)行推理。用什么樣的推理方法呢?棋類有各種各樣進(jìn)行搜索的方法,AIpha GO用的MCTS,我們用Minmax的搜索方法,這種方法實(shí)際上是在博弈論里面更古老的算法,有一個(gè)經(jīng)典的案例應(yīng)用是在1997年的時(shí)候“深藍(lán)”打敗卡斯帕羅夫,算法原理很簡(jiǎn)單,就是暴力的搜索,把所有的可能性搜出來(lái)。

因?yàn)槭潜┝ν陚涞乃阉?,就?huì)導(dǎo)致很慢。即使只剩下兩張牌,盤面的情況,如果不做任何優(yōu)化的Minmax搜索大概要運(yùn)行幾十分鐘,后面每走一步都要進(jìn)行一次搜索,這對(duì)我們來(lái)說(shuō)基本上是不可行的。必須要對(duì)這個(gè)東西進(jìn)行優(yōu)化。怎么優(yōu)化呢?我們做了三種優(yōu)化手段,第一種比較簡(jiǎn)單,實(shí)際上是一種檢值的算法,當(dāng)在進(jìn)行搜索的過(guò)程,一旦發(fā)現(xiàn)某一個(gè)分支下面有必勝的路徑,這個(gè)時(shí)候馬上停止搜索進(jìn)行返回。就好像孫悟空到海里找寶一樣,已經(jīng)找到最好的寶就不要再找了。這種方法使用上之后,F(xiàn)ast pruning,這個(gè)方法對(duì)性能提升了1000倍。

第二種方法是Caching,跟人打牌的過(guò)程中,到最后只剩下兩張牌的時(shí)候有大量的牌型是重合的,把之前搜過(guò)的解法直接Caching,就可以不用搜了。這個(gè)優(yōu)化又給我們提升了100倍的速度空間。

第三步的優(yōu)化,Minmax搜索的過(guò)程是從左到右,進(jìn)行深度搜索的過(guò)程。在每一層進(jìn)行深度搜索的過(guò)程,我們可以把每一層上面的節(jié)點(diǎn)進(jìn)行排序,其實(shí)比較簡(jiǎn)單。我們也可以用模型來(lái)排序,也可以用一些簡(jiǎn)單的規(guī)則,比如說(shuō)盡量出多的打法,或者是用模型,人類最有可能打的打法排在前面。這樣的話,最有可能找到前面的第一個(gè),一定會(huì)勝的那個(gè)路徑??偣渤似饋?lái),性能優(yōu)化就會(huì)優(yōu)化10的6次方,相當(dāng)于6個(gè)量級(jí)的地步,意味著前面做推理的時(shí)候,拿單CPU的核要經(jīng)過(guò)幾十分鐘進(jìn)行推理的過(guò)程,縮短到毫秒級(jí)別,意味著幾百萬(wàn)的用戶可以用幾十臺(tái)機(jī)器完全支撐起來(lái)。

結(jié)合猜牌+搜索,到局末的時(shí)候怎么打。舉個(gè)例子,這個(gè)地主還剩下一對(duì)K,農(nóng)民二首先進(jìn)行猜牌,通過(guò)猜牌模型猜地主手上有什么牌,猜到一對(duì)K的概率是0.48%,可能是一對(duì)Q的概率是0.42%,可能是K、Q組合的概率是0.074%,這個(gè)時(shí)候在三個(gè)分支上取Top3的分支進(jìn)行搜索,進(jìn)行搜索推理,發(fā)現(xiàn)在一對(duì)K的分支下應(yīng)該先出3會(huì)贏,在一對(duì)Q下面也是先出3。在后面一個(gè)Q、K組合的概率下,先出A跟先出3,或者是先出6都可以贏,綜合把三個(gè)分支的概率加權(quán)累加起來(lái),就得出先出3一定是對(duì)的,所以先出一張3,把地主的一對(duì)K拆散。

經(jīng)過(guò)在末局猜牌和推理的過(guò)程進(jìn)行優(yōu)化之后,我們來(lái)看一下優(yōu)化前后的對(duì)比牌局(PPT),如果沒(méi)有經(jīng)過(guò)優(yōu)化直接出一對(duì)5,地主一對(duì)K就走了。經(jīng)過(guò)優(yōu)化的情況,可以看到4的概率是100%,所以先出了4,地主出K,拆散了之后最后把地主打敗了。

到了這個(gè)階段之后,AI整個(gè)過(guò)程在牌的初始開(kāi)局和中局的時(shí)候是模仿人的打法,到終局的時(shí)候用猜牌推理,就可以得到一個(gè)比較大的強(qiáng)化。到底得到多大的強(qiáng)呢?實(shí)際上我們可以看到以前在局末的配合失誤基本上沒(méi)有,一個(gè)都沒(méi)有。為什么呢?從前面的測(cè)試數(shù)據(jù)也可以看到,猜牌模型在Top3的概率下,準(zhǔn)確度能到94%。實(shí)際上打到最后的時(shí)候,AI已經(jīng)接近于一個(gè)上帝視角的水準(zhǔn)。

用這樣的模式還有一個(gè)好處,初局的時(shí)候打法非常像人,如果一開(kāi)始就用猜牌和搜索的方式,可能會(huì)打出不像人的打法,像AIpha GO跟人類選手下棋跟人類不一樣的想法,我們?cè)谧霎a(chǎn)品的時(shí)候并不一定需要這個(gè)東西。

當(dāng)然,這種方法相對(duì)于業(yè)界或?qū)W術(shù)界解決非完美信息的解決方法來(lái)說(shuō),有幾個(gè)缺點(diǎn):第一,理論上實(shí)際上并不是特別完備的,大家可以看到,我們只處理了最后兩張牌。當(dāng)然了,再往上也可以處理3、4張,一直到17張的猜牌都可以做。第二,這對(duì)于斗地主一個(gè)游戲進(jìn)行獨(dú)立優(yōu)化的一種方法,是我們做產(chǎn)品或者說(shuō)工業(yè)界的一種做法,相對(duì)于那“DeepStack”和“冷撲大師”兩種方法,它有一個(gè)非常大的優(yōu)勢(shì),制作過(guò)程相對(duì)會(huì)比較簡(jiǎn)單;性能高,高到什么地步呢?我們做過(guò)一個(gè)評(píng)估,大概50臺(tái)服務(wù)器的成本就可以支撐所有用戶使用AI場(chǎng)景的量,基本上每臺(tái)機(jī)器每秒可以處理200次以上的請(qǐng)求,這是純CPU的機(jī)器。如果用深度學(xué)習(xí)做處理的時(shí)候,很多人都用GPU。

我今天的分享就先到這里,謝謝大家!

提問(wèn):你好,我想問(wèn)一下你剛剛說(shuō)的模型,有用CNN跟RNN,現(xiàn)在用的是哪一種?還有你們的loss是怎么去算的?

鄧大付:實(shí)際上我們用一個(gè)翅膀的模型,用了三個(gè)CNN的模型,整個(gè)loss跟CNN原始的沒(méi)有太多的區(qū)別。當(dāng)然,我們也測(cè)過(guò)Resnet,跟CNN的輸入比較像,5個(gè)block的Resnet,比我們前面加了7層卷積的CNN來(lái)說(shuō),精度稍微好一點(diǎn),區(qū)別并不是特別大。我們自己內(nèi)部也討論過(guò),可能跟整個(gè)斗地主的牌面并不是特別復(fù)雜有關(guān)系。

提問(wèn):你剛才說(shuō)用來(lái)訓(xùn)練的數(shù)據(jù)都是比較高級(jí)的玩家。

鄧大付:我們做機(jī)器學(xué)習(xí)的人通常都說(shuō)盡量把樣本搞的更加干凈準(zhǔn)確。實(shí)際上斗地主這個(gè)游戲有它自己的獨(dú)特性,并沒(méi)有像圍棋這樣有分級(jí)賽或天梯賽。在最開(kāi)始的時(shí)候除非進(jìn)行大量的篩選,才能把有真正最好的樣本給挑出來(lái)。相對(duì)來(lái)說(shuō)有中倍場(chǎng)、低倍場(chǎng)、高倍場(chǎng),高倍場(chǎng)的玩家水平相對(duì)于中倍場(chǎng)、低倍場(chǎng)的高一些,所以我們?nèi)「弑秷?chǎng)的玩家行為進(jìn)行輸入。

提問(wèn):基于對(duì)卡牌類的AI學(xué)習(xí)和訓(xùn)練,未來(lái)有沒(méi)有可能用于競(jìng)技類的游戲?比如說(shuō)王者榮耀,我們有大量直接戰(zhàn)隊(duì)的模型,方法原理是不是一樣的?

鄧大付:這種叫牌類游戲,卡牌類的游戲策略還不一樣。王者這個(gè)游戲相對(duì)于斗地主來(lái)說(shuō)要求會(huì)更高,比如,做預(yù)測(cè)的時(shí)候,延時(shí)要求會(huì)更高,每一幀或每幾幀要做一次預(yù)測(cè)。第二,輸入狀態(tài),實(shí)際上王者榮耀的輸入狀態(tài)遠(yuǎn)遠(yuǎn)超過(guò)了圍棋盤面的輸入,王者對(duì)游戲進(jìn)程有影響的有3萬(wàn)的特征,這個(gè)輸入量是很大的。這是一個(gè)正在研究的熱點(diǎn)方向,前面也聽(tīng)說(shuō)過(guò)了,openAI 的 openFive已經(jīng)在多場(chǎng)打贏了業(yè)余選手中的高手。當(dāng)然代價(jià)也是很大,需要線上服務(wù)成千上萬(wàn)的人,短期之內(nèi)可能還沒(méi)到那一步。但是我覺(jué)得技術(shù)在不停的發(fā)展,可能未來(lái)幾年之內(nèi)有希望可以看到。除了像王者榮耀這么復(fù)雜的游戲之外,大家可以看到外面有一個(gè)飛車AI挑戰(zhàn)賽的機(jī)器,實(shí)際上在一些策略、競(jìng)技型的策略游戲,除了像王者榮耀、吃雞這么大場(chǎng)景、大地圖的游戲之外,其他的游戲通過(guò)強(qiáng)化學(xué)習(xí),通過(guò)這些方法已經(jīng)可以做到超越大部分的人類是沒(méi)有問(wèn)題的。

提問(wèn):游戲AI可能會(huì)有競(jìng)技跟擬人的方向,剛才聽(tīng)您的方向,在斗地主上更多的是在擬人的方向來(lái)做,倒數(shù)第一頁(yè)是框著人的三個(gè)玩法里面選一個(gè)勝率最高的。在競(jìng)技上有什么想法?斗地主是一個(gè)合適的場(chǎng)景,德?lián)湓诟?jìng)技上有沒(méi)有探索?

鄧大付:競(jìng)技上的想法,其實(shí)我們現(xiàn)在還沒(méi)有特別想清楚,假設(shè)我們打造了一個(gè)比人還厲害的AI對(duì)游戲到底有什么用?我們現(xiàn)在的研究方向是做到擬人化。當(dāng)然,競(jìng)技中間模型的輸出,比如說(shuō)概率模型的輸出,比如說(shuō)我們可以在一些電競(jìng)進(jìn)行比賽的時(shí)候,人跟人進(jìn)行比賽,而不是人跟AI進(jìn)行比賽的時(shí)候,我們做一些預(yù)測(cè)和解說(shuō),這還是非常有用的。假設(shè)我們能做的很準(zhǔn),這種會(huì)很有說(shuō)服力,這樣觀眾也可以聽(tīng)的懂,到這個(gè)盤面下,下一步應(yīng)該采用什么樣的策略和方法能達(dá)到最好的結(jié)果,這樣是有用的。在其他競(jìng)技方面,對(duì)學(xué)術(shù)界來(lái)說(shuō)是很有用的,它們需要在復(fù)雜的游戲環(huán)境去測(cè)試他們的算法,因?yàn)槟莻€(gè)代價(jià)是最小的。假設(shè)我們拿到真實(shí)的人類其他生活、生產(chǎn)的環(huán)境,比如說(shuō)拿到無(wú)人汽車方面做控制,出了一個(gè)事就可以出人命,游戲當(dāng)中還可以再來(lái)一把,這是游戲界跟工業(yè)界做AI目標(biāo)不一樣的點(diǎn)。

提問(wèn):有兩個(gè)問(wèn)題,第一,您的機(jī)器學(xué)習(xí)方案是否已經(jīng)應(yīng)用到線上版本?或者計(jì)劃什么時(shí)候可以應(yīng)用到線上版本?

鄧大付:斗地主實(shí)際上已經(jīng)在線上進(jìn)行灰度了,在很多場(chǎng)景下進(jìn)行灰度,我們自己也希望通過(guò)對(duì)以前游戲工業(yè)級(jí)技術(shù)的升級(jí)來(lái)提升用戶的體驗(yàn),這是最重要的。

提問(wèn):第二個(gè)問(wèn)題,機(jī)器學(xué)習(xí)這個(gè)方式可能比大部分的玩家玩的都會(huì)比較好,可能會(huì)產(chǎn)生一個(gè)結(jié)果,一旦托管之后勝率就會(huì)比較高了。

鄧大付:這個(gè)問(wèn)題問(wèn)的很好,這個(gè)是我們?yōu)槭裁丛谶M(jìn)行灰度的原因,這里面還有一個(gè)問(wèn)題,在整個(gè)PPT里面沒(méi)有提到這個(gè)問(wèn)題,實(shí)際上當(dāng)初策劃斗地主的項(xiàng)目人員還給我們一個(gè)條件,所有的AI是可以分級(jí)的,分級(jí)的前提條件一定要把AI的水平提到一定的階段,然后再來(lái)弱化它,當(dāng)然弱化它的方法有很多種,比如說(shuō)可以取不同水平人的樣本做訓(xùn)練,也可以在打牌的過(guò)程當(dāng)中模擬失誤來(lái)降低它的水平,整個(gè)分級(jí)相對(duì)會(huì)更容易一些。

銳亞教育

銳亞教育,游戲論壇|地下城守護(hù)者3|機(jī)核網(wǎng)|織田non|Everspace|血與冰淇淋|cha研|永遠(yuǎn)忠誠(chéng)|游戲開(kāi)發(fā)論壇|游戲制作人|游戲策劃|游戲開(kāi)發(fā)|獨(dú)立游戲|游戲產(chǎn)業(yè)|游戲研發(fā)|游戲運(yùn)營(yíng)|