趙煜霖,沈強望,李淑琴,孟 坤
(1.北京信息科技大學 計算機學院, 北京 100101;2.感知與計算智能聯合實驗室, 北京 100101)
博弈游戲是檢驗人工智能發展水準的重要平臺之一[1]。其中,競技二打一游戲作為一種大眾喜聞樂見的博弈游戲[2],具有非完全信息、動作空間巨大、決策過程復雜、多階段對局等特點[3],眾多學者便對其展開了動作空間降維[1]、手牌推測[4-7]、出牌決策[8-11]等多方面的研究,并且取得眾多研究成果;同時,為了在有限輪對局內區分二打一游戲玩家的競技水平,陳子鵬等[12]給出了一種計算初始手牌區分度的方法,并在實際測試中驗證方法的有效性;然而,區分博弈競技水平的競技二打一比賽采用復式賽制,存在比賽作弊的問題,李淑琴等[13]對如何判定和選取具有同等牌力的初始手牌進行研究,提出用等級難度評估指標來計算初始手牌的難度,通過多個不同水平的二打一AI驗證了該方法的可靠性。
叫牌階段作為在二打一中首先進行的對局階段,其叫牌結果會決定對局結束時的基礎收益情況。為了能夠盡可能提高最終的基礎收益,需要針對不同的叫牌風格采取相應的叫牌動作。
現在對叫牌階段的研究普遍集中在推薦叫牌模型上,也就是根據玩家手牌給出一個推薦的叫牌動作。Yuan等[14]針對競技二打一博弈過程中的叫分策略進行研究,利用所構建的牌力和牌序特征自動學習內在隱含關聯,并與支持向量機(support vector machine,SVM),長短期記憶網絡(long short term memory,LSTM),文本卷積神經網絡(text convolution neural network,TextCNN)分別進行對比實驗,筆者提出的模型在召回率、精確率和準確率上均超過上述方法,均達到了80%以上。文獻[6]通過使用多層CNN對手牌進行特征提取,并將叫分大小作為標簽,訓練出的叫分模型在真實人類玩家的數據集上能夠與人類叫分結果達到76.5%的相似度。同時,筆者也考慮了玩家的叫分會受到其他玩家的影響,通過一種規則修正的方式來使得模型的叫分結果更貼近真人的行為。文獻[15]分析了競技二打一中叫分時會考慮的牌型和數量,選取了12種牌型組合方式作為弱分類器,使用AdaBoost算法進行訓練,從而得到一個強分類器,最終在真實玩家的數據集上能夠達到75%的準確率。
以上這些工作的研究成果都十分出色,但都只是根據手牌的特征進行叫分動作的分類任務。筆者認為,如果可以對其他玩家叫牌風格進行劃分來推測會采取的叫牌動作,則可以通過自己的叫牌動作進行誘導,使自己能夠獲得更高收益,故將對玩家叫牌風格的劃分方法進行研究。
本文主要通過2個部分設計并實現對玩家叫牌風格的劃分:首先是對于基準叫牌模型的設計與實現,該模型主要通過使用卷積神經網絡對玩家手牌進行特征提取并結合當前叫牌情況實現對于玩家手牌動作的分類;然后,使用統計學方法計算玩家叫牌動作與基準模型之間的差異,通過查表的方式實現對于玩家叫牌風格的劃分。
考慮到競技二打一所使用的紙牌是由紅色Joker、黑色Joker(后面分別叫用X,D表示)以及13種不同點數(3、4、5、6、7、8、9、10、J、Q、K、A、2)且每個點數各有4張紙牌(在競技二打一中同點數之間不區分花色)共計54張紙牌構成,由于大部分點數的紙牌都是4張,故玩家點數3到2的手牌采用如圖1所示的0-1矩陣進行表示,矩陣中每列1的個數代表各個點數手牌的數量;對于玩家手牌中的大小王則分別用一個0-1特征進行表示。

圖1 手牌為67788999AAAA2XD的特征矩陣表示
基準叫牌動作是由玩家手牌和其他玩家的叫牌情況共同決定的。本文受文獻[14]啟發,對TextCNN[16]進行修改,設計了如圖2所示的基準叫牌模型。該模型主要分為2個部分——提取連續牌特征的卷積網絡部分和融合叫牌情況、強力牌特征的叫牌網絡部分。

圖2 基準叫牌模型結構
卷積網絡部分的輸入是12×4大小的連續牌特征矩陣,其中的連續牌指的是可以組成例如單順、對順和三順等連續點數牌型[17]的點數牌,12表示從3到2共12個數的手牌,4代表持有的張數。將特征矩陣輸入到3組卷積核大小分別為2、3、5,輸出通道數均為4的一維卷積神經網絡進行卷積運算。考慮到池化運算會改變特征之間的相鄰關系,故本模型所使用的卷積神經網絡去除了池化過程,最后再通過Relu激活函數得到12個卷積后的特征向量。
手牌中強力牌情況(例如手牌中是否有大小王、2的個數和炸彈個數)和當前叫牌情況特征也是決定叫牌動作的重要因素,故將上述影響因素按照用0-1編碼進行特征表示,如圖3所示。然后將這些特征與12個連續牌卷積后的特征向量連接在一起作為融合網絡部分的輸入,經過多層全連接層進行前向傳播,最后輸出模型的叫牌動作。

圖3 搶地主階段、叫牌次數為1的當前叫牌情況和手牌中持有2XD和一個炸彈的特征表示
為了保證模型具有較強的學習能力,對提取到的特征進行升維;同時,為了保證模型具有較強的泛化能力,在各全連接層之間使用dropout函數會讓某些神經元隨機“失活”,使模型不會依賴于局部特征,從而避免過擬合。
玩家會根據自己的叫牌風格采取不同的叫牌動作。為了量化叫牌風格之間的差異,本部分將設計玩家叫牌風格的劃分方法。
本文提出的玩家叫牌風格類別的劃分方法是根據玩家的叫牌動作進行設計,故首先對玩家的叫牌動作進行分析。在叫分階段會存在著0,1,2,3這樣4個可選擇的叫牌動作,在搶地主階段會存在著加倍和不加倍2種動作。根據對實驗數據的統計發現,多數玩家的叫分動作多數趨向于0和3,使叫分階段的叫牌動作退化成2個,與搶地主階段的叫牌動作數量一致,故本文把2個階段的叫牌動作都統一成0和12個動作。考慮到玩家的叫牌動作與基準模型之間的差異會隨著玩家叫牌數據的不斷擴充逐漸收斂一個平面點,故按照對手牌的高估程度μ和叫牌動作偏離程度σ2個指標把玩家叫牌風格劃分為以下6種——保守理性型、保守非理性型、風險理性型、風險非理性型、激進理性型、激進非理性型。
為了能夠對真實玩家的叫牌風格進行劃分,本文采用以下步驟對手牌的高估程度μ和叫牌動作偏離程度σ2個指標進行數值量化:使用基準叫牌模型M計算N副玩家手牌hi應該采取的叫牌動作SMi,計算出玩家p叫牌動作Spi與模型叫牌動作之間的差值Si,把差值大于0的手牌hj看作玩家對hj的高估,統計玩家p高估手牌的局數m和采取叫牌動作1的局數n,利用式(1)計算出玩家對手牌的高估程度μ;利用式(2)計算出玩家叫牌動作的偏離程度σ。
(1)
(2)
式中:SMi與Spi取值范圍均在[0,1];差值Si的取值范圍在[-1,1];μ取值范圍在[0,1]。在計算μ和σ過程中N的取值大小影響風格劃分精度,本文認為在N不小于10時玩家的叫牌風格才能進行較為準確的劃分,然后給出表1中各玩家叫牌風格中2個指標的取值范圍,實現對玩家叫牌風格的劃分。

表1 玩家叫牌風格劃分
實驗所使用數據的來源是國內某知名在線游戲平臺提供的競技二打一游戲真實數據。原始數據中記錄了游戲過程中3位玩家的脫敏處理后的 ID、手牌記錄、底牌信息、叫分情況、出牌記錄,以及牌局最終的勝負結果。原始數據以文本文件的形式進行存儲,各記錄之間的分隔符使用的是 ASCII 碼中的SOH(0x01)與STX(0x02)。原始數據樣例形式如圖4所示。

圖4 部分原始數據樣例
以數據樣例中標記號為10的記錄為例,對各記錄進行如表2所示的詳細說明。

表2 原始數據格式和記錄說明
在原始數據中存在部分異常對局記錄,如玩家掉線,牌局未完成等情況。同時,部分水平較低和游戲總局數過少玩家的對局信息對模型訓練會帶來較大的偏差。一副手牌是否可以叫牌不僅依賴于手牌的好壞程度,還與拿到該副牌的玩家水平有關。因此,需要對玩家id進行篩選。
為了能夠獲得高水平玩家的id字段,就需要統計原始數據中每名玩家的獲勝局數和總局數,并計算各玩家的勝率。本文認為,若玩家的勝率越高,則說明玩家的博弈水平越高,故高于平均勝率的玩家的叫牌動作更具有參考價值。篩選出這部分玩家的id信息,并進行存儲。部分有效玩家經過脫敏處理的id信息如圖5所示。

圖5 部分有效玩家id
原始數據記錄的是完整對局信息,包括玩家信息、手牌信息、叫分信息、出牌信息,而本文針對競技二打一博弈玩家風格問題只需要摘取其中的部分有效信息,避免數據集中的無效數據過多,導致模型訓練效果與預期產生偏差。本實驗將所有有效玩家的對局數據信息經過以下方式進行處理,成為可供后續網絡模型輸入的數據集形式:
1) 讀取高水平玩家文件,得到高水平玩家字段;
2) 讀入原始數據中每一局的對局信息;
3) 通過SOH字符分割開一場對局中每個階段的信息;
4) 通過STX字符分割開每個階段中每位玩家的具體操作信息;
5) 依次讀入叫分階段每位玩家叫分信息,最后一位叫分玩家的位置記為地主;
6) 判斷第一個出牌的玩家位置是否是5)操作的記錄值,若是,則為有效對局,進行下一步操作;
7) 讀取每位玩家的叫牌信息,并判斷獲勝玩家是否為高水平玩家,若不是則直接舍棄;反之,若獲勝玩家為地主,則把地主的叫牌數據標記為1,若獲勝玩家為農民,則農民叫牌數據的標記根據叫牌動作進行標記——叫牌標記為1,不叫牌標記為0。
8) 由7)中處理后的數據存在相同叫牌情況下的不同叫牌動作,為了避免模型訓練震蕩,本文考慮統計相同叫牌局面和相同手牌下的標記之和與總標記數量的比值大小決定當前手牌的叫牌動作,避免訓練震蕩。具體決定方式為:若比值大于0.5,則在當前叫牌局面和手牌下,標記為1;否則,標記為0。
按照上述方法,從500余萬條原始數據中篩選出約10萬條用于訓練模型的基準叫牌數據。具體數據保留格式如圖6所示,以逗號進行分段:第一段數據代表叫牌階段——0表示叫分階段,1代表搶地主階段;第二段數據代表當前叫牌值大小——共有0,1,2共3個值;第三段數據代表玩家手牌;第四段數據代表該條數據的標簽值,也就是應該采取的叫牌動作。

圖6 部分基準叫牌數據保存格式
將篩選出的數據劃分為約8萬條數據的訓練集和約2萬條數據的測試集,使用第1章設計的模型進行訓練,訓練過程如算法1所示。
算法1
輸入:叫牌數據集D,待訓練的叫牌模型M,學習率r
輸出:訓練好的叫牌模型M′
將D拆分成訓練集X和測試集C
測試集準確率acc ← 0.0
for 訓練輪數 = 0,1,2,…,100:
將X隨機拆分成NX個大小為B的小批量數據集DX
采取正確叫牌動作的樣本計數tx← 0
for 小批量數據集編號xi= 0,1,2,…,NX:
用CrossEntroyLoss計算DX[xi]的損失值,更新M的網絡參數
tx←tx+neqneq:對于DX[xi]中數據M給出的輸出與其標簽值一致的數量
將C隨機拆分成NC個大小為B的小批量數據集DC
采取正確叫牌動作的樣本計數ct← 0
for 小批量數據集編號ci= 0,1,2,…,NC:
tc←tc+neqneq:對于DC[ci]中數據M給出的輸出與其標簽值一致的數量
當前準確率acc_tmp←tc/C中樣本個數
ifacc_tmp>acc:
M′ ←M
acc←acc_tmp
本文所使用的系統環境配置如表3所示。

表3 硬件和軟件配置
訓練過程中所使用的優化器為Adam優化器,損失函數使用CrossEntroyLoss函數,學習率設置為1×10-4,dropout層的p值設置為0.5。
3.2.1基準叫牌模型訓練效果與分析
使用第2章得到的基準叫牌數據進行100輪訓練后,模型在訓練集和測試集上損失函數值和準確率變化如圖7和圖8所示。

圖7 模型在訓練集和測試集上損失函數值的變化

圖8 模型在訓練集和測試集上準確率的變化
在前7輪訓練中,損失函數值下降,但準確率卻幾乎不變,本文認為是標簽為叫牌的樣本數據在一開始的loss中占據了主導優勢,使得模型在此時錯誤學習到兩類數據的比例結構,導致了上述異常狀況的出現。
在后續的訓練中,模型對叫牌類型的樣本擬合達到一定程度后,該類樣本對loss的貢獻度相較于不叫牌的樣本的影響降低,模型開始對不叫牌的樣本進行擬合,最終達到收斂狀態。
同時,本文也對引入模型的強力牌特征和叫牌情況特征分別進行消融實驗,得到如圖9和圖10的結果。實驗結果表明2種特征對于模型性能的提升均有較大提升,驗證了本文引入的這2種特征的有效性。

圖9 模型在去除部分特征后損失函數值的變化

圖10 模型在去除部分特征后準確率的變化
3.2.2玩家叫牌風格劃分結果與分析
叫牌風格劃分所用的數據來自另一份真實玩家數據,將這部分數據中的叫牌信息按照玩家id分別進行存儲。為保證叫牌風格劃分的準確性,本實驗剔除了少于10次叫牌動作玩家的樣本數據。
圖11的最后2列分別展示了在相同情況下某玩家的叫牌記錄和模型給出的基準叫牌動作。根據1.3節提出的叫牌風格劃分方法,計算得到該玩家對手牌的高估程度為0.500 004,對叫牌動作的偏離程度為0.738 548,查表1可知該玩家的叫牌風格屬于激進非理性型。

圖11 相同叫牌情況下某玩家的叫牌記錄和基準叫牌動作
觀察圖11可以發現,數據項1中無任何強力牌特征,數據項3、7、12中存在大量不能構成連續牌特征的點數牌,但玩家仍采取叫牌的動作,以此判斷該玩家在叫牌過程中比較激進隨意,可以認為其叫牌風格屬于激進非理性型。由此認為本文設計的玩家叫牌風格劃分方法對于高估手牌的部分能夠正確判別,具有一定的可行性。
為了提高自身在對局中的收益,本文以競技二打一的玩家叫牌風格作為切入點,研究了一種融合深度學習卷積神經網絡和統計學方法的玩家叫牌風格劃分方法,該方法能夠對玩家的叫牌風格進行正確劃分。
在基準叫牌模型訓練開始時出現準確率不能提升的問題,筆者認為可能是樣本比例不均衡造成的,如果能夠找到一種合適的平衡樣本比例的算法,會使模型的性能得到進一步提升。
本文訓練出具有較高準確率的叫分基準模型,并能依據叫分基準模型對玩家的叫牌風格進行分類劃分,未來將會設計帶有多階段叫牌博弈算法接口的平臺對本文的方法增加對局收益的效果進行驗證。