網易互娛AILab技術主管:那些被強化學習解決的痛點

遊戲葡萄 發布於:2022-04-21

2022N.GAME網易遊戲开發者峰會於「4月18日-4月21日」舉辦,在技術驅動場中,網易互娛AI Lab的技術主管曾廣俊分享了強化學習在互娛遊戲中的落地。

以下爲曾廣俊的分享內容,爲方便閱讀,有部分刪減與調整:

互娛AI Lab成立於2017年底,主要目標是將3D、CV、RL、NLP和語音技術落地到遊戲當中,解決遊戲的痛點。今天我們來講一下強化學習是什么、可以在遊戲裏做些什么,以及在其他領域能如何應用。

01

強化學習是什么?

假如現在我們要訓練一條小狗做出坐下的動作,我們可能會做出一個指令讓它坐下。如果小狗做對了,我們就會獎勵它一個食物;如果沒做到就不會給。通過這樣的多次反饋、迭代,小狗最終會知道——要做出坐下這個動作才能獲得獎勵。

同樣,我們會把狀態信息發送給AI,讓AI做出動作,由遊戲反饋這個動作是否會有獎懲,AI得到反饋後就會據此調整它的策略。

通過多輪迭代,它就會知道在某個時刻要做什么動作才能獲得最大回報。由於我們需要和環境大量交互,所以強化學習通常需要很多時間讓機器探索。通過縮小探索空間、提高樣本利用率來提高強化學習的訓練效果,是一個重要的方向。

02

強化學習可以

在遊戲裏面做些什么?

遊戲要接入強化學習非常簡單,只要實現兩個接口:reset接口和step接口。reset接口會從遊戲中返回初始狀態;step接口會從AI中獲取對應動作。之後遊戲環境會返回下一個狀態的信息,和一些回報的獎勵信息。最後把這個遊戲打包成動態庫或者docker,就可以交給強化學習AI訓練。

1、強化學習的主要應用:對战型AI

強化學習最主要的應用是對战型AI。在互娛遊戲中我們落地了NPC的對战AI。先以《天下3》的山海繪——一個人機對战的卡牌遊戲爲例,玩家可以選多個難度,跟機器人進行對战。策劃需要在短時間內完成人機對战AI,這個AI要適應多種難度,且難度要能動態調整,以適應玩家的水平。

如果我們用行爲樹做山海繪的AI,會需要策劃用很多時間去列舉每個狀態的信息,然後根據狀態節點做對應動作。如果要做分級難度,就更需要細致地劃分,這樣花費的時間將會更加巨大,上线後每一次更新,都需要策劃重新花費大量時間修改行爲樹。

更關鍵的是,行爲樹的AI強度通常都達不到一般玩家的水平。如果用強化學習去做,我們就可以很快速地生成AI,尤其是當新卡更新到新的遊戲環境中,強化學習可以很快地適應新環境,只需要重新再Finetune一下就可以了。

強化學習訓練本身,是在做機器人的自對弈行爲。在這樣的過程中,會自然而然地批量生成大量不同難度的AI。這些AI可以無縫遷移,滿足玩家對於難度選擇的需求。最關鍵的一點是,它最後的強度能遠超玩家水平。

我們的強化學習訓練和一般的強化學習類似,主要由採樣器、訓練器組成。採樣器在CPU上執行AI決策,通過與遊戲環境交互生成大量樣本。這些樣本又可以送到GPU的訓練器上優化,優化出來的模型再放到模型池裏,讓AI選擇對手。

通過迭代模型池強度,當前訓練的AI也會逐漸變強。且模型池的模型也可以作爲不同難度的AI模型讓玩家選擇。這個AI的難點主要在動作空間上,剛才提到訓練強化學習其實是試錯的過程,如果我們可選的動作太多,找到合適的動作就需要很長時間。

比如我要出AABCCD這樣一個動作,打第一張牌就會有幾十種選擇,第二張牌也一樣。這么多選擇組合起來,樹型結構會使動作空間成指數級增長。

我們的解決方案是把單步決策變成序列決策。也就是說,我們從遊戲環境中得到狀態,讓AI決策第一張牌出什么,再把第一張牌和環境狀態輸入AI,再做一次決策,之後的決策以此類推。

最後,我們就可以輸出一個持續的決策,再統一返回到遊戲環境中。這樣就可以把一步決策化爲多步決策,把遊戲空間從指數級降到常數級。

我們對比一下強化學習跟行爲樹的AI:在加入新卡牌之後,強化學習需要的時間明顯會比行爲樹少很多。且行爲樹只有3-5個等級,而強化學習具有100多個較爲平滑的難度等級。另外,行爲樹還可能存在較大的難度跳躍,而強化學習能做到遠高於玩家的水平。

我們也挑战了更難的遊戲,參加了NeurIPS舉辦的MineRL Diamond比賽,這個比賽已經舉辦三屆,每次都吸引了大量工業界、學術界的強隊參加。其目的就是在《MineCraft》中,從砍樹造工具开局,一直到實現挖掘鑽石的目標。

比賽舉辦以來,基本上沒有隊伍能在這種環境中挖到鑽石。大多數隊伍都選擇了基於玩家數據訓練,比如模仿學習,或在模仿學習組上再進行強化學習。

但官方提供的數據其實不多,玩家的水平也參差不齊,所以其中會有很多無效操作。我們也嘗試過用官方數據集訓練,實際效果並不好。那我們能不能直接用強化學習從零开始訓練呢?

可以,但要解決幾個難點:環境輸出以圖像信息爲主,而圖像信息是3x64x64的圖片,其信息維度是非常大的。要AI去遍歷這么一個大空間的數據會非常困難,因此我們採用了CNN網絡,以盡量降低復雜度、提出一些關鍵特徵。

另外,這個比賽需要AI有長期規劃能力。比如它需要先從產木頭开始,產夠了木頭才能去做木鎬挖石頭,挖到石頭後制造石搞去挖鐵……要做出這樣一環扣一環的操作,需要AI在每個時刻都能知道自己的策略和下一步需要幹什么。而在這么長的一段時間裏,讓AI盲目探索、直接訓練,也會面臨巨大挑战。我們做的主要工作,就是縮減它的探索空間。

首先是動作編碼,我們會把動作精簡到只有20個,並根據當前局面屏蔽一些不需要的動作。這樣一來,AI每次可選的動作就會非常少;

其次,跳幀也是一個關鍵點。通過跳幀,我們可以把本來很長的遊戲壓縮成得較短,也讓AI需要做的決策數目大大縮小。這就讓我們能在較短時間內訓練出較好的效果。

更重要的是,要設置合理的獎勵。原始的獎勵方法,是在第一次採集資源獲得獎勵之後不能再獲得獎勵。這樣的話,我們的AI可能就學不到要重復收集足夠資源這一點。但如果每次都有獎勵,AI又可能會學出刷分行爲。

所以我們細致地調整了它的獎勵方法。比如一开始會需要較多木頭,後面就用不到了。所以我們一开始會給出重復獎勵,到一定程度後才停止。另外,挖鑽石的行爲其實跟挖礦、挖石頭的操作類似,都要不斷挖掘。我們要鼓勵這樣的操作,所以挖石頭、鐵礦我們都會給出無限獎勵。

通過這樣的策略,可以看到隨着AI迭代,它的累積回報和挖到鑽石的概率都在飛快上升。最後,我們以歷史最高分獲得了冠軍,也是比賽舉辦以來第一次有隊伍挖到鑽石。

2、用強化學習進行輔助遊戲設計

在輔助遊戲設計方面,我們也利用強化學習做出了探索。比如競速遊戲需要測試賽車的圈速、漂移性能,賽道的通過性、彎道的難度……人工驗證要花費很多時間。首先要用若幹天讓測試者熟悉遊戲、掌握技巧,其次還要把每輛驗證賽車和每條賽道的組合都跑一遍。

即便如此做了,在策劃重新設計賽車或者賽道後,我們還需要人工重新適應新特性。另外人工驗證也會存在偏差,因爲不可能保證每次測試都是人類最高水平,而且人固有的操作習慣也會影響評測。

強化學習的一個重點,就是要加速AI訓練。做到這點,我們才能更好地適應新配置,在更短時間內完成跑測。因此,我們的主要工作就是把一些不合理的動作屏蔽掉,減少探索空間、動態地提前結束遊戲。

把相似的賽道同時訓練,也有助於讓AI學習它們之間的聯系,加速收斂過程,在CPU機器上快速輸出結果——即便是在CPU機器上訓練,我們也可以縮短90%的測試時間。利用AI可以在同一個賽道同時輸出多輛賽車,觀察它在每一個時刻的位置、速度、檔位,還有賽車的引擎信息,方便策劃調試。

3、用強化學習進行遊戲的平衡性分析

除了驗證競速遊戲以外,我們還可以做一些遊戲的平衡性分析。比如在策略遊戲中,想要事前分析英雄組合的平衡性,用人工驗證可能會出現遺漏,準確率較低;用程序模擬組合,結果會非常準確,但因爲組合數非常多,通常需要數月甚至不可接受的時間。

用強化學習則可以得到折中的時間。我們並不會枚舉所有組合,而是通過啓發式搜索找到一些可能較強的組合。因爲AI並沒有人因爲先驗知識產生的一些偏見,所以AI的結果會更準確。

強化學習的訓練都離不开環境,在遊戲平衡性分析的場景中,我們用模型池和遊戲模擬器組成環境——每次AI從遊戲環境中獲取到當前要對战的陣容,再搜索出組合返回到战鬥模擬器模擬對战,最後把賽果返回到AI。

通過這樣的反饋,AI就能了解一個陣容是否合理,在多輪迭代之後,AI會學會如何搭配陣容才能打敗對面組合。我們的陣容池也會收納組合,並逐漸淘汰弱組合、留下強組合。

這樣一來,陣容池裏會留下一大批可能潛在過強的英雄組合,我們把這樣的流程搭成一個自助跑測平台,策劃只需要上傳更新的遊戲屬性文件,點一下運行就可以直接跑出來所需結果。包括每個陣容的實際對战結果、每個英雄的實際強度與對比,還有陣容中每個英雄的出場率,都可以驗證其強度是否符合預期。

03

強化學習在其他領域的應用

前面說了很多強化學習在互娛遊戲裏的落地,其實我們也可以觀察到在國外有一些公司用強化學習和對抗學習生成遊戲關卡。另外,強化學習不止在遊戲裏有應用,也在自動駕駛和機器人的控制方面有大量應用。

最近,Deepmind還提出了用強化學習控制核聚變反應堆。我相信這樣的技術,可以促進最終核聚變的應用。



追加內容

本文作者可以追加內容哦 !

2024/05/04 - 外匯經紀商評分