劉 溜,張小川,彭麗蓉,田 震,萬家強,任 越
(1.重慶理工大學 兩江人工智能學院, 重慶 401135; 2.重慶理工大學 人工智能系統(tǒng)研究所, 重慶 400054;3.重慶工業(yè)職業(yè)技術學院 人工智能與大數(shù)據(jù)學院, 重慶 401120;4.重慶市南開兩江中學校, 重慶 401135)
在人工智能的發(fā)展歷程中,人們一直嘗試賦予計算機“思考”的能力。為此,科學家嘗試通過給計算機編程、設計博弈系統(tǒng)、運行棋類博弈游戲,期望實現(xiàn)計算機模仿人類下棋[1]。那么,如何構建計算機博弈系統(tǒng)呢?首先,設計合適的數(shù)據(jù)結構,以表達棋局局面信息;其次,數(shù)字化規(guī)則,設計合法的落子著法;最后,構造一個全局性的博弈策略,以期發(fā)現(xiàn)能使己方收益最大化的著法。
計算機博弈系統(tǒng)可以通過構造博弈樹來完成博弈行為。19世紀50年代,香農(nóng)提出了計算機博弈的核心思想:通過構建完整的博弈樹,搜索當前局面的最佳著法[2]。但在實際博弈過程中,卻難以構造一顆理想的博弈樹。主要原因是對于博弈中的某個局面,可行的著法數(shù)通常較大,而且隨著博弈進程推進,這個數(shù)字還會呈指數(shù)級增加。而發(fā)現(xiàn)能決定勝負的著法,理論上來講,最好就是窮盡所有可行著法。在強實時、高對抗的博弈進程中,計算資源的有限性決定了窮舉法基本是不可能的方法。
傳統(tǒng)蒙特卡洛樹搜索摒棄窮舉思想,結合了模擬采樣的隨機性和樹搜索的準確性,對各分支的探索權重進行評估,使計算資源集中在重要分支上。但此算法采用隨機走子策略模擬對局,在沒有被訪問足夠多的次數(shù)的情況下,不能夠?qū)﹃P鍵樹節(jié)點進行可靠評估。導致此算法效率很低,一定時間內(nèi)即使是在中等復雜度的博弈中也難以給出優(yōu)質(zhì)決策。
為了克服上述缺點,本文提出通過結合深度神經(jīng)網(wǎng)絡改進蒙特卡洛樹搜索算法,設計了一種五子棋計算機博弈深度強化學習算法;其中,通過神經(jīng)網(wǎng)絡擬合局面評估函數(shù)和落子概率分布的方法,引導蒙特卡洛樹搜索方向,提升搜索速度;同時,基于自博弈強化學習訓練框架,實現(xiàn)了神經(jīng)網(wǎng)絡的迭代優(yōu)化,加強搜索強度。
蒙特卡洛是一種統(tǒng)計實驗方法,利用事件發(fā)生頻率近似事件發(fā)生概率。蒙特卡洛樹搜索通過蒙特卡洛方法逐步遍歷和擴展博弈樹:樹中節(jié)點的遍歷是基于對局面估值的貪心利用;樹外節(jié)點的擴展則是通過隨機策略進行多次快速走子模擬,用勝負結果近似局面評估[3]。如圖1所示,蒙特卡洛樹搜索算法共有4個步驟:選擇、擴展、模擬、回溯。
圖1 蒙特卡洛樹搜索的四步圖
步驟1選擇:以當前局面為根節(jié)點,完成從根節(jié)點到達葉子節(jié)點之間的路徑選擇。通過引入上限置信區(qū)間算法(UCB),進行節(jié)點選擇的同時考慮平衡探索次數(shù)和局面估值[4]。
(1)
式中:Vn為節(jié)點估值,Tn為節(jié)點探索次數(shù),C為平衡因子,C越大則越偏向探索次數(shù)少的節(jié)點,反之則偏向局面價值高的已探索節(jié)點。
步驟2擴展:當?shù)竭_某個未被探索過的葉子節(jié)點時,列舉其下所有可行著法。否則進入模擬階段。
步驟3模擬:采用隨機策略,模擬雙方對弈直到游戲結束產(chǎn)生勝負結果。
步驟4回溯:將勝負結果從葉子節(jié)點層層向上回溯到根節(jié)點,更新途經(jīng)節(jié)點的探索次數(shù)以及估值。
結合深度神經(jīng)網(wǎng)絡和蒙特卡洛樹搜索,提出一種自博弈學習方式,從零開始學習五子棋。
人類博弈時,首先需評估局面預測己方勝負,其次選擇有利落子。本文模擬人類思考過程,構建策略價值網(wǎng)絡返回可行落子概率以及局面評分。
2.1.1策略價值網(wǎng)絡的輸入特征及結構設計
局面表示是計算機理解博弈過程的先決條件。在深度學習理論中,這一步也被稱為特征提取。有學者將人類知識融入特征提取中,比如DeepMind曾融入圍棋中“氣”“征子”等概念,幫助AlphaGo理解圍棋[5],卻最后掣肘了AlphaGo棋力提升。
提取了落子分布以及決策方信息。如圖2所示,使用矩陣表示棋盤,用1代表此位置已有落子,0表示暫無落子,全1或者全0的棋盤代表此時輪到執(zhí)黑方或執(zhí)白方落子。
圖2 棋局信息表示實例
網(wǎng)絡起始為3層公共卷積網(wǎng)絡,分別使用32、64、128個3×3的卷積核,均使用ReLU激活函數(shù),如圖3所示。隨后分成policy和value 2個輸出:policy輸出端,先用4個1×1的卷積核降維,緊接一個全連接層,最終使用softmax函數(shù)輸出棋盤上每個位置的落子概率;value輸出端,先用2個1×1的卷積核進行降維,再連續(xù)接2個全連接層,最后使用tanh函數(shù)輸出[-1,1]之間的局面評分。
圖3 策略價值網(wǎng)絡結構設計框圖
2.1.2策略價值網(wǎng)絡的損失函數(shù)
策略價值網(wǎng)絡的輸入是棋局描述s,輸出是落子概率估計p以及勝負估計v。自博弈的過程中,會探索各種局面s、實際落子概率π以及勝負結果z,收集(s,π,z)數(shù)據(jù)用于后面的網(wǎng)絡更新。訓練目標是讓策略價值網(wǎng)絡輸出的p和v更加接近經(jīng)過蒙特卡洛樹搜索采樣模擬后得到的π和z[6]。如式(2)所示,本文將聯(lián)合損失作為該網(wǎng)絡優(yōu)化的目標函數(shù)。
lv-z代表局面勝負估計v和實際蒙特卡洛樹搜索返回值z的均方誤差,根據(jù)策略梯度下降算法,需要最小化目標策略的評估函數(shù)J(πθ)的相反數(shù)-J(πθ),即p和π的交叉熵誤差,其中θ表示策略價值網(wǎng)絡參數(shù)。
l=lv-z-J(πθ)=(z-v)2-πTlogp
(2)
為了緩解網(wǎng)絡過擬合的問題,考慮引入正則化。引起過擬合的主要原因在于模型復雜,參數(shù)過多而正則化的基本思想是引入懲罰項以減少參數(shù)量級。
最終的損失函數(shù)為:
(3)
人類通過推演落子后的棋局變化評估落子價值。而蒙特卡洛樹搜索可憑借強大的采樣能力,用模擬統(tǒng)計結果近似落子概率,達到棋局推演的目的。如圖4所示,可以將蒙特卡洛樹搜索作為一個策略提升器,校準策略價值網(wǎng)絡輸出的落子概率。
圖4 策略提升器—蒙特卡洛樹搜索圖
一局完整的自博弈,從某一棋盤狀態(tài)s1,經(jīng)歷s2,s3,…一直到結束狀態(tài)sT。每一個st下,都會執(zhí)行一次完整的蒙特卡洛樹搜索,搜索過程中使用策略價值網(wǎng)絡進行輔助,最終返回st下不同位置的落子概率πt,自博弈的真實走棋根據(jù)落子策略πt決定。到達sT后,得到這一局結果z,一般是-1、0、1之一,分別對應輸、平和贏。對于自博弈的每一步,都要保存一個三元組(st,πt,zt)作為一個訓練樣本。自博弈中最關鍵的一步就是在st下,如何執(zhí)行蒙特卡洛樹搜索,并返回不同位置的落子概率。改進的蒙特卡洛樹搜索具體分為以下3個階段:選擇階段、擴展模擬階段、回溯階段。通過反復執(zhí)行這3個步驟,逐漸建立一棵樹,然后根據(jù)樹中存儲的統(tǒng)計信息得到落子的概率分布。
搜索樹中的節(jié)點記錄棋局狀態(tài),節(jié)點訪問次數(shù)N(s,a)表示在狀態(tài)s下采取著a法的頻率;累計行動價值W(s,a)表示(s,a)局面動作在采樣模擬中獲得的總收益;平均行動價值Q(s,a)是W(s,a)與N(s,a)的比值;先驗概率P(s,a)由策略價值網(wǎng)絡給出,表示對落子概率的估計[7]。
2.2.1節(jié)點選擇
節(jié)點選擇是指從合法動作集中選擇一個著法。關于節(jié)點選擇策略,受UCB式(1)的啟發(fā),設置變量U(s,a)用以平衡節(jié)點的探索和利用。
(4)
式(4)包括兩部分:Q(s,a)代表著法a在s下獲得的平均價值,是對局面評分貪心利用;P(s,a)是策略價值網(wǎng)絡給的著法指導;公式最右邊是計算在s下選擇a的頻率比重;cquct是超參數(shù),用來調(diào)整探索和利用的比例。策略開始會偏向選擇次數(shù)少的節(jié)點,這是對探索的鼓勵避免錯過價值高的著法,隨著模擬次數(shù)越來越多,策略會偏向那些Q(s,a)高的節(jié)點,將計算資源集中在最佳探索分支上。
2.2.2節(jié)點擴展和模擬
依據(jù)節(jié)點選擇策略,不斷進行樹內(nèi)節(jié)點選擇,直到遇到一個從未探索過的葉子節(jié)點sl。如果sl是終止節(jié)點則直接進入節(jié)點回溯階段,否則需要將sl下所有的分支節(jié)點添加到搜索樹中,并分別保存采取落子動作后進入的新局面。
同時策略價值網(wǎng)絡會給出sl下的每個合法落子概率pl以及局面評分vl,pl存儲在sl到各個分支節(jié)點的邊中。由于各分支節(jié)點都是新加入到搜索樹中,需要將對應邊中的其他變量N(s,b),W(s,b),Q(s,b)均作初始化處理,隨后進行隨機模擬直到游戲結束。
2.2.3節(jié)點回溯
此階段完成從葉子節(jié)點sl到根節(jié)點s0路徑上的參數(shù)更新。這是蒙特卡洛樹搜索能集中計算資源于重要分支的原因。假設sl的父節(jié)點為st,st到sl之間的落子動作為dt,策略價值網(wǎng)絡給sl的評分為vt。則從sl回溯到st的參數(shù)更新如式(5)—(7)所示。
如果sl是終止節(jié)點,vt將不會使用策略價值網(wǎng)絡給出的勝率評分值,直接使用勝負結果值:-1、0、1之一;在回溯的過程中,每經(jīng)過一個節(jié)點,vt值要進行取反操作,因為博弈樹中模擬的是雙方博弈的過程,一方的收益對于另外一方則是損失。
W(st,dt)=E(st,dt)+vt
(5)
N(st,dt)=N(st,dt)+1
(6)
(7)
2.2.4實際落子選擇
將當前局面視為搜索樹的根節(jié)點s0,經(jīng)過選擇、擴展和模擬、回溯,結束一次蒙特卡洛樹搜索。而每一次真實落子需要根據(jù)經(jīng)過多次蒙特卡洛樹搜索,這也是自博弈特別消耗計算資源的原因。多次采樣之后,根節(jié)點s0下所有邊存儲的信息都得到了更新,利用這些信息可以計算s0下的落子概率。如式(8)所示,在s0下采取落子動作a的概率為:
(8)
受模擬退火算法的啟發(fā),設置溫度參數(shù)τ控制蒙特卡洛樹搜索收斂到重要分支。最開始τ設置為1,此時落子概率分布較均勻,偏向選擇訪問次數(shù)少的落子動作;隨著自博弈持續(xù)進行,τ值逐漸減小為0,此時訪問次數(shù)多的落子更加容易被選擇。最后選擇π(a|s0)最大的對應著法a當作實際落子動作。
本實驗平臺為Windows 10,運行內(nèi)存為 8.0 GB,顯卡配置為NVIDIA GeForce GTX 1050Ti,主體代碼使用python語言實現(xiàn),神經(jīng)網(wǎng)絡搭建使用pytorch深度學習開發(fā)框架。
為了使實驗結果更加可信,本文引入另外2種經(jīng)典搜索算法用作效果對照。
極大極小值是一種適用雙人零和博弈的搜索思想。核心是分別站在各博弈方進行搜索,其中一方在可行著法中選擇自身利益最大化的落子著法,而對方就要盡可能阻止對方選擇該最佳落子[8]。一般極大極小值算法需要通過構造一個局面評估函數(shù),計算出對己方最大、對方最小的著法。分析發(fā)現(xiàn),局面評估函數(shù)常常與棋子數(shù)、棋子分布及其關鍵棋型3個因素密切相關[9]。本文設計局面評估函數(shù)時,先嘗試對不同棋型賦予一個先驗權值,再根據(jù)棋子位置,賦予另一個先驗值[10]。式(8)中x,y,z分別表示處于棋盤上“核”“邊”“角”位置上雙方棋子數(shù)目之差,而N1、N2、N3分別表示“活四”“沖四”“活三”3種關鍵棋型數(shù)目,如圖5所示。
圖5 五子棋重要棋型以及位置分布示意圖
f(x,y,z,Ni=1,2,3)=3x+2y+z+100N1+50N2+20N3
(9)
Alpha-Beta剪枝算法本質(zhì)上是一種對極大極小值算法的優(yōu)化。其核心思想是記錄中間節(jié)點Min的最小值α,節(jié)點Max的最大值β及其局面估計值Value,以達到對搜索樹裁剪的目的[11]。在Alpha-Beta算法中,通常將對Max節(jié)點層的剪枝稱為Alpha剪枝,對Min層的裁剪稱為Beta剪枝。如圖6所示,無論采用哪種剪枝,其核心都是需要比較兄弟節(jié)點Value值、父節(jié)點α值或者β值。
圖6 Alpha-Beta剪枝過程示意圖
從理論上講,在棋盤中任意一個空白位置都是合理的落子選擇點。但是,在五子棋博弈中,落子會相對集中于某個區(qū)域,因此,區(qū)域內(nèi)的搜索價值更大。為此,本文引入變尺度思想,將棋盤離散化不同價值區(qū)域,對不同區(qū)域再賦予Alpha-Beta剪枝搜索的不同深度值。
本文用搜索效率和博弈水平2個標準,綜合比較了極大極小值搜索,Alpha-Beta剪枝,傳統(tǒng)蒙特以及改進蒙特卡洛樹搜索4種算法的性能[12]。表1展示了實驗中用到的具體算法類型及重要參數(shù)。
同時本文為了驗證搜索空間大小對搜索算法的影響,分別設計9×9、11×11、15×15三種尺寸的棋盤,作為驗證環(huán)境。
表1 算法類型及重要參數(shù)
構建和遍歷一棵搜索樹所耗費的時間即平均落子時間,是體現(xiàn)算法搜索效率的重要指標[13-14]。如圖7所示,各算法在不同棋盤上,平均落子時間隨對弈步數(shù)的變化情況。
相較于經(jīng)典搜索算法,改進后的蒙特卡洛樹搜索在搜索效率上有了大幅度的提升,平均落子時間僅僅只有極大極小值算法的1/196,Alpha-Beta剪枝算法的1/55,傳統(tǒng)蒙特卡洛樹搜索的1/28。此外這種改進算法在不同大小的棋盤下的落子決策時間無明顯變化,說明其具有相當?shù)聂敯粜浴?/p>
圖7 各算法在不同棋盤上平均落子時間隨對弈步數(shù)的變化曲線
為了比較各算法間的博弈水平,設計五子棋對局實驗。實驗中任意2種算法之間均設置100局比賽,統(tǒng)計各算法的勝負平數(shù)據(jù),結果如圖8所示。對局實驗中采用的是比賽標準15×15的棋盤。
當極大極小值算法并未使用局面評估函數(shù),而是將博弈樹完全展開至游戲結束。與其他經(jīng)典搜索算法相比,對局平均不敗率達到了97%,但是勝率卻僅有約36%。這是由于極大極小值算法的核心是以避免對手獲取最大收益,而不是以自己取勝為目標。
圖8 算法間對局實驗結果統(tǒng)計
對于Alpha-Beta剪枝算法,實驗設置兩組搜索深度用于對照,結果顯示淺加搜索深度并不能顯著提高搜索水平。與其他經(jīng)典搜索算法相比,搜索深度加1,勝率僅僅提高了2%。因為基于人類經(jīng)驗設計的評估函數(shù),并不能保證對每一個局面的評估都來源于真實的勝負反饋。對弈越早期,這種評估上的誤差就越大,而且誤差還帶有積累效應。
在傳統(tǒng)蒙特卡洛樹搜索的對局中,為了驗證模擬次數(shù)對其搜索水平的影響,實驗設置1 000次,2 000次,3 000次3組參數(shù)。通過觀察實驗結果,發(fā)現(xiàn)模擬次數(shù)的增加同樣不能顯著提高其搜索水平。模擬次數(shù)增加1 000次,平均勝率增加不到1%,甚至出現(xiàn)增加模擬次數(shù)但是勝率反而下降的情況。一定程度上說明了模擬中采用隨機落子策略,缺乏先驗指導很難收斂到重要分支。
改進的蒙特卡洛樹搜索在勝率上均取得了明顯的優(yōu)勢。實驗結果顯示,與極大極小值算法、Alpha-Beta剪枝算法、傳統(tǒng)蒙特卡洛樹搜索算法相比,平均勝率分別達到了75%、84%、87%。
以五子棋為研究載體,分析了經(jīng)典的蒙特卡洛搜索算法的缺點。針對這些缺點,設計出一種結合策略價值網(wǎng)絡的蒙特卡洛樹搜索,以深度神經(jīng)網(wǎng)絡擬合局面評估函數(shù),用先驗落子概率指導蒙特卡洛搜索,形成一種先驗知識支持的自博弈方法。與傳統(tǒng)的搜索算法相比,改進后的方法無論是在搜索效率,還是博弈水平上,都有較大程度的提高。