OpenAI-Five 模型詳解
101 人贊了文章
OpenAI-Five是OpenAI開發的Dota2 AI,其在當地時間6月5日以懸殊的差距擊敗了人類半職業Dota高手。
OpenAI 於今天公布了詳細的訓練模型。可以說這個模型(在大結構上)要比AlphaGo等之前的AI複雜得多:Dota2和圍棋等差異最大的一點是其內部的數據具有非常豐富的類型和語義,如何表示這些數據是至關重要的一點。從模型中我們可以學到不少關於特徵表示東西。
模型頂層框架
模型的頂層結構如下圖所示:
圖中方塊狀的是較簡單的結構,而圓角的代表有較複雜的內部結構。
輸入包括了
- minimap(小地圖),包括視覺信息,可達性信息,小兵位置,守衛位置。共計4個特徵。
- raw(原始數據),包括各類計時數據(自己和對手防禦符文的冷卻狀態,遊戲時間,是否是夜晚,上一次看到敵方信使後經過的時間,夜晚來臨的剩餘時間,到下一個兵線出發的時間),各類信使相關數量(flask, clarity, enchanted mangoes, town portals, magic sticks),周遭地形信息(8*8的網格,包含高度,通達性,團隊中每個英雄佔據的兵線),共計14個特徵。
- player hero,玩家當前使用的英雄,1個特徵
這些是固定數量的相對獨立的輸入特徵,代表了OpenAI Bot所知的全局狀態,共計19個。
還有一些輸入在遊戲中數量不定:
- (可見)遊戲道具。包含類型,離玩家距離,出現/消失信息。每個共計3個特徵。
- (可見)遊戲單元。包括遊戲中所有可交互的非道具對象(塔,所有玩家,野怪等)。遊戲單元比較複雜,將在下面專門介紹。
符號數據嵌入(Embedding)
遊戲中主要數據分為兩類:
- 數值/向量。這些數據本身就具有一定的內在關係,比如時間,高度,距離等,可以直接用於輸入。
- 符號,其本身的表示無法體現其語義,比如英雄編號,動作編號,其他單元動畫編號,以及遊戲中各類物體的類型。這個時候OpenAI對它們使用了嵌入,轉化為向量後再輸入。
Player Hero 模塊就是由這樣簡單的嵌入構成的。
多實體嵌入
遊戲中另外一些東西擁有更加豐富的數據(數值,符號,向量),並且數量不定。為了準確表徵其語義,OpenAI頻繁使用了下面的結構,將任意多物體的表示嵌入到了一個向量中:
這個想法非常簡單自然:符號數據統統轉為向量數據,然後所有的數據合併到一起,然後再2層NN融合一下得到一個表示整個實例的向量。
最後使用maxpool來將任意多實例的特徵編碼為一個向量(這裡應該假設了一個實例的向量的不同分量能夠代表了不同的獨立特徵)。
Minimap的表示
由於小地圖非常自然的以圖像形式出現,所以很自然地使用了CNN來抽取特徵。CNN是conv2x2 + maxpool2x2 + conv2x2結構。不知道為什麼沒有使用3*3以及網路比較淺,可能是考慮到算力問題。
Unit的內部表示
Unit代表遊戲中的可交互單元,內部表示分為2個主要部分:一般屬性和英雄屬性。兩個部分通過拼接組成一個向量。
一般屬性的表示將單元類型、攻擊受攻狀態、單元狀態、單元最近12幀的健康值、離玩家的距離、方位、絕對坐標以及動作(共8個特徵)統一編碼到一個向量,方式和編碼Pickups類似。
英雄屬性包括英雄的內稟屬性(買活代價和相應冷卻時間,死亡次數,能力掌握情況,傳送目標的地點時間和是否在傳送,團隊屬性,等級(魔抗智力魔法值上限敏捷)),共6個特徵;以及附加屬性,包括特效,能力和物品(3組特徵),其中每個都使用了和Pickups完全相同的編碼方案。
內稟屬性,附加屬性和一般屬性通過concat操作合併到一起後得到了最終的表示。每個單元共使用了17個獨立特徵。
最終的表示在輸出時進行了分組。首先根據單元的類型(敵方非英雄,敵方英雄,中立單位,我方英雄,我方非英雄)使用不同的權值再次融合特徵,然後特徵再分為兩組:
- 第一組使用我們先前提到的 maxpool 方法得到不依賴單元數的表示,然後和我們提到的其他特徵綜合得到單個玩家全部狀態的表示。
- 第二組取前128個分量,合併後作為注意力使用。
全局表示
最後特徵還需要一次隊內玩家的融合,這個是由上面所說的Fuser模塊完成。Fuser模塊首先使用一個FC-relu將特徵的分量數變為2048,然後使用了max-pool綜合了所有玩家特徵的前512個分量,和剩餘的分量拼接到一起,這樣向量長度還是2048。這個長度為2048的向量代表了遊戲中玩家關於遊戲的全部知識。
LSTM部分
由於Dota2是一個非完全狀態的時序遊戲,所以用LSTM作為核心元件也就非常正常。LSTM後緊接著輸出。
輸出部分
輸出部分根據其特性也可以分為3個部分。所有部分的輸入均來自於LSTM的輸出。
- 動作輸出。這個部分簡單地FC+Softmax,動作選擇需要屏蔽掉不合法的操作。
2. 目標輸出
可能是OpenAI覺得選擇目標非常重要且適合使用注意力,這裡使用了額外的注意力機制。
前文提到來自Unit模塊的注意力向量的產生方式不是通過max-pool,而是截取向量的前128個分量,這會強制Bot只關注少量的單元,不受過多單元的影響,從而起到注意力的作用。Bot產生的動作也會同時影響到輸出的目標。
3. 勝率輸出
非常簡單。FC+sigmoid直接出一個0-1之間的數。
總結
對於AlphaGo-Zero而言,遊戲總共只需要3個特徵:白棋,黑棋,貼目;其中兩個特徵是同質的,另外一個特徵不需要顯式地輸入。
而OpenAI Five至少需要處理 個特徵,其語義信息可謂是遠遠超過AlphaGo-Zero。由於現實世界就是個語義極其豐富的環境,所以說某種意義上OpenAI Five的能力更接近現實。
但是我們同時也能看到的一點是,OpenAI在回答作者提問和先前Blog中,都只強調了「我們使用了一個2048單元的LSTM」,直到其公布了模型結構才發現那其實只是其中的1%。這種極其複雜的語義需要非常複雜的特徵工程表示,某種程度上這才是成功的關鍵。可以說成功=98%的工程+1%的核心技術+1%的trick。OpenAI-Five的成功也讓大家反思,更加通用的人工智慧到底是工程+算力所推動的,還是仍然存在這樣一種可能使得有比OpenAI-Five還簡單的模型成為通用人工智慧。
另外內行都知道的一件事情是,OpenAI沒有公布更關鍵也可能更複雜的一個東西:獎勵函數的設計。對複雜的RL而言,沒有獎勵函數,即使單純有模型可能用處也不大。
OpenAI-Five可能的優缺點
首先,需要注意的是OpenAI-Five的Fuser模塊中在特徵層級交換了隊內玩家的信息,這可能導致OpenAI Bot之間擁有極強的協作能力,因為它們能「直接用心靈感應交流」。雖然不違反遊戲規則,這點對人類玩家可能不太公平。
可能的缺點在特徵表示上。可能由於算力問題整個模型的網路結構不是很深,而且對多物體的編碼相對簡單,在某些複雜情形下(周圍非常密集)可能性能會有所降低。
推薦閱讀:
※620整治之後,棋牌手游究竟該何去何從!
※不正經評測之:《Line:迪士尼鬆鬆》
※妻子網購誤刪遊戲遭丈夫痛打 無奈報警求助
※DNF十年前的神器你見過幾個?
※平衡遊戲(遊戲而引發的生命危機)