網易伏羲GDC分享:在回合製紙牌遊戲中應用 AlphaZero 開發 AI

遊資網發表於2021-07-27
北京時間7月21日,在遊戲開發者大會(GDC2021)上,來自網易伏羲的雷子涵分享了在回合製紙牌遊戲中應用 AlphaZero 開發AI。

網易伏羲實驗室在人工智慧領域積極探索,推出了遊戲行業人工智慧解決方案,橫跨AI反外掛、AI競技機器人、AI 對戰匹配以及 AI 劇情動畫製作四大AI能力,實現了AI 技術在遊戲行業的新突破。本次分享的內容就是源於AI卡牌競技機器人在遊戲中的運用經驗。

以下為分享實錄:

我們在天諭手遊的諭戲遊戲中使用了 AlphaZero 來製作 AI。本次演講主要分為以下4個部分。第一部分介紹AlphaZero的基本思想和核心演算法Monte Carlo Tree Search,簡稱MCTS。第二部分是關於天諭手遊中卡牌遊戲諭戲的介紹。第三部分介紹我們如何在諭戲上應用alphazero來產生AI。最後展示我們取得的結果和展望未來的工作。

網易伏羲GDC分享:在回合製紙牌遊戲中應用 AlphaZero 開發 AI

一、AlphaZero 和 MCTS

什麼是AlphaZero?

圍棋一直被視為人工智慧經典遊戲中最具挑戰性的遊戲。但是 AlphaGo 在 2016 年擊敗了世界冠軍李世石。 AlphaGo 是第一個擊敗圍棋人類世界冠軍的計算機程式,可以說是當時最強的圍棋選手。

AlphaGo有如此高的成就和榮譽,那AlphaZero為什麼會誕生呢?

因為在階段性訓練和網路數量方面,AlphaGo 的系統相當複雜。一年後,其作者 DeepMind 對其進行了改進,提出了一種新的圍棋 AI: AlphaGo Zero,它是 AlphaGo 的簡化和增強版本。由於演算法的通用性和圍棋知識較少,DeepMind 又將演算法遷移到國際象棋和日本將棋,並推出了新的 AI:AlphaZero。

網易伏羲GDC分享:在回合製紙牌遊戲中應用 AlphaZero 開發 AI

簡單說完alpha系列的演化,我們來看看它的演算法。由於演算法細節繁瑣複雜,這裡只做簡單的科普。AlphaGo的核心演算法為蒙特卡羅樹搜尋與改進。蒙特卡羅樹搜尋是演算法的核心。它主要通過使用隨機抽樣來解決確定性問題。 如下圖所示,分為選擇,擴充套件,模擬與反向傳播4個步驟。每當我們需要做決策時,我們都可以通過這棵樹得到蒙特卡洛演算法下的最優策略。當然,它不一定是真正的最優策略。

網易伏羲GDC分享:在回合製紙牌遊戲中應用 AlphaZero 開發 AI

原本的 MCTS 看起來很笨,而且計算量很大。 AlphaGo 對其進行了很多改進。它使用深度神經網路進行評估而不是隨機搜尋來評估情況,如下圖所示,Alphago中有3個神經網路;同時,DeepMind 還提出了 PUCT 演算法,引入了神經網路的直覺,引導 MCTS 在搜尋時進行探索,大大提高了搜尋效率。由於引入了神經網路,AlphaGo 變得可學習,並且可以通過訓練神經網路不斷提升自身實力。

網易伏羲GDC分享:在回合製紙牌遊戲中應用 AlphaZero 開發 AI

AlphaGo 的訓練過程分為兩個步驟:

第一步,收集大量人類專家資料進行監督學習,學習人類思維。經過訓練,神經網路已經達到了業餘水平。

第二步,轉化為強化學習。神經網路的資料來自自我對弈。通過不斷的強化訓練,AlphaGo的水平不斷提升,最終達到了超越人類的水平。

2. 從AlphaGO到AlphaGo Zero

網易伏羲GDC分享:在回合製紙牌遊戲中應用 AlphaZero 開發 AI

AlphaGo Zero 不使用人類專家資料進行監督學習。將訓練簡化為一個階段,從頭開始自我對弈和強化學習。基於內在的變化,AlphaGo Zero 的實力相比 AlphaGo 有了很大的提升,如上圖所示。經過3天的學習,零號AlphaGo以100:0的比分超越了AlphaGo Lee的實力,21天后達到了AlphaGo Master的水平,並在40天內超越了之前的所有版本。

二、諭戲介紹

網易伏羲GDC分享:在回合製紙牌遊戲中應用 AlphaZero 開發 AI

天諭手遊是網易遊戲開發的一款大型多人線上角色扮演遊戲。自2021年1月8日上線以來,它在中國是一款非常成功的遊戲。

網易伏羲GDC分享:在回合製紙牌遊戲中應用 AlphaZero 開發 AI

諭戲是天諭手遊中的回合製紙牌玩法,目的是讓玩家熟悉世界觀背景,放鬆心情。諭戲的玩法是兩個玩家之間的1V1對戰。有3種不同大小的棋盤,分別是3乘3、4乘4和6乘4。諭戲有200多張卡片,包括人物卡和法術卡。沒有比賽和排行榜。玩家只能選擇與 AI 或他們的朋友對戰。當玩家需要測試新套牌的強度或者沒有朋友可以對戰時,我們的AI就會出場。

網易伏羲GDC分享:在回合製紙牌遊戲中應用 AlphaZero 開發 AI

這是遊戲中諭戲具體場景的截圖,圖片資訊量很大。

中間是一個3乘3場地。場地上有人物卡和天氣。藍色的代表我們自己的角色,紅色的代表敵人的角色。卡的具體資訊將在後面詳細說明。

左上角和右下角是雙方玩家的墳墓。當角色卡死亡或使用法術卡時,他們會進入墳墓。

左下方和右上方是卡組,玩家將帶著自己的卡組進入遊戲。

上面和下面是手牌,初始手牌是從卡組中隨機抽取的(數量根據場地的大小而變化)。

遊戲過程類似於巫師的昆特牌。玩家不會每輪都從牌組中抽牌。一般每回合打一張手牌,用完所有手牌後遊戲結束。

棋盤兩邊是2位玩家的點數和金錢,最右邊是結束回合按鈕。

左下角的換卡按鈕,後面會詳細說明。

網易伏羲GDC分享:在回合製紙牌遊戲中應用 AlphaZero 開發 AI

每張卡都有自己的頭銜和效果,很多效果都是在一些固定的頭銜上觸發的。

對於人物卡,左上角也有一個初始點。如果當前點低於初始點,則顯示為紅色,可被治癒;如果它更高,它將顯示為綠色。人物卡還有一些臨時的buff標誌,比如當前技能可用,這個人物有多少錢等等。

三.AlphaZero在諭戲中的應用

接下來,我們將詳細介紹我們是如何在諭戲上應用alphazero來生產AI的。

網易伏羲GDC分享:在回合製紙牌遊戲中應用 AlphaZero 開發 AI

我們使用的深度神經網路的結構如上圖所示。輸入分為場地輸入和向量輸入。場地輸入主要是場地上的資訊。它是一個 3 維張量。在resnet和cnn之後,使用flatten操作將其轉化為向量。向量輸入通過全連線網路後直接變成向量。然後將兩者拼接在一起,通過全連線得到三個輸出,分別是當前情況的卡片id、位置和值估計。

網易伏羲GDC分享:在回合製紙牌遊戲中應用 AlphaZero 開發 AI

棋盤輸入的前 2 個維度是棋盤的大小。例如,3乘3板的輸入大小是3乘3乘n。深度 n 是一些人工提取的特徵,而不是直接使用卡片 id。這樣做的好處是泛化性更好,神經網路更容易學習。這些功能分為 4 類。天氣、卡片基本屬性、卡片名稱和卡片效果。天氣包括霧、雷、冰、侵蝕。卡牌基本屬性包括陣營、點數、護甲、金錢、技能冷卻等。頭銜和效果有很多維度,最終總深度在90左右。

網易伏羲GDC分享:在回合製紙牌遊戲中應用 AlphaZero 開發 AI

向量輸入不使用特徵,因為它不如場地輸入重要。它直接以卡片的id作為索引,卡片的數量作為值。主要包括4個部分,自己的手牌,牌組,墳墓和敵人的墳墓。敵人的手牌和牌組不作為輸入,因為它們是不可見的。我們將這 4 個部分拼接成一個向量作為輸入。例如,我手上有 2 張 ID 為 1 的卡和 1 張 ID 分別為 0、2、5 和 8 的卡,如圖所示。

網易伏羲GDC分享:在回合製紙牌遊戲中應用 AlphaZero 開發 AI

輸出時,我們使用合法掩碼來確保輸出動作是合法的。

輸出動作主要分為兩步。首先,輸出卡的id。合法掩碼保證這個id必須是手上可以使用的卡片。然後將倒數第二層和選中卡片的id拼接輸出合法位置。最後將這張牌打到指定位置。此外,我們還將結束回合按鈕編碼到卡號中作為卡號0。選擇此操作將結束本回合,否則我們將繼續出下一張卡。因為諭戲類似於巫師的昆特牌,一般來說每輪最多隻能使用一張牌,但由牌產生的衍生牌,這裡稱為虛空牌,不受此限制。對於神經網路難以處理的不規則的情況,我們使用規則來實現後續的選擇。

最後,模型也會輸出一個值作為當前情況的估計。

網易伏羲GDC分享:在回合製紙牌遊戲中應用 AlphaZero 開發 AI

在諭戲中,我們的AI會以NPC的身份與玩家對戰,所以使用的套牌是固定的。我們有50多套固定卡組,每個卡組都由一個獨特的模型控制。訓練時,從遊戲中隨機抽取2套牌進行對戰,可以是相同的。例如,如果第 3 副和第 7 副牌隨機對戰,它們將分別呼叫模型 3 和模型 7,並且該遊戲的資料將僅用於訓練模型 3 和模型 7。

當然,我們同時擁有數千個遊戲進行訓練。並且我們在訓練期間沒有使用卡片交換操作。

我們的第一次訓練使用了大約 100 個 CPU 和 8 個 GPU,耗時一個月。

之後,更新迭代使用了 50 個 CPU 和 4 個 GPU,耗時一週。

因為線上使用時玩家的出牌速度較慢,所以4個CPU就可以滿足要求。

網易伏羲GDC分享:在回合製紙牌遊戲中應用 AlphaZero 開發 AI

我們知道圍棋、國際象棋和將棋是具有完整資訊的遊戲。在這類遊戲中搜尋非常容易。但是在不知道對方手牌的情況下在諭戲中搜尋呢?

在訓練時,我們直接讓對手給一個操作,並用這個操作來搜尋對手。

比如剛才的模型3對戰模型7。現在輪到模型3出牌了,模型3手上有兩張id為1和2的牌。它不知道哪個卡更好。因此,模型3先打出一張id為1的牌,然後根據當前情況讓模型7出一張牌,然後模型3再打出一張id為2的牌,直到遊戲結束。而模型3也可以先是牌2,然後是牌1。以上過程都是模擬搜尋。搜尋結果可用後,模型 3 根據概率選擇更好的策略。這些功能的實現需要依賴一個可以生成和載入快照的遊戲環境。線上時,我們不搜尋手牌,因為我們不能讓對手採取行動。這也是上網時資源佔用少的原因。

但是我們會搜尋換卡。在每一輪中,都有機會將手牌與牌組中的兩張牌中的一張交換。

網易伏羲GDC分享:在回合製紙牌遊戲中應用 AlphaZero 開發 AI

因為換卡只和自己有關,所以我們可以遍歷它所有可能的結果。然後將其輸入網路,只取值輸出,選擇換卡操作後值最大的結果。

三、我們的成就和未來的工作

視訊連結:https://v.qq.com/x/page/z326224991y.html

我們來看一場對抗AI的遊戲。在這個遊戲中,AI可以巧妙地利用螃蟹的效果互相吃掉,積分翻倍。
網易伏羲GDC分享:在回合製紙牌遊戲中應用 AlphaZero 開發 AI

在遊戲開發過程中訓練AI不僅可以發現一些會報錯的bug,還可以發現設計的bug。如以上兩張圖片所示。左邊的一張牌具有可以回收3個棋盤上的錢幣並轉化為手牌的效果。另一張卡的效果是使用錢幣時少使用2個錢幣。但是我們發現了一個神奇的BUG,回收幣也出現了少用兩個幣的效果。結果,棋盤上只有一枚錢幣,卻拿到了三張錢幣卡。

右圖是一張牌在霧中吃另一張牌的結果。霧的效果是卡點減半。然後我們的新卡一放下就從6分減半到3分。然後在迷霧中吃掉8分的牌,得到11分。但正確的情況是先吃到14點,減半到7點

網易伏羲GDC分享:在回合製紙牌遊戲中應用 AlphaZero 開發 AI

不僅能發現BUG,我們的 AI 還可以幫助開發人員實現遊戲平衡。在遊戲結束時,第一個玩家將隨機獲得一個骰子的獎勵積分。經過AI訓練,我們發現3乘3場地的先手玩家有優勢,但在6乘4場地有劣勢。所以以後我們在遊戲中建立諭戲房間的時候,可以設定一個規則來取消這個骰子獎勵。

我們上線後,AI的呼叫量一直處於較高水平。AI剛開始的時候勝率是60多,後來隨著玩家熟練度和套牌的增多,降到了50。經過我們的迭代,它變成了 65 以上。

網易伏羲GDC分享:在回合製紙牌遊戲中應用 AlphaZero 開發 AI

未來,我們希望 AI 能夠預測玩家的手牌和套牌。

隨著卡片的更新,模型也需要手動更新,否則無法適應新的卡片。我們將使其自動化。

我們還將 AlphaZero 應用於其他回合制遊戲,例如麻將和五子棋。

相關文章