人工智慧的長期目標是解決高難度的真實世界難題。為了實現這一目標,研究者在近幾十年的時間裡將遊戲作為研究 AI 發展的基石。從雙陸棋(1992)到國際象棋(1997)再到 Atari 遊戲(2013),在 2016 年,AlphaGo 憑藉深度強化學習和蒙特卡洛樹搜尋戰勝了圍棋世界冠軍。近些年來,強化學習(RL)也在更多型別的任務上得到了應用,比如機器人操作、文字摘要以及《星際爭霸》和《Minecraft》等影片遊戲。
相比於國際象棋或圍棋等之前的 AI 里程碑,複雜影片遊戲更具備現實世界問題那樣的複雜性和連續性。而 Dota 2 是 Valve Corporation 於 2013 年發行的一款多人實時戰略遊戲,該遊戲在 2013 年到 2019 年之間的同時線上玩家數在 500 000 到 1 000 000 之間。
該遊戲也有很多全職的職業玩家;其 2019 年國際冠軍賽的獎金池已經超過了 3500 萬美元(這是全世界電子競技遊戲中最多的)。該遊戲由於一局時間較長、部分可觀測性以及高維度的觀察和動作空間,這些給強化學習帶來了嚴峻的挑戰。另外,Dota 2 的規則也很複雜——該遊戲已經歷經超過十年的活躍開發,其遊戲邏輯使用了數十萬行程式碼來實現。
要為這樣複雜的環境創造合適的智慧體,關鍵是要將現有的強化學習系統擴充套件至前所未有的規模,這需要在數以千計的 GPU 上執行幾個月的訓練。為了實現這一目標,OpenAI 構建了一個分散式的訓練系統,訓練出了名為 OpenAI Five 的 Dota 2 遊戲智慧體。2019 年 4 月,OpenAI Five 擊敗了一支 Dota 2 世界冠軍戰隊(OG 戰隊),這是首個擊敗電子競技遊戲世界冠軍的 AI 系統。OpenAI 也將該系統開放給了 Dota 2 社群進行對戰試玩;在超過 7000 局遊戲中,OpenAI Five 的勝率為 99.4%。
論文地址:https://cdn.openai.com/dota-2.pdf
OpenAI 表示,訓練過程還面臨著另外一個難題:遊戲環境和程式碼一直在不斷升級和變化。為了避免在每次變化之後再從頭開始訓練,他們開發出了一套工具,能以最低的效能損失繼續完成訓練——OpenAI 將其稱之為「手術(surgery)」。在超過 10 個月的訓練過程中,OpenAI 大約每兩週執行一次手術。這套工具讓 OpenAI 可以經常改進他們的智慧體,這隻需要很短的時間——比典型的從頭開始訓練方法要短得多。隨著 AI 系統解決的問題越來越大,越來越難,進一步研究不斷變化的環境和迭代開發就顯得至關重要了。
Dota 2 難在哪兒?
Dota 2 遊戲對戰發生在一個方形的地圖中,兩支隊伍各自保衛位於對角線上的己方基地。每支隊伍的基地都有一個遠古遺蹟(ancient);
當某方的遠古遺蹟被敵方摧毀時,遊戲便宣告結束。每支隊伍由 5 位玩家組成,每位玩家控制一個英雄單位,每個英雄都有自己獨特的技能;
遊戲期間,每方都有持續派出的「小兵(creep)」單位,但這些小兵不由玩家控制,它們會按路徑向敵方基地前進,並會攻擊任何出現在其攻擊範圍內的敵方單位和建築;
玩家可從小兵收集金幣和經驗等資源,然後可透過購買物品和升級來提升英雄的戰鬥力。
為了玩 Dota 2,AI 系統必須解決多種難題:
長時間對局。Dota 2 遊戲一般會以 30 幀每秒的速度持續大約 45 分鐘。OpenAI Five 每 4 幀選擇一個動作,則每局比賽需要執行大約 20000 步。比較一下,國際象棋一般持續 80 步,圍棋是 150 步。
部分可觀察的狀態。每支隊伍都只能看見己方單位和建築附近的部分遊戲狀態;地圖中的其餘部分都是隱藏起來的。如果要玩得好,需要基於不完整的資料進行推斷以及建模敵方的行為。
高維度的動作和觀察空間。Dota 2 有一個很大的地圖,地圖中有 10 個英雄、幾十個建築、幾十個非玩家單位,另外還有神符、樹和偵查守衛(眼)等長尾的遊戲特徵。
OpenAI Five 每個時間步驟會觀察大約 16 000 個值(大部分是浮點數和有數百種可能性的類別值)。同時,OpenAI 對動作空間進行了離散化處理;其模型在每個時間步驟從 8000 到 80000(具體數量取決於英雄)個動作選擇一個。相比之下,國際象棋每次觀察需要大約 1000 個值(這些值大都是有 6 個可能性的類別值),圍棋大約需要 6000 個值(全都是二元值)。圍棋的分支因子(branching factor)大約是 35 個可行動作,圍棋的大約是 250。
另外需要說明,OpenAI Five 在玩常規模式的遊戲時還有兩個限制條件:
英雄池只有 17 個英雄——在常規遊戲時,玩家是在比賽前從 117 個英雄中選擇一個,而 OpenAI Five 目前只支援其中 17 個;
不支援能讓玩家同時暫時控制多個單位的物品(幻象神符、支配頭盔、幻影斧、死靈書)。OpenAI 移除這些物品的原因是控制多個單位會引入額外的技術複雜性。
訓練系統
讓 AI 玩 Dota
為了將「以超人級水平玩這個複雜遊戲」的模糊問題轉換成一個可以最佳化處理的詳細目標,OpenAI 提出了以下框架。
儘管 Dota 2 引擎的執行頻率是 30 幀每秒,但 OpenAI Five 每隔 4 幀(稱為一個時間步驟)才採取一個動作。在每個時間步驟,OpenAI Five 都從遊戲引擎接收一個觀察,其中編碼了作為人類玩家可以看到的所有資訊,比如單位血量、位置等。然後,OpenAI Five 向遊戲引擎返回一個離散的動作,其中編碼了一個所需的移動、攻擊等。
當然,某些遊戲機制是用人工編寫的邏輯控制的,而不是使用策略。這其中包括:英雄購買物品、獲得技能的指令、對獨特的信使單位的控制、英雄應當保留物品。OpenAI 表示,他們相信用 AI 方法替代人工編寫規則最終能讓智慧體取得更好的表現,但即便如此,現有的智慧體就已經取得了超人類的表現。
在訓練期間,環境中的某些屬性經過了隨機化處理,包括遊戲中的英雄和英雄購買的物品。因為在與人類對手對戰時會出現各種不同的戰略和情況,所以為了保證穩健性,必須進行足夠多樣化的訓練。
OpenAI 將策略 π 定義為從觀察歷史對映到動作的機率分佈的函式,並將其引數化為了一個有大約 1.59 億個引數(θ)的迴圈神經網路。該神經網路主要由單層的 4096 單元的 LSTM 構成(見圖 1)。給定一個策略,OpenAI 玩遊戲的方式是在每個時間步驟不斷重複地將當前觀察傳遞為輸入,然後從輸出的分佈取樣一個動作。
圖 1:簡化版的 OpenAI Five 模型架構
為了控制一支隊伍的五個英雄,OpenAI 為每個英雄都使用了同一策略函式(具有相同的引數 θ)的不同副本。因為 Dota 2 中的可見資訊和戰爭迷霧(迷霧中友方單位附近的區域是可見的)是全隊共享的,所以每位英雄的觀察幾乎都是相同的。
不過,OpenAI Five 並不直接使用螢幕上的畫素資訊,而是使用了一個資料陣列集來近似人類玩家可獲得的資訊。這樣的近似是不完美的;人類玩家能夠獲得的很多片段資訊都沒有被編碼在觀察中。另一方面,儘管 OpenAI 已經盡力確保模型獲得的所有資訊都是人類可以獲得的所有資訊,但人類在每個時間步不可能同時看完所有可用資訊——人類必須主動點選地圖和狀態指示器的不同部分才行。
對策略進行最佳化
OpenAI 的目標是找到能最大化與人類職業玩家對戰時獲勝的機率的策略。在實踐中,研究者對獎勵函式執行了最大化操作,這個獎勵函式還包含一些其它訊號,比如角色死亡、收集資源等。
另外,他們還應用了多種技術以在計算獎勵函式時利用該問題的零和多玩家(zerosum multiplayer)結構。比如說,透過減去敵方隊伍所獲得的獎勵,使得智慧體的獎勵被對稱化處理(symmetrize)。
OpenAI 團隊在該專案一開始就構建好了這個獎勵函式,因為團隊對遊戲的有一定的瞭解。儘管隨著遊戲版本更新,這個獎勵函式也有過些許變化,但他們發現初始的獎勵選擇效果已經很好。而之後增加的獎勵訊號對訓練成功而言也非常重要。
對於策略的訓練則使用了近端策略最佳化(PPO),這是 Advantage Actor Critic 的一種變體。這種最佳化演算法使用了通用優勢估計(GAE),這是一種標準的基於優勢的方差縮減技術,可穩定和加速訓練。OpenAI 使用了一箇中心化的共享式的 LSTM 模組來訓練網路。這一模組會向不同的全連線層提供輸入,從而得到策略和價值函式輸出。
圖 2:系統概況:該訓練系統由 4 種主要型別的機器構成
OpenAI 使用了從 Dota 2 收集的自我博弈(self-plaer)經驗來訓練策略;在 16 個時間步的樣本上使用了帶有截斷式的反向傳播的 Adam 最佳化器。
系統使用「Rollout」執行自我博弈。它們以接近 1/2 的實時時間執行這些遊戲,因為 OpenAI 團隊發現以這樣的速度能並行執行略多於兩倍的遊戲,從而增大總吞吐量。
「Rollout」能以非同步的方式傳送正在進行的遊戲中的資料,而不是等到整局遊戲結束才傳送資料進行最佳化。
整個系統執行在自定義的分散式訓練平臺 Rapid 上,基於谷歌的雲平臺上。為了執行快速 GPU 訓練,研究者還使用了 blocksparse 軟體庫。
透過「手術」實現連續遷移
當然隨著專案推進,程式碼和遊戲環境也在逐漸變化。為了解決從頭開始訓練的問題,OpenAI 提出了一種名為「手術(surgery)」的新方法。
「手術」可被視為一套工具集,它能夠對舊模型執行離線操作,從而得到與新環境相容的新模型。即便這個新模型的引數向量與舊模型的大小和語義不同,但它也仍然能以同樣的水平執行遊戲策略。然後,OpenAI 使用有新引數向量的新模型開始在新環境中進行訓練。在環境、觀察和動作空間都不變的最簡單情況下,其標準簡化為:堅持讓新策略實現與舊策略一樣的從所觀察狀態到動作的機率的函式:
這是保留變換的 Net2Net 風格的函式的一個特例。OpenAI 已經開發出了能儘可能準確地實現公式(1)的工具(如新增觀察、擴充套件層和其它情況);而當對環境、觀察空間或動作空間的修改型別無法完全滿足準確實現的標準時,也可以近似地實現它。
表 1:在 OpenAI Five 訓練期間執行過的所有成功的「手術」和重大的環境改變
「手術」能在無損效能的同時實現連續的訓練(見圖 4)。
圖 4:在正在開發中的環境中訓練
實驗和評估
OpenAI Five 是從 2018 年 6 月 30 日到 2019 年 4 月 22 日的單次訓練過程的產物。經過十個月的 770±50 PFlops/s·days 計算量的訓練之後,其在三局兩勝制比賽中擊敗了 Dota 2 冠軍戰隊,並在持續多日的線上展示中擊敗了 99.4% 的人類玩家。
為了有效地利用這種水平的算力,整個系統進行了三個方向的擴充套件。第一,批大小為 100 萬到 300 萬的時間步(將其分組為長度在 16 的展開式 LSTM 視窗)。第二,使用了超過 1.5 億引數的模型。第三,OpenAI Five 的訓練用去了 180 天(由於重啟和恢復,實際時間超過 10 個月)。
相比於 AlphaGo,OpenAI Five 的批大小大 50 到 150 倍,模型大 20 倍,訓練時間長 25 倍。但同期也有另一些研究能在規模與這一專案匹敵或甚至規模更大一些,比如 DeepMind 的《星際爭霸 2》智慧體研究《Grandmaster level in StarCraft II using multi-agent reinforcement learning》以及 OpenAI 的一項機器人研究《Solving Rubik's Cube with a Robot Hand》。
人類評估
在訓練期間,OpenAI Five 與許多業餘玩家、職業玩家和職業戰隊進行了比賽,以便跟蹤記錄研究進展。
4 月 13 日,OpenAI Five 與 Dota 2 現世界冠軍 OG 戰隊進行了一場高水平的競技比賽,在三局兩勝比賽中獲勝(2-0),這表明 OpenAI Five 確實能學習到最高水平的操作技術。
但是,機器學習系統通常不能很好地應對意料之外的情況。儘管在展示比賽中勝過世界冠軍確實能說明 OpenAI Five 能力出色,但這不能證明其能夠廣泛地理解人類社群可能面臨的各種難題。
為了探索 OpenAI Five 能否被穩定地用於創造性或分佈外的玩法,OpenAI 啟動了 OpenAI Five Arena(競技場),在 2019 年 4 月 18-21 日期間開放給公眾進行線上挑戰。OpenAI Five 與 3193 支隊伍共進行了 7257 局比賽,勝率為 99.4%。29 支隊伍在總共 42 場比賽中擊敗了 OpenAI Five。
儘管人類評估才是最終目標,但也需要在訓練期間對智慧體進行自動化的評估。OpenAI 的做法是以 TrueSKill 評分系統為指標,比較一些固定的參照。圖 3 給出了 OpenAI Five 的 TrueSkill 評分隨時間的變化情況。
圖 3:OpenAI Five 的 TrueSkill 評分在訓練期間的變化情況
透過 Rerun 驗證「手術」的效果
為了驗證新提出的「手術」方法所能節省的時間和資源,OpenAI 在 2019 年 5 月 18 日到 2019 年 6 月 12 日之間訓練了另一個智慧體,但僅使用了最終的環境、模型架構等。OpenAI 稱這個訓練過程為 Rerun,其沒有經歷蜿蜒曲折的遊戲規則變化、對神經網路引數的修改、對超引數的線上實驗等等。
Rerun 完成了兩個月的 150 ± 5 PFlops/s·days 計算量的訓練(見圖 4)。這個時間跨度顯著長於「手術」變化的頻率(每 1-2 週一次)。簡單比較來看,如果在 20 次重大手術之後的每一次都從頭開始訓練,則該專案需要耗時 40 個月,而不是 10 個月(在實際操作時,一般更傾向於做更少的改變)。手術的另一個優勢是總是會有能力出色的智慧體可供評估,這能顯著收緊實驗改變的迭代週期。對於 OpenAI Five 的目標(探索全新任務和構建全新環境)而言,持續性的訓練具有顯著的重大優勢。
圖 4:OpenAI Five 與 Rerun 的訓練過程
當然,在環境是預構建的和一開始就被很好理解的環境中,對「手術」的需求會很小。Rerun 消耗的資源僅有 OpenAI Five 的 20%:如果能提前獲取最終訓練環境,就沒有必要在不同的遊戲版本上開始訓練。
Rerun 的最終效能比 OpenAI Five 更好,與 OpenAI Five 最終版對戰的勝率超過 98%。OpenAI 團隊的想法是希望驗證最終的程式碼和超引數可以重現 OpenAI Five 的效能,因此他們就此停止了訓練。他們相信 Rerun 還能實現進一步的提升,不僅包括能夠繼續提升的效能,還有學習率和視野範圍等沒有最終確定的超引數。
「手術」過程讓 OpenAI 能成功地每週修改環境。但是,OpenAI Five 最終達到的水平還是遜於從頭開始訓練的模型所能實現的水平。學習如何在長時間訓練的同時又不影響最終效能是一個很有潛力的未來研究方向。
最後,儘管目前構想的「手術」還遠不夠完美,有了合適的工具,這種方法能在無需為重啟訓練的同時,將特定的變化整合進長時間執行的實驗中。