這周,機器學習頂級會議 NIPS 2017 的論文評審結果已經通知到各位論文做者了,許多做者都立刻發 Facebook/Twitter/Blog/ 朋友圈分享了論文被收錄的喜訊。你們的熟人 Facebook 人工智能研究院研究員田淵棟也有一篇論文入選,論文名爲「ELF: An Extensive, Lightweight and Flexible Research Platform for Real-time Strategy Games」。這篇論文介紹了他們構建的強化學習研究平臺 ELF,爲環境設計、高速訓練、算法優化等重要任務提供了整套高效易用的解決方案,而且還一併把這個平臺開源了。田淵棟本人也在平臺開源後發表了一篇知乎專欄,介紹了關鍵思想和開發中的一些小故事。如下雷鋒網 AI 科技評論根據論文對 ELF 平臺作一個更詳細的介紹。php
ELF 整體介紹git
ELF 名字的來源是 Extensive, Lightweight, Flexible 的首字母縮寫,意指這個平臺涵蓋的內容廣闊、具備輕量化設計、還有高靈活性。這是一個爲強化學習研究人員設計的平臺,它爲遊戲提供了多樣化的屬性、高效率的模擬和高度可定製的環境設置。在這個平臺上不只能夠更改遊戲的參數,也能夠構建新的遊戲。強化學習方法的訓練也集成在了環境中,深刻並且具備高靈活性;對並行發生的事件的模擬尤爲進行了優化。基於 ELF,做者們設計了一個即時戰略(RTS)遊戲引擎,其中包含了三個初始環境,分別爲 Mini-RTS、搶旗子和塔防。Mini-RTS 是一個迷你的定製化即時戰略遊戲,它包含了全部星際遊戲中的基本變化(戰爭迷霧,收集資源,建造部隊,用部隊攻擊和防護等等)。這個 Mini-RTS 遊戲在 4 核 MacBook Pro 上的運行速度高達 16.5 萬幀 / 秒,這比其它現有環境的速度提升了一個數量級。如此之高的訓練速度就讓人類首次能夠端到端地訓練出一個可以完成整場比賽的人工智能,用來對抗遊戲內置的基於規則的 bot 玩家。更進一步地,基於 ELF 的人工智能在 6 個 CPU 和 1 個 GPU 上只須要一天的時間就能夠完成訓練。玩另外兩個遊戲的人工智能在訓練時也有類似甚至更高的訓練效率。github
許多真實世界的場景和複雜的遊戲(好比星際),本質上都是分爲不一樣的層次的。做者們創建的即時戰略遊戲中的內置 bot 能夠掌握全部的遊戲數據,並且帶有一個內置層次化指令系統;這樣的指令系統讓任意控制層次上的訓練變得可行。 正如在論文中展現出的,層次化的控制系統讓做者們得以訓練出可以完成整場比賽的人工智能,它不只可以表現出最高層次的遊戲策略,也能用內置的技巧處理低階的指令。以往的即時戰略遊戲研究都只關注了低階的局部戰術戰役情形。另外一方面,對遊戲數據的全面掌控也給監督學習訓練帶來了可能性,只須要小規模的內部數據就能夠。算法
ELF 對用於訓練的環境和參與者之間互動關係的變化具備很是高的適應性,這樣的表現得益於 EFL 採用的 C++/Python 混合框架。這其中包括了一對1、多對一和一對多映射。現有的強化學習訓練環境(好比 OpenAI 的 Gym 和 Universe)都只能在一種 Python 接口上封裝一個遊戲,這就讓切換互動關係變得很麻煩。ELF 的並行部分是用 C++ 編寫的,這對加速模擬訓練過程相當重要。最後,ELF 能夠用來承載任意用 C/C++ 編寫的遊戲,包括 Atari 系列遊戲、棋類遊戲和物理引擎,只要寫一個簡單的適配軟件就能夠。後端
在 PyTorch 編寫的靈活的強化學習後端支持之下,做者們與衆多的基準模型進行了對比,而且討論了訓練中使用到的有效技巧。論文中展現的第一個結果是玩部分信息即時策略遊戲的 AI,它送經過端到端的方式訓練的。做者們使用了 A3C(Asynchronous Advantages Actor-Critic)模型,探索了幀跳躍、時間視域、網絡架構、序列學習等等設計方法。結果代表帶有 Leaky ReLU 和 Batch Normaliztion 的網絡在長期視界訓練和漸進序列訓練下,跟內置的基於規則的 AI 進行 Mini-RTS 完整比賽能夠取得超過 70% 的勝率。在其它遊戲中還取得了更好的結果。網絡
ELF 架構多線程
ELF 使用了經典的生產者 - 消費者模型,生產者玩 N 局遊戲,每局遊戲都在一個單獨的 C 線程中。當遊戲中的一組 M 個遊戲當前狀態就緒的時候,對應的遊戲會被鎖定,這組狀態經過 daemon 送進 Python 一側。消費者(例如執行器、優化器等等)經過 Python/C++ 界面得到帶有歷史記錄的成組的遊戲感知,而後把回覆發回給鎖定的這組遊戲;原本鎖定後在等待下一步操做或者下一個值的這組遊戲就能夠繼續運行了。架構
ELF 執行架構框架
爲告終構的簡潔性,生產者和消費者目前在同一個進程中進行。不過它們也能夠分開在不一樣的進程中,甚至在不一樣的機器上。在訓練(或者評估)開始以前,不一樣的消費者能夠要求提供不一樣長度的歷史狀態。好比一個執行器須要的的狀態歷史比較短,而一個優化器須要的狀態歷史就比較長。iphone
以下圖是 ELF 的用法示例。
ELF 初始化
ELF 主體循環
根據論文中的介紹,ELF 的架構有以下幾個特色:
用 C 語言編寫,具備多線程能力。現代強化學習方法常常須要很高的並行訓練程度,在多樣的情境下得到更豐富的經驗。然而多數現有的強化學習環境(Open AI 的 Gym 和 Universe,RLE,Atari,Doom)提供的 Python 接口只能封裝一個遊戲實例。這樣致使的結果就是,應用現代強化學習方法的時候須要在 Python 代碼中編寫並行計算機制。然而,因爲 Python 中全局解釋器鎖 GIL 的限制,Python 中線程級別的並行化只能發揮出多核 CPU 很小的一部分性能。進程級別的並行化也會給帶來進程間額外的數據交換開銷,而且增長框架設計難度。相比之下,用 C 線程實現的並行化在多核 CPU 上的拓展性要好得多。
環境與模型之間的靈活配置。ELF 能夠支持一個到多個消費者,每個消費者均可以從收到的一組狀態中瞭解到當前環境的情況;消費者通常就是一個神經網絡模型。這些不一樣的消費者之間能夠選擇分享一些參數、能夠更新權重、能夠存在於不一樣的進程甚至不一樣的計算機上。這種架構就爲遊戲環境和模型更換互動關係提供了很高的靈活性。能夠爲每個遊戲環境各自分配一個模型,就是 " 一對一 " 的,好比 A3C,這種狀況下每一個智能體都有單獨的一個模型副本用來進行預測和更新。相似地,能夠把多個環境分配給一個模型,就是 " 多對一 ",好比 BatchA3C 或 GA3C,模型能夠進行批量的前向預測,更好地利用 GPU。模型裏一樣能夠包含前向規劃的方法,好比蒙特卡洛樹搜索(MCTS)和自我對局,同一個環境可能要接收多個模型計算出的多個結果,也就是 " 一對多 "。在 ELF 中,這些訓練設定都只須要很小的改動就能夠完成。
高度可定製以及統一的接口。在做者們的 RTS 引擎中實現的遊戲能夠用原始像素數據或者遊戲內部的低維數據進行訓練。相比感知類的任務,遊戲內部的數據對邏輯推理類的研究任務更爲重要。值得一提的是,ELF 一樣支持基於網格的視覺渲染,便於 debug 時嘗試不一樣情境。
ELF 提供了一個統一的接口,能夠承載任何用 C/C++ 編寫的現有程序,包括 Atari 系列遊戲、棋類遊戲和自定義的 RTS 遊戲引擎,只需一個簡單的適配器便可。這就可讓現有強化學習方法的多線程遊戲和訓練變得很容易。基於這個 RTS 引擎,做者們一併編寫了三個完善的遊戲環境,以下圖。(結構)
ELF 功能結構。做者們基於 ELF 平臺開發了 RTS 引擎,基於引擎實現了三個遊戲環境
強化學習後端。做者們提出了一個基於 Python 的強化學習後端軟件。它的設計很是靈活易用,便於實現模型中的強化學習方法。其中實現了 A3C、策略梯度、Q-Learning、信任區域策略優化等多個基準方法,基本都不須要很長的 Python 代碼就能夠。
即時戰略遊戲(RTS)
研究人員們廣泛認爲即時戰略遊戲是象棋和圍棋後的下一我的工智能的大挑戰。在即時戰略遊戲中,玩家通常須要收集資源、建造單位(建築、小兵等等),而且在戰爭迷霧中探索環境(有限的視野以外的區域是不可見的)進攻敵人或者進行防護,直到分出勝負。即時戰略遊戲的特色是極高並且一直在變化的行動空間(好比 10 個單位,每一個單位有 5 種可能的選擇,行爲空間就是 510)、微妙的遊戲情況以及大幅度延時的回報。典型的職業選手一分鐘能夠進行 200~300 個操做,而一場遊戲一般要進行 20 到 30 分鐘。
直接用在研究中的即時戰略遊戲引擎不多。面向消費者的遊戲(好比星際 一、2)都有着複雜的動態變化、單位交互和圖像表現,玩這些遊戲也長期以來被證實是一件複雜的事情。除此以外,它們並非開源的,外部程序沒法得到遊戲內部的狀態,無法簡單地用在研究中。開源的即時戰略遊戲有 Spring、OpenRA、Warzone 2100,它們關注的是複雜的圖像和特效、簡潔的用戶界面、穩定的網絡鏈接、靈活的地圖編輯器和即插即用的遊戲 mod。它們中大多數都採用了基於規則的 AI,沒有可以高於實時速度運行的設計、並且也沒有提供可以直接用於現代機器學習架構的接口。其它的一些即時戰略遊戲也有各類各樣的限制致使它們不適用於機器學習研究。
爲了獲得高速、可定製、適合用於強化學習的即時戰略遊戲環境,做者們本身編寫了一個 RTS 遊戲引擎。控制單位、移動、攻擊、特定技能、對其它單位的影響等等基礎設定包羅萬象,並且這個引擎設計了具備不一樣層次的指令集,只要改變可用的指令、可用的單位、特定狀況下引起的單位操做三個要素,就能夠構建出新的遊戲。引擎中也爲此提供了易用的工具。引擎中集成的基於規則的 AI 也能夠用相似的方法進行拓展。在 ELF 中,做者們一併提供了三個遊戲,Mini-RTS、搶旗子和塔防。這三個遊戲都具備如下的特色:
足夠複雜的遊戲性。每一個遊戲中的單位都是以真實座標移動的,具備體積和碰撞檢測,它們的動做也是須要佔用時間的。RTS 引擎是時間觸發型的,在每一次觸發到時候,遊戲中的 bot 會根據觀察到的信息作出決定、給單位下達命令。而後這些命令就被執行、遊戲狀態發生變化,遊戲就繼續執行。儘管這樣的遊戲機制算不上簡單,Mini-RTS 遊戲仍是可以在 MacBook Pro 筆記本上跑出每一個核心 40K 幀 / 秒的高速度,這個速度比多數現有的環境要高出一個數量級。這樣,在單臺機器上也只須要一天就能完成 AI 模型的訓練。
內置的層次化命令結構。一個智能體能夠下達戰略型的命令,好比 " 侵略性更強的站位 ",能夠下達戰術型的指令,好比 "hit and run",微操型的也能夠,好比單獨拉回一個單位以免吃到傷害。理想情況下,一個強有力的智能體應當掌握全部級別的命令;不過實際中的經常使用作法是關注某一個特定級別的指令層級別,而後把其它層次留給硬性的規格處理。爲了提供這樣的可能性,這個 RTS 引擎使用了一個層次化的指令系統,它可以爲遊戲提供不一樣層次的控制能力。高層次的指令衍生出的低層次指令可能會影響到全部的單位;一個低層次的、發給特定單位的持續動做指令須要佔用幾回出發的時間,這期間每次觸發的時候能夠給單位發送當即型的指令。
內置的基於規則的 AI。與遊戲環境一塊兒,做者們設計了基於規則的 bot。這些內置 bot 能夠掌握地圖中全部的信息而且按照固定的策略行動(好比造 5 個坦克而後攻擊地方基地)。這些 AI 的行動方式就是先發出高層次的指令,而後翻譯成低層次的指令並執行。
有了 ELF,研究員們第一次能夠在即時戰略遊戲中訓練可以玩整局遊戲的 AI,而且取得了比內置的 AI 強得多的表現。相比之下,其它現有的即時戰略遊戲 AI 要麼是基於規則的,要麼專一於戰術執行。
測試
做者們在 ELF 中的遊戲裏測試評估了這個平臺的可用性。
執行性能
能夠看到,隨着使用的 CPU 核心數目的增長,每一個核心的平均性能表現並無發生大的變化。ELF 的高效與可拓展性可見一斑。相比之下,OpenAI 的 Gym 要提升性能就困可貴多。
A3C 模型訓練表現
基於 A3C 的 AI 模型對戰內置基於規則的 bot 的勝率
因爲訓練輸入是稀疏且混雜的,做者們嘗試構建了帶有 Leaky ReLU 和 Batch Normalization 的 CNN 模型。BN 能夠經過正態化每一個濾波器的輸出來穩定訓練中的梯度變化,Leaky ReLU 則能夠保留帶負號的線性響應信號,這在輸入特徵稀疏的情境中很是重要。能夠看到,兩種方法結合之後的效果格外地高。
組合訓練提升模型表現
做者們在測試中發現,組合訓練對 AI 訓練很是重要。他們的作法是,在訓練 AI 模型的時候,先讓內置 AI 玩必定的時間,而後交給要訓練的 AI 接着玩。這就下降了遊戲初始時的難度,並且給遊戲帶來了更多的變化,避免掉進局部最小值裏。
總結
這樣,ELF 不只用合理的結構設計提供了一個包含一組遊戲設計選項的研究平臺、一個輕量級的遊戲模擬器和一個靈活的實驗環境,實際使用中也確實能給強化學習研究人員帶來很大的便利。在 ELF 的基礎上,前向建模、層次化強化學習、不肯定規劃、複雜行爲空間強化學習等方法也能夠在即時戰略遊戲中獲得更高效的研究。引用田淵棟在知乎專欄裏的話說:" 若是你們對強化學習和遊戲 AI 有興趣,這個框架會提供很大幫助 "。