趙煜霖,沈強(qiáng)望,李淑琴,孟 坤
(1.北京信息科技大學(xué) 計(jì)算機(jī)學(xué)院, 北京 100101;2.感知與計(jì)算智能聯(lián)合實(shí)驗(yàn)室, 北京 100101)
博弈游戲是檢驗(yàn)人工智能發(fā)展水準(zhǔn)的重要平臺(tái)之一[1]。其中,競(jìng)技二打一游戲作為一種大眾喜聞樂(lè)見(jiàn)的博弈游戲[2],具有非完全信息、動(dòng)作空間巨大、決策過(guò)程復(fù)雜、多階段對(duì)局等特點(diǎn)[3],眾多學(xué)者便對(duì)其展開(kāi)了動(dòng)作空間降維[1]、手牌推測(cè)[4-7]、出牌決策[8-11]等多方面的研究,并且取得眾多研究成果;同時(shí),為了在有限輪對(duì)局內(nèi)區(qū)分二打一游戲玩家的競(jìng)技水平,陳子鵬等[12]給出了一種計(jì)算初始手牌區(qū)分度的方法,并在實(shí)際測(cè)試中驗(yàn)證方法的有效性;然而,區(qū)分博弈競(jìng)技水平的競(jìng)技二打一比賽采用復(fù)式賽制,存在比賽作弊的問(wèn)題,李淑琴等[13]對(duì)如何判定和選取具有同等牌力的初始手牌進(jìn)行研究,提出用等級(jí)難度評(píng)估指標(biāo)來(lái)計(jì)算初始手牌的難度,通過(guò)多個(gè)不同水平的二打一AI驗(yàn)證了該方法的可靠性。
叫牌階段作為在二打一中首先進(jìn)行的對(duì)局階段,其叫牌結(jié)果會(huì)決定對(duì)局結(jié)束時(shí)的基礎(chǔ)收益情況。為了能夠盡可能提高最終的基礎(chǔ)收益,需要針對(duì)不同的叫牌風(fēng)格采取相應(yīng)的叫牌動(dòng)作。
現(xiàn)在對(duì)叫牌階段的研究普遍集中在推薦叫牌模型上,也就是根據(jù)玩家手牌給出一個(gè)推薦的叫牌動(dòng)作。Yuan等[14]針對(duì)競(jìng)技二打一博弈過(guò)程中的叫分策略進(jìn)行研究,利用所構(gòu)建的牌力和牌序特征自動(dòng)學(xué)習(xí)內(nèi)在隱含關(guān)聯(lián),并與支持向量機(jī)(support vector machine,SVM),長(zhǎng)短期記憶網(wǎng)絡(luò)(long short term memory,LSTM),文本卷積神經(jīng)網(wǎng)絡(luò)(text convolution neural network,TextCNN)分別進(jìn)行對(duì)比實(shí)驗(yàn),筆者提出的模型在召回率、精確率和準(zhǔn)確率上均超過(guò)上述方法,均達(dá)到了80%以上。文獻(xiàn)[6]通過(guò)使用多層CNN對(duì)手牌進(jìn)行特征提取,并將叫分大小作為標(biāo)簽,訓(xùn)練出的叫分模型在真實(shí)人類玩家的數(shù)據(jù)集上能夠與人類叫分結(jié)果達(dá)到76.5%的相似度。同時(shí),筆者也考慮了玩家的叫分會(huì)受到其他玩家的影響,通過(guò)一種規(guī)則修正的方式來(lái)使得模型的叫分結(jié)果更貼近真人的行為。文獻(xiàn)[15]分析了競(jìng)技二打一中叫分時(shí)會(huì)考慮的牌型和數(shù)量,選取了12種牌型組合方式作為弱分類器,使用AdaBoost算法進(jìn)行訓(xùn)練,從而得到一個(gè)強(qiáng)分類器,最終在真實(shí)玩家的數(shù)據(jù)集上能夠達(dá)到75%的準(zhǔn)確率。
以上這些工作的研究成果都十分出色,但都只是根據(jù)手牌的特征進(jìn)行叫分動(dòng)作的分類任務(wù)。筆者認(rèn)為,如果可以對(duì)其他玩家叫牌風(fēng)格進(jìn)行劃分來(lái)推測(cè)會(huì)采取的叫牌動(dòng)作,則可以通過(guò)自己的叫牌動(dòng)作進(jìn)行誘導(dǎo),使自己能夠獲得更高收益,故將對(duì)玩家叫牌風(fēng)格的劃分方法進(jìn)行研究。
本文主要通過(guò)2個(gè)部分設(shè)計(jì)并實(shí)現(xiàn)對(duì)玩家叫牌風(fēng)格的劃分:首先是對(duì)于基準(zhǔn)叫牌模型的設(shè)計(jì)與實(shí)現(xiàn),該模型主要通過(guò)使用卷積神經(jīng)網(wǎng)絡(luò)對(duì)玩家手牌進(jìn)行特征提取并結(jié)合當(dāng)前叫牌情況實(shí)現(xiàn)對(duì)于玩家手牌動(dòng)作的分類;然后,使用統(tǒng)計(jì)學(xué)方法計(jì)算玩家叫牌動(dòng)作與基準(zhǔn)模型之間的差異,通過(guò)查表的方式實(shí)現(xiàn)對(duì)于玩家叫牌風(fēng)格的劃分。
考慮到競(jìng)技二打一所使用的紙牌是由紅色Joker、黑色Joker(后面分別叫用X,D表示)以及13種不同點(diǎn)數(shù)(3、4、5、6、7、8、9、10、J、Q、K、A、2)且每個(gè)點(diǎn)數(shù)各有4張紙牌(在競(jìng)技二打一中同點(diǎn)數(shù)之間不區(qū)分花色)共計(jì)54張紙牌構(gòu)成,由于大部分點(diǎn)數(shù)的紙牌都是4張,故玩家點(diǎn)數(shù)3到2的手牌采用如圖1所示的0-1矩陣進(jìn)行表示,矩陣中每列1的個(gè)數(shù)代表各個(gè)點(diǎn)數(shù)手牌的數(shù)量;對(duì)于玩家手牌中的大小王則分別用一個(gè)0-1特征進(jìn)行表示。
圖1 手牌為67788999AAAA2XD的特征矩陣表示
基準(zhǔn)叫牌動(dòng)作是由玩家手牌和其他玩家的叫牌情況共同決定的。本文受文獻(xiàn)[14]啟發(fā),對(duì)TextCNN[16]進(jìn)行修改,設(shè)計(jì)了如圖2所示的基準(zhǔn)叫牌模型。該模型主要分為2個(gè)部分——提取連續(xù)牌特征的卷積網(wǎng)絡(luò)部分和融合叫牌情況、強(qiáng)力牌特征的叫牌網(wǎng)絡(luò)部分。
圖2 基準(zhǔn)叫牌模型結(jié)構(gòu)
卷積網(wǎng)絡(luò)部分的輸入是12×4大小的連續(xù)牌特征矩陣,其中的連續(xù)牌指的是可以組成例如單順、對(duì)順和三順等連續(xù)點(diǎn)數(shù)牌型[17]的點(diǎn)數(shù)牌,12表示從3到2共12個(gè)數(shù)的手牌,4代表持有的張數(shù)。將特征矩陣輸入到3組卷積核大小分別為2、3、5,輸出通道數(shù)均為4的一維卷積神經(jīng)網(wǎng)絡(luò)進(jìn)行卷積運(yùn)算??紤]到池化運(yùn)算會(huì)改變特征之間的相鄰關(guān)系,故本模型所使用的卷積神經(jīng)網(wǎng)絡(luò)去除了池化過(guò)程,最后再通過(guò)Relu激活函數(shù)得到12個(gè)卷積后的特征向量。
手牌中強(qiáng)力牌情況(例如手牌中是否有大小王、2的個(gè)數(shù)和炸彈個(gè)數(shù))和當(dāng)前叫牌情況特征也是決定叫牌動(dòng)作的重要因素,故將上述影響因素按照用0-1編碼進(jìn)行特征表示,如圖3所示。然后將這些特征與12個(gè)連續(xù)牌卷積后的特征向量連接在一起作為融合網(wǎng)絡(luò)部分的輸入,經(jīng)過(guò)多層全連接層進(jìn)行前向傳播,最后輸出模型的叫牌動(dòng)作。
圖3 搶地主階段、叫牌次數(shù)為1的當(dāng)前叫牌情況和手牌中持有2XD和一個(gè)炸彈的特征表示
為了保證模型具有較強(qiáng)的學(xué)習(xí)能力,對(duì)提取到的特征進(jìn)行升維;同時(shí),為了保證模型具有較強(qiáng)的泛化能力,在各全連接層之間使用dropout函數(shù)會(huì)讓某些神經(jīng)元隨機(jī)“失活”,使模型不會(huì)依賴于局部特征,從而避免過(guò)擬合。
玩家會(huì)根據(jù)自己的叫牌風(fēng)格采取不同的叫牌動(dòng)作。為了量化叫牌風(fēng)格之間的差異,本部分將設(shè)計(jì)玩家叫牌風(fēng)格的劃分方法。
本文提出的玩家叫牌風(fēng)格類別的劃分方法是根據(jù)玩家的叫牌動(dòng)作進(jìn)行設(shè)計(jì),故首先對(duì)玩家的叫牌動(dòng)作進(jìn)行分析。在叫分階段會(huì)存在著0,1,2,3這樣4個(gè)可選擇的叫牌動(dòng)作,在搶地主階段會(huì)存在著加倍和不加倍2種動(dòng)作。根據(jù)對(duì)實(shí)驗(yàn)數(shù)據(jù)的統(tǒng)計(jì)發(fā)現(xiàn),多數(shù)玩家的叫分動(dòng)作多數(shù)趨向于0和3,使叫分階段的叫牌動(dòng)作退化成2個(gè),與搶地主階段的叫牌動(dòng)作數(shù)量一致,故本文把2個(gè)階段的叫牌動(dòng)作都統(tǒng)一成0和12個(gè)動(dòng)作??紤]到玩家的叫牌動(dòng)作與基準(zhǔn)模型之間的差異會(huì)隨著玩家叫牌數(shù)據(jù)的不斷擴(kuò)充逐漸收斂一個(gè)平面點(diǎn),故按照對(duì)手牌的高估程度μ和叫牌動(dòng)作偏離程度σ2個(gè)指標(biāo)把玩家叫牌風(fēng)格劃分為以下6種——保守理性型、保守非理性型、風(fēng)險(xiǎn)理性型、風(fēng)險(xiǎn)非理性型、激進(jìn)理性型、激進(jìn)非理性型。
為了能夠?qū)φ鎸?shí)玩家的叫牌風(fēng)格進(jìn)行劃分,本文采用以下步驟對(duì)手牌的高估程度μ和叫牌動(dòng)作偏離程度σ2個(gè)指標(biāo)進(jìn)行數(shù)值量化:使用基準(zhǔn)叫牌模型M計(jì)算N副玩家手牌hi應(yīng)該采取的叫牌動(dòng)作SMi,計(jì)算出玩家p叫牌動(dòng)作Spi與模型叫牌動(dòng)作之間的差值Si,把差值大于0的手牌hj看作玩家對(duì)hj的高估,統(tǒng)計(jì)玩家p高估手牌的局?jǐn)?shù)m和采取叫牌動(dòng)作1的局?jǐn)?shù)n,利用式(1)計(jì)算出玩家對(duì)手牌的高估程度μ;利用式(2)計(jì)算出玩家叫牌動(dòng)作的偏離程度σ。
(1)
(2)
式中:SMi與Spi取值范圍均在[0,1];差值Si的取值范圍在[-1,1];μ取值范圍在[0,1]。在計(jì)算μ和σ過(guò)程中N的取值大小影響風(fēng)格劃分精度,本文認(rèn)為在N不小于10時(shí)玩家的叫牌風(fēng)格才能進(jìn)行較為準(zhǔn)確的劃分,然后給出表1中各玩家叫牌風(fēng)格中2個(gè)指標(biāo)的取值范圍,實(shí)現(xiàn)對(duì)玩家叫牌風(fēng)格的劃分。
表1 玩家叫牌風(fēng)格劃分
實(shí)驗(yàn)所使用數(shù)據(jù)的來(lái)源是國(guó)內(nèi)某知名在線游戲平臺(tái)提供的競(jìng)技二打一游戲真實(shí)數(shù)據(jù)。原始數(shù)據(jù)中記錄了游戲過(guò)程中3位玩家的脫敏處理后的 ID、手牌記錄、底牌信息、叫分情況、出牌記錄,以及牌局最終的勝負(fù)結(jié)果。原始數(shù)據(jù)以文本文件的形式進(jìn)行存儲(chǔ),各記錄之間的分隔符使用的是 ASCII 碼中的SOH(0x01)與STX(0x02)。原始數(shù)據(jù)樣例形式如圖4所示。
圖4 部分原始數(shù)據(jù)樣例
以數(shù)據(jù)樣例中標(biāo)記號(hào)為10的記錄為例,對(duì)各記錄進(jìn)行如表2所示的詳細(xì)說(shuō)明。
表2 原始數(shù)據(jù)格式和記錄說(shuō)明
在原始數(shù)據(jù)中存在部分異常對(duì)局記錄,如玩家掉線,牌局未完成等情況。同時(shí),部分水平較低和游戲總局?jǐn)?shù)過(guò)少玩家的對(duì)局信息對(duì)模型訓(xùn)練會(huì)帶來(lái)較大的偏差。一副手牌是否可以叫牌不僅依賴于手牌的好壞程度,還與拿到該副牌的玩家水平有關(guān)。因此,需要對(duì)玩家id進(jìn)行篩選。
為了能夠獲得高水平玩家的id字段,就需要統(tǒng)計(jì)原始數(shù)據(jù)中每名玩家的獲勝局?jǐn)?shù)和總局?jǐn)?shù),并計(jì)算各玩家的勝率。本文認(rèn)為,若玩家的勝率越高,則說(shuō)明玩家的博弈水平越高,故高于平均勝率的玩家的叫牌動(dòng)作更具有參考價(jià)值。篩選出這部分玩家的id信息,并進(jìn)行存儲(chǔ)。部分有效玩家經(jīng)過(guò)脫敏處理的id信息如圖5所示。
圖5 部分有效玩家id
原始數(shù)據(jù)記錄的是完整對(duì)局信息,包括玩家信息、手牌信息、叫分信息、出牌信息,而本文針對(duì)競(jìng)技二打一博弈玩家風(fēng)格問(wèn)題只需要摘取其中的部分有效信息,避免數(shù)據(jù)集中的無(wú)效數(shù)據(jù)過(guò)多,導(dǎo)致模型訓(xùn)練效果與預(yù)期產(chǎn)生偏差。本實(shí)驗(yàn)將所有有效玩家的對(duì)局?jǐn)?shù)據(jù)信息經(jīng)過(guò)以下方式進(jìn)行處理,成為可供后續(xù)網(wǎng)絡(luò)模型輸入的數(shù)據(jù)集形式:
1) 讀取高水平玩家文件,得到高水平玩家字段;
2) 讀入原始數(shù)據(jù)中每一局的對(duì)局信息;
3) 通過(guò)SOH字符分割開(kāi)一場(chǎng)對(duì)局中每個(gè)階段的信息;
4) 通過(guò)STX字符分割開(kāi)每個(gè)階段中每位玩家的具體操作信息;
5) 依次讀入叫分階段每位玩家叫分信息,最后一位叫分玩家的位置記為地主;
6) 判斷第一個(gè)出牌的玩家位置是否是5)操作的記錄值,若是,則為有效對(duì)局,進(jìn)行下一步操作;
7) 讀取每位玩家的叫牌信息,并判斷獲勝玩家是否為高水平玩家,若不是則直接舍棄;反之,若獲勝玩家為地主,則把地主的叫牌數(shù)據(jù)標(biāo)記為1,若獲勝玩家為農(nóng)民,則農(nóng)民叫牌數(shù)據(jù)的標(biāo)記根據(jù)叫牌動(dòng)作進(jìn)行標(biāo)記——叫牌標(biāo)記為1,不叫牌標(biāo)記為0。
8) 由7)中處理后的數(shù)據(jù)存在相同叫牌情況下的不同叫牌動(dòng)作,為了避免模型訓(xùn)練震蕩,本文考慮統(tǒng)計(jì)相同叫牌局面和相同手牌下的標(biāo)記之和與總標(biāo)記數(shù)量的比值大小決定當(dāng)前手牌的叫牌動(dòng)作,避免訓(xùn)練震蕩。具體決定方式為:若比值大于0.5,則在當(dāng)前叫牌局面和手牌下,標(biāo)記為1;否則,標(biāo)記為0。
按照上述方法,從500余萬(wàn)條原始數(shù)據(jù)中篩選出約10萬(wàn)條用于訓(xùn)練模型的基準(zhǔn)叫牌數(shù)據(jù)。具體數(shù)據(jù)保留格式如圖6所示,以逗號(hào)進(jìn)行分段:第一段數(shù)據(jù)代表叫牌階段——0表示叫分階段,1代表?yè)尩刂麟A段;第二段數(shù)據(jù)代表當(dāng)前叫牌值大小——共有0,1,2共3個(gè)值;第三段數(shù)據(jù)代表玩家手牌;第四段數(shù)據(jù)代表該條數(shù)據(jù)的標(biāo)簽值,也就是應(yīng)該采取的叫牌動(dòng)作。
圖6 部分基準(zhǔn)叫牌數(shù)據(jù)保存格式
將篩選出的數(shù)據(jù)劃分為約8萬(wàn)條數(shù)據(jù)的訓(xùn)練集和約2萬(wàn)條數(shù)據(jù)的測(cè)試集,使用第1章設(shè)計(jì)的模型進(jìn)行訓(xùn)練,訓(xùn)練過(guò)程如算法1所示。
算法1
輸入:叫牌數(shù)據(jù)集D,待訓(xùn)練的叫牌模型M,學(xué)習(xí)率r
輸出:訓(xùn)練好的叫牌模型M′
將D拆分成訓(xùn)練集X和測(cè)試集C
測(cè)試集準(zhǔn)確率acc ← 0.0
for 訓(xùn)練輪數(shù) = 0,1,2,…,100:
將X隨機(jī)拆分成NX個(gè)大小為B的小批量數(shù)據(jù)集DX
采取正確叫牌動(dòng)作的樣本計(jì)數(shù)tx← 0
for 小批量數(shù)據(jù)集編號(hào)xi= 0,1,2,…,NX:
用CrossEntroyLoss計(jì)算DX[xi]的損失值,更新M的網(wǎng)絡(luò)參數(shù)
tx←tx+neqneq:對(duì)于DX[xi]中數(shù)據(jù)M給出的輸出與其標(biāo)簽值一致的數(shù)量
將C隨機(jī)拆分成NC個(gè)大小為B的小批量數(shù)據(jù)集DC
采取正確叫牌動(dòng)作的樣本計(jì)數(shù)ct← 0
for 小批量數(shù)據(jù)集編號(hào)ci= 0,1,2,…,NC:
tc←tc+neqneq:對(duì)于DC[ci]中數(shù)據(jù)M給出的輸出與其標(biāo)簽值一致的數(shù)量
當(dāng)前準(zhǔn)確率acc_tmp←tc/C中樣本個(gè)數(shù)
ifacc_tmp>acc:
M′ ←M
acc←acc_tmp
本文所使用的系統(tǒng)環(huán)境配置如表3所示。
表3 硬件和軟件配置
訓(xùn)練過(guò)程中所使用的優(yōu)化器為Adam優(yōu)化器,損失函數(shù)使用CrossEntroyLoss函數(shù),學(xué)習(xí)率設(shè)置為1×10-4,dropout層的p值設(shè)置為0.5。
3.2.1基準(zhǔn)叫牌模型訓(xùn)練效果與分析
使用第2章得到的基準(zhǔn)叫牌數(shù)據(jù)進(jìn)行100輪訓(xùn)練后,模型在訓(xùn)練集和測(cè)試集上損失函數(shù)值和準(zhǔn)確率變化如圖7和圖8所示。
圖7 模型在訓(xùn)練集和測(cè)試集上損失函數(shù)值的變化
圖8 模型在訓(xùn)練集和測(cè)試集上準(zhǔn)確率的變化
在前7輪訓(xùn)練中,損失函數(shù)值下降,但準(zhǔn)確率卻幾乎不變,本文認(rèn)為是標(biāo)簽為叫牌的樣本數(shù)據(jù)在一開(kāi)始的loss中占據(jù)了主導(dǎo)優(yōu)勢(shì),使得模型在此時(shí)錯(cuò)誤學(xué)習(xí)到兩類數(shù)據(jù)的比例結(jié)構(gòu),導(dǎo)致了上述異常狀況的出現(xiàn)。
在后續(xù)的訓(xùn)練中,模型對(duì)叫牌類型的樣本擬合達(dá)到一定程度后,該類樣本對(duì)loss的貢獻(xiàn)度相較于不叫牌的樣本的影響降低,模型開(kāi)始對(duì)不叫牌的樣本進(jìn)行擬合,最終達(dá)到收斂狀態(tài)。
同時(shí),本文也對(duì)引入模型的強(qiáng)力牌特征和叫牌情況特征分別進(jìn)行消融實(shí)驗(yàn),得到如圖9和圖10的結(jié)果。實(shí)驗(yàn)結(jié)果表明2種特征對(duì)于模型性能的提升均有較大提升,驗(yàn)證了本文引入的這2種特征的有效性。
圖9 模型在去除部分特征后損失函數(shù)值的變化
圖10 模型在去除部分特征后準(zhǔn)確率的變化
3.2.2玩家叫牌風(fēng)格劃分結(jié)果與分析
叫牌風(fēng)格劃分所用的數(shù)據(jù)來(lái)自另一份真實(shí)玩家數(shù)據(jù),將這部分?jǐn)?shù)據(jù)中的叫牌信息按照玩家id分別進(jìn)行存儲(chǔ)。為保證叫牌風(fēng)格劃分的準(zhǔn)確性,本實(shí)驗(yàn)剔除了少于10次叫牌動(dòng)作玩家的樣本數(shù)據(jù)。
圖11的最后2列分別展示了在相同情況下某玩家的叫牌記錄和模型給出的基準(zhǔn)叫牌動(dòng)作。根據(jù)1.3節(jié)提出的叫牌風(fēng)格劃分方法,計(jì)算得到該玩家對(duì)手牌的高估程度為0.500 004,對(duì)叫牌動(dòng)作的偏離程度為0.738 548,查表1可知該玩家的叫牌風(fēng)格屬于激進(jìn)非理性型。
圖11 相同叫牌情況下某玩家的叫牌記錄和基準(zhǔn)叫牌動(dòng)作
觀察圖11可以發(fā)現(xiàn),數(shù)據(jù)項(xiàng)1中無(wú)任何強(qiáng)力牌特征,數(shù)據(jù)項(xiàng)3、7、12中存在大量不能構(gòu)成連續(xù)牌特征的點(diǎn)數(shù)牌,但玩家仍采取叫牌的動(dòng)作,以此判斷該玩家在叫牌過(guò)程中比較激進(jìn)隨意,可以認(rèn)為其叫牌風(fēng)格屬于激進(jìn)非理性型。由此認(rèn)為本文設(shè)計(jì)的玩家叫牌風(fēng)格劃分方法對(duì)于高估手牌的部分能夠正確判別,具有一定的可行性。
為了提高自身在對(duì)局中的收益,本文以競(jìng)技二打一的玩家叫牌風(fēng)格作為切入點(diǎn),研究了一種融合深度學(xué)習(xí)卷積神經(jīng)網(wǎng)絡(luò)和統(tǒng)計(jì)學(xué)方法的玩家叫牌風(fēng)格劃分方法,該方法能夠?qū)ν婕业慕信骑L(fēng)格進(jìn)行正確劃分。
在基準(zhǔn)叫牌模型訓(xùn)練開(kāi)始時(shí)出現(xiàn)準(zhǔn)確率不能提升的問(wèn)題,筆者認(rèn)為可能是樣本比例不均衡造成的,如果能夠找到一種合適的平衡樣本比例的算法,會(huì)使模型的性能得到進(jìn)一步提升。
本文訓(xùn)練出具有較高準(zhǔn)確率的叫分基準(zhǔn)模型,并能依據(jù)叫分基準(zhǔn)模型對(duì)玩家的叫牌風(fēng)格進(jìn)行分類劃分,未來(lái)將會(huì)設(shè)計(jì)帶有多階段叫牌博弈算法接口的平臺(tái)對(duì)本文的方法增加對(duì)局收益的效果進(jìn)行驗(yàn)證。