2022N.GAME網易游戲開發者峰會于「4月18日-4月21日」舉辦,本屆峰會圍繞全新主題“未來已來 The Future is Now”,共設置創意趨勢場、技術驅動場、藝術打磨場以及價值探索場四個場次,邀請了20位海內外重磅嘉賓共享行業研發經驗、前沿研究成果和未來發展趨勢。
今天的干貨來自技術驅動場的嘉賓曾廣俊,他是網易互娛AI Lab的技術主管。

以下是嘉賓分享實錄:(部分刪減與調整)
大家好。非常高興來到N.GAME峰會跟大家分享一下強化學習在互娛游戲的落地。
互娛AI Lab成立于2017年底,主要是要將3D、CV、RL、NLP和語音技術落地到游戲當中,解決游戲的痛點問題。今天我們來講一下強化學習是什么?強化學習可以在游戲里面做些什么?最后展望一下強化學習除了在游戲當中,還能在其他領域做出什么樣的應用。
一、強化學習是什么?

假如現在我們要訓練一條小狗做出坐下的這樣一個動作,我們可能會做出一個指令讓它去坐下。如果小狗做對了這個動作,我們就會給一個食物獎勵它;如果它沒做到那我們就不會給獎勵。通過這樣的反饋,多次的迭代,我們的小狗最終就會知道要做出坐下這個動作才能獲得獎勵。
同樣,當我們的游戲接入了以后,我們會把當前的狀態信息發送給AI,AI根據當前的一些狀態去做出動作。由游戲反饋這個動作是否會有獎懲,AI得到反饋之后就會據此調整它的策略。
通過多輪的迭代,它就會知道在某個時刻應該要做什么樣的動作才能獲得最大的回報。由于我們需要和環境進行大量交互,所以強化實習通常需要很多的時間讓機器去做探索,努力縮小探索空間、提高樣本的利用率,來提高強化學習的訓練效果是一個重要的方向。
二、強化學習可以在游戲里面做些什么?
游戲要接入強化學習時非常簡單,只要實現兩個接口,一個就是reset接口,一個就step接口。reset接口會從游戲里面返回初始狀態;step接口就是從AI里面獲取對應的動作。然后,游戲環境返回下一個狀態的信息和一些回報的獎勵信息,最后把這個游戲打包成動態庫或者docker,就可以交給強化學習AI訓練。

1、強化學習的主要應用:對戰型AI
實際上,強化學習最主要的應用主要還是對戰型AI。在互娛游戲中我們落地了NPC的對戰AI。先以天下3山海繪為例,天下3山海繪是一個人機對戰的卡牌游戲,玩家可以選多個難度,跟機器人進行對戰。
策劃需要在短時間內完成人機對戰AI,這個AI要適應多種難度,且難度要能動態調整,以適應玩家的水平。
如果我們用行為樹做山海繪的AI的話,是需要策劃用很多的時間去列舉每個狀態的信息,然后根據狀態的節點去做對應的動作,如果我們要做分級難度的話就更需要細致去劃分,這樣花費的時間將會更加巨大,上線之后每一次卡牌的更新,都需要策劃去重新花費大量時間修改行為樹去適應新的卡牌。
實際上,這浪費了很多的人力和時間。更關鍵的是,行為樹的AI通常強度都是達不到通常玩家的水平。如果用強化學習去做的話,我們就可以很快速的去生成AI,尤其當新卡更新到新的游戲環境里面,強化學習可以很快速地適應一個新的環境,只需要重新再Finetune一下就可以了。
強化學習訓練本身,是在做機器人的自對弈的行為。這樣的一個過程中,自然而然地批量生成了大量不同難度的AI。這些AI可以無縫遷移,滿足玩家對于難度選擇的需求。最關鍵的一點是用強化學習去做AI,它最后的強度能夠遠超玩家的水平。
我們的強化學習訓練和一般的強化學習類似,都是主要由采樣器,訓練器來組成。采樣器在CPU上面執行AI的決策,通過與游戲環境進行交互,生成大量的樣本。這些樣本又可以送到GPU上面的訓練器上進行優化,優化出來的模型再放到模型池里面。
模型池可以讓AI去選擇對戰的對手,通過迭代模型池的強度,當前訓練的AI也會逐漸的變強。其中,模型池的模型也可以作為不同難度的AI模型讓玩家選擇。這個AI的難點主要是在動作空間上,剛才提到訓練強化學習其實是試錯的過程,如果我們可選的動作太多的話,我們需要去找到合適的動作就需要很長的時間。
比如我要出AABCCD這樣的一個動作,它有好幾張牌,我們第一張牌可能會有幾十個選擇,第二張牌同樣也會有幾十張選擇。這么多卡牌的選擇組合起來,樹型的結構會使我們的動作空間成指數級增長。我們的解決方案是把單步決策變成序列決策。
也就是說,我們從游戲環境里面得到的狀態,AI決策第一張牌應該要出什么,再把第一張出的牌和環境的狀態再輸進去AI,再做一次決策。第二張牌再以同樣的模式,再輸出到下一輪的決策里面。
最后,我們就可以輸出一個持續的決策,AABCCD再統一返回到給我們的游戲環境中。這樣就可以把一步的決策化為多步的決策,把游戲空間從指數級降到一個常數的級別。
我們對比一下強化學習跟行為樹的AI。在加入新的卡牌之后,強化學習明顯需要的時間會比行為樹少很多。它相比于行為樹,只有3-5個等級,具有的100多個難度等級也比較平滑。另外,它還可能會存在著比較大的難度跳躍。而強化學習,它能做到遠高于玩家的水平,這是行為樹不能做到的。

我們也挑戰了更難的游戲,參加了NeurIPS舉辦的MineRL Diamond比賽,這個比賽已經舉辦第三屆,每一次都吸引了大量工業界和學術界的強隊參加。這個比賽的目的就是在MineCraft的環境中,從一開始用一把斧頭開始采集木頭資源,再通過木頭資源去做下一步的工具,最后,要挖掘到鉆石。這個比賽舉辦以來,基本上沒有隊伍能在這種環境里面從中挖到了鉆石。比賽有很多方案,大多數隊伍都選擇了基于玩家數據去進行訓練,如基于玩家數據進行模仿學習,或者在模仿學習組上再進行強化學習。
但官方提供的數據其實不多,玩家的水平也是參差不齊,其中也有很多無效的操作。我們也嘗試過使用官方的數據集進行訓練,實際上效果也并不好。那我們能不能直接用強化學習,從零開始訓練呢?可以,但我們要解決幾個難點。環境輸出的是以圖像信息為主的,由于圖像信息,它是一個3x64x64的一個圖片,它的信息維度是非常大的。要AI去遍歷這么一個大空間的數據其實非常困難,因此,我們就采用了CNN網絡,盡量去降低它的一個復雜度,提出它的一些關鍵特征。
另外,對于這個比賽需要AI有長期的規劃能力。比如它需要先從產木頭開始,產夠了足夠的木頭才能去做木鎬,用木鎬才能去更好地去挖石頭,挖到石頭后制造石搞去挖鐵,這樣一環扣一環的操作才能有機會挖到鉆石,這就需要AI在每個時刻都能知道自己的策略是要干什么,自己下一步需要干什么。而這么長的一段時間里面,讓AI去盲目地去探索也是使用強化學習直接訓練所需要面臨巨大挑戰。我們做的主要工作就是從縮減它的探索空間。
首先是動作編碼,我們會把動作精簡到只有20個動作,而且根據當前的局面去屏蔽一些不需要的動作。這樣的話,實際上我們AI每一次可以選擇動作非常少,這樣可以壓縮探索的空間。跳幀也是一個關鍵點。
通過跳幀我們可以把本來很長的游戲壓縮成比較短的游戲過程,AI需要做的決策數目也大大縮小了,這些策略都能進一步縮減我們的探索空間。縮減了探索空間,我們就能在比較短的時間里面訓出比較好的效果。更重要的是,有一個合理的獎勵。比如我們去尋寶,需要一個藏寶圖,用藏寶圖去指引我們下一步的目標在哪里,通過達到一個目標獲取下一條線索,才能更容易找到目標。
如果用原生的原始獎勵,要不就是第一次資源就獲得獎勵之后再不能獲得獎勵。這樣的話,我們的AI可能就學不到,應該要重復收集足夠的資源才能去做工具。如果每一次都有獎勵,AI又可能會學到刷分這樣的一個行為。所以我們就細致的調整了它實際的一個獎勵,去更好地引導AI的訓練。
比如木頭的話,它是一開始需要比較多,后面沒有用。所以,我們一開始會給它重復的獎勵,到了一定程度就不會再給獎勵。另外,挖鉆石的行為,其實跟挖礦、挖石頭上的一個操作是類似的,都是要不斷挖掘。我們需要去鼓勵它進行這樣的操作,所以挖石頭,挖鐵礦我們都是給它無限的獎勵。最后,我們通過這樣的策略非常有效的將AI訓練出來。可以看到,隨著AI的迭代,它的累積回報跟挖到鉆石的概率都是飛快的上升。最后,我們也是以歷史最高分獲得了冠軍,也是這比賽舉辦以來第一次有隊伍挖到鉆石了。
2、用強化學習進行輔助游戲設計
我們還探索用強化學習去做輔助游戲設計的工作。比如有一個競速游戲,需要測試賽車的圈速、賽車的漂移性能、賽道的通過性、彎道的難度;如果用人工驗證的話,要花費很多的時間。比如,我們需要若干天讓它去熟悉游戲、掌握游戲的技巧,將游戲技術提高到一個比較高的水平,讓測試才相對準確一點。還要去做驗證賽車和賽道的組合,把每一個賽車和賽道的組合都跑一遍,這也需要耗費很多時間。

策劃重新設計的賽車或者賽道后,需要人工去重新適應新的賽車賽道的特性,這需要花費很多時間去重新適應。另外用人工驗證的話,還會存在一些偏差。因為人工驗證不可能保證每一次測試都是人類地最高水平,所以他可能需要重復測試驗證。另外人固有的操作習慣也會影響他評測新的賽車,在舊的賽車賽道,他已經很熟悉,遇到新的賽車之后,他可能就會沿用舊賽車的一些操作,這樣新賽車的特性可能就不一定能發揮出來。
強化學習的一個重點就是要加速AI的訓練。因為只有加速了AI的訓練,我們才能更好的適應策劃的新的配置,能在更短的時間里面完成一個跑測。因此,我們的主要工作就是把一些不合理的動作屏蔽掉,減少它的探索空間,動態的提前結束游戲。
相似的賽道同時訓練也有助于AI去學習它們之間的聯系,加速它的收斂過程。AI在CPU機器上也可以快速輸出結果。即便是在CPU機器 上進行訓練,我們也可以縮短90%的測試時間。利用AI可以在同一個賽道同時輸出多輛賽車,觀察在每一個時刻,它的位置、速度、檔位、還有賽車的引擎的信息,方便策劃去調試。
3、用強化學習進行游戲的平衡性分析
除了進行競速游戲的驗證以外,我們還可以做一些游戲的平衡性分析。比如在策略游戲里面,新的英雄上線了可能會有玩家吐槽,這個英雄太強了,跟什么英雄搭配都是無解的存在。那下一個版本策劃可能就會修改,把它削弱一點。實際上,上線玩家又可能會發現這英雄被削的太多了,之前充的錢可能又白花了。這樣的話就會給游戲的口碑帶來極大的影響,同時也會非常影響游戲玩家的體驗。
我們嘗試可以用事前分析去解決,比如可以用人工去評估,可以用程序去模擬所有的組合對戰結果。當然,我們也可以用強化學習去進行探索,用人工的話,就像剛才那樣可能就會出現,人工的遺漏。有一些情況沒有考慮到,上線之后就會被玩家發現有一些特別強的組合。這樣的話,它的準確率實際上是比較低的。
如果用程序去模擬所有組合的結果會非常準確,但因為它的組合數非常多,要通常需要數個月的時間,甚至不可接受的時間。如果用強化學習的話,就相當于在兩者時間取了個折中。通過強化學習,我們啟發式去進行搜索,并不需要進行所有的組合的枚舉。我們可以通過啟發式的搜索找到一些可能比較強的組合。我們并不需要把所有的組合都遍歷一遍,就可以得出一個比較精準的結果,因為AI并沒有人所擁有的先驗知識的一些偏見,所以相對人的經驗AI的結果會更準確。

強化學習的訓練都離不開一個環境,在這一個游戲平衡性分析的場景里面,搭建一個合適的環境來表述這個問題是非常重要的。我們用模型池跟游戲模擬器組成這一個游戲環境,每一次,AI從游戲環境里面獲取到當前要對戰的陣容,然后它所需要的角色就是要擊敗這個陣容所需要的組合。輸出的動作返回到戰斗模擬器去進行模擬對戰,最后把賽果返回到我們的AI里面。
AI通過這樣的反饋就能獲取這一個陣容是否合理,多輪的迭代之后AI就會學會如何搭配陣容才能打敗對面的組合,而這樣的一個強的組合也會逐漸加入到我們的陣容池里面進行淘汰,把差的陣容淘汰,留下強的陣容。通過迭代,陣容池里面就可以留下一大批可能潛在過強的英雄組合,我們把這樣的一個流程搭成一個自助跑測平臺,策劃只需要上傳更新好的游戲屬性文件,然后點一下運行就可以直接跑出來所需要的結果。包括每一個陣容它的實際對戰的結果。每一個英雄的實際強度跟其他英雄的對比,還有陣容的陣容之中每個英雄的出場率,都可以驗證這個英雄的強度是否符合策劃預先設計的預期。
三、強化學習在其他領域的應用
前面說了很多強化學習在互娛游戲里面的落地,我們也可以觀察到強化學習,不止在游戲里面有應用,我們還可以看到在國外,有一些公司用強化學習和對抗學習做游戲關卡的生成。有自動駕駛和機器人的控制都大量用到了強化學習的技術。
最近,Deepmind還提出了用強化學習去控制核聚變的反應堆。我相信這樣的一個技術可以促進最終核聚變的應用。
我的演講到此結束,非常感謝大家。
2022N.GAME網易游戲開發者峰會4月18日-4月21日每天下午15點直播,戳鏈接可直達峰會官網:https://game.academy.163.com/event/nGame