項目實戰2-基於PYSC2的星際爭霸2 AI項目
來自專欄遊戲AI探索者
4 人贊了文章
作者: MADong CASIA 研究生在讀
主要方向:多智能體博弈 人機對抗 深度強化學習
承接上文,今天我們來講講Chris《星際爭霸2》項目的升級版,上次對一些小細節簡單進行了帶過,這節我們會對其中一些細節進行詳細探索。
再附Github地址:
https://github.com/DKuan/StarCraft2本節目錄如下:
1、單位識別
2、神經網路輸入及特殊處理
3、程序演算法結構提升
1、單位識別,環境初始化後默認情況是我方單位全部選中,先通過內置_NO_OP操作來過渡一下,為什麼?因為初始化一般發生在兩個情況下,一個是遊戲剛剛初始化,本回合剛開始,這時這個操作可以說是無用操作;另一種情況是遊戲進行中,我方單位有存活,敵方單位全部死亡,此時會通過Flag觸發我方單位重新分組的函數,也就是此處的Init(),但是這個時候有個小問題需要注意,即程序初始化時,可能遊戲畫面還沒有結束(與你程序結構有關,我的結構會遇到這個問題)。此時需要這個操作來過渡一下遊戲UI以及遊戲內部參數的更新。
然後是對我方單位的坐標獲取,_STOP_QUICK這個操作需要解釋一下。在訓練過程中,大家可能會發現這個現象:我方取得勝利,然後還沒對當前初始畫面中的我方單位進行分組時,我方的單位全部向著一個方向前進,這就是因為你之前的action還沒有執行完,但是新的回合開始,單位複位,並且全部選中來執行之前的未完成動作,造成了這個奇怪的現象。因此此處加入了停止所有action的操作。後面是把全部選中的單位取消掉,我們已經獲取了所有的單位坐標信息,後面是單個單位的選中,無需全部選中狀態。
下面解釋65-93行,之前強調的一個單位重複被選到一個group的問題,裡面的參數(單位占像素數)與你初始環境時設置的地圖尺寸有關。例如我這裡設置的地圖大小為64*64,每個單位佔4個像素。程序的大概思路為:首先按照PYSC2對二維空間的分布(x,y軸如何劃分地圖),以y=0到y=64為首選,如果y=0沒有,找y=1,2,3...直到有一個y[n]中包含我方單位像素,然後開始搜尋x,因為每一個單位四個像素,先考慮刪除本行像素,因為下一行的像素有可能重疊,在刪除下一行的像素時,查看對應位置處的density_map的值,如果為2,則說明此處有重疊,否則從左上角到右下角的4個像素全部刪除。按照這種搜索方法,9個單位共36個像素,會全部找到,而且不會對一個單位重複選中。
註:此處計算的為初始時的像素分布,不會出現一個單位被完全擋住,所以簡單對單位進行像素排查即可。
2、神經網路輸入及特殊處理
Chris的神經網路輸入為直接的單位分布圖,這裡我採用的是經過處理的單位分布圖。首先我預期的目的是我能夠控制9個單位對敵方的兩個兵種實施不同的行為,對於小狗,能夠上去勇敢攻擊。對於爆蟲,要能夠及時躲避。因此在map處理方面,我把兩個單位用不同的數字進行了標註,(通過type_map來獲取兩種單位的位置信息,然後進行標註)。同時,我採用了Chris的操作方式,每次只對一個單位進行操作,那麼問題就來了,我的智能體怎麼知道我現在操作的是哪一個單位呢?Chris中是選單位有一定的規則,所以大部分情況下,同一個場景會選擇同一個單位,基本上預定義為Agent是知道自己選擇的單位的。但是我這裡是完全隨機的,所以我每次輸入的map中,把當前選中的單位進行了特殊標記,如我方其他單位標註為1,當前選中單位標註為3。
下面提到的雙DQN訓練演算法中,一個輸入的為Mini-Map,即我們平時談到的小地圖;另一個是原始大小的map。但是都執行了上述處理。
Chris使用了Prior-replay的方法,但是我感覺數據利用效率還是不夠高,因此我把存入數據集的經驗數據進行了左右對稱,然後動作也同樣處理,這樣數據的利用效率更高了。
3、DQN演算法架構提升
方法是從德撲和分層神經網路中想出來的,其實我們可以這樣想這個任務(我訓練的地圖是DefeatZerglingsAndBanelines.map),表面上我們任務是控制單位移動到敵方單位處進行攻擊,但是實際上這個任務可以分解為如下時序任務:①移動單位到敵人附近,並呈一種優勢隊形②控制我方單位移動對敵人進行攻擊。因此我們可以分別搭建網路對兩個任務進行訓練,具體有如下訓練方法:利用規則移動單位到敵方附近,學習攻擊,然後再學習移動單位到敵人附近;直接兩個網路同時學習;最終我的結果是兩種方法差距不大,所以後面直接訓練了。
通過以上分析,我們設立了如下網路架構:

這裡需要說明,我對baselines的底層庫進行了修改,不然是不能同時訓練兩個網路的。底層baselines的庫只能跑一個網路,存放一套參數。對於兩個網路的分界條件是大家比較關心也是比較重要的。這裡我採用距離限制的方法,如果我方單位和敵方單位的最近距離到達了一定限制,就切換到第二個網路開始學習訓練,雖然有人會說這樣會不會出現一個兵很靠前,另一些兵很靠後呢?其實你可以想,或許這就是Agent總結出來的最好陣型呢?哈哈,其實經過大量的訓練,還是不必擔心這種個例的,如果不會取得很高的分數,肯定會被淘汰掉。
對於兩個網路的切換以及如何對經驗存儲進行協調,我都對Chris的項目進行了改進。這方面涉及的代碼細節較多,但按照上圖的程序主框架應該是可以走通的,按下不表。這種方法實質上是對稀疏獎勵問題解決方式的一種簡單探索。
到此,這個項目基本就告一段落了。後面會推出一些原創新內容,近期整理中,希望能給各位帶來一點幫助。
遊戲AI探索者首發,轉載請告知,以上內容如有侵權,請即時告知。
2018-7-28
推薦閱讀:
※軟體、硬體加服務會帶來什麼樣的革命?
※【AI識人】OpenPose:實時多人2D姿態估計 | 附視頻測試及源碼鏈接
※人工智慧眼中的世界,竟然如此詭(魔)異(性)?!
※自動駕駛將重塑人類社會的未來
