戰勝柯潔後,AI在悄悄潛入人類下一個智慧堡壘

近日,在 QCon北京2017上,來自阿里巴巴認知計算實驗室的技術專家龍海濤(花名德衡)發表了題為《星際爭霸和AI》的專題演講。《星際爭霸》一直是遊戲玩家心目中即時戰略類的經典之作,歷時十多年而不衰。

而如今它更成為深度強化學習、人工智慧演算法研究的一個主要平臺和工具。因為其蘊含了多智慧體協作、多工學習、巨集觀策略規劃等複雜問題,一旦取得部分突破和進展,對商業和社會發展都會帶來極大影響。如國外的 DeepMind、Facebook 等公司相繼投入大量人力基於它進行通用人工智慧的研究。

在本次演講中,德衡重點介紹了阿里巴巴如何在《星際爭霸》遊戲環境中研究人工智慧演算法,分享阿里在這方面研究嘗試中得到的初步成果,並重點闡述多智慧體協作在微觀戰鬥場景中的應用,以及未來在這個平臺上的進一步的研究方向等。

 

以下為演講全文:

 

大家下午好!我是來自阿里巴巴認知計算實驗室的龍海濤,今天主要跟大家聊一下“《星際爭霸》與人工智慧”的話題。首先我會介紹一下為什麼會選擇《星際爭霸》這個遊戲來做人工智慧前沿性的研究。 

1. 為什麼選擇《星際爭霸》作為人工智慧演算法研究的環境

 

首先可能大家有疑問,為什麼選擇《星際爭霸》這個遊戲來做我們AI研究平臺。阿里認知計算實驗室目前是掛靠在搜尋事業部下面,我們團隊的成員基本都是做搜尋、廣告、推薦、演算法這樣的背景,之前我們主要做的是CTR預估的優化,還有CVR轉化率的一些優化,從去年“雙11”之後,我們想在認知智慧方面做一些前沿性的探索,我們一致認為遊戲是一個研究AI演算法的絕佳平臺,首先它是非常乾淨的平臺,可以源源不斷產生資料,而且迭代非常快,就是說它的智慧是可以觀測到的。

另外,它離真實的場景和應用比較近,並且《星際爭霸》十多年來就是一個非常好的受大家歡迎的遊戲,積累了非常非常多的資料,這樣我們可以從之前的經驗去學習,這也是我們考慮的一個方面。最重要的,它對AI來講存在著非常大的挑戰,非常複雜,主要有以下六點:

 

第一點,它是一個不完全資訊下的環境。比起像圍棋或者象棋這種大家都可能看得見的、完全資訊下的博弈,《星際爭霸》是有戰爭迷霧的,所以必須去探路、偵查、瞭解對手的資訊,從而在不確定的情況下去做智慧的決策,這個是相對其他遊戲來講非常不同或者挑戰更大的一個方面。 

第二點,它有非常巨大的搜尋空間,圍棋的搜尋空間大概在10^170,《星際爭霸》在128×128的地圖上並且人口上限是400個unit的情況下,它的搜尋空間大概在10^1685,比圍棋高10個數量級,這還是在沒有算上其他狀態(比如說血量等等)的情況下。所以現有的任意一個單一的演算法是根本不可能解決《星際爭霸》裡面所有的問題的。 

第三點,它是一個即時對抗類的遊戲。下圍棋可以有一分鐘或者兩分鐘的思考時間,但是在《星際爭霸》裡,如果說正常遊戲大概是1秒鐘24幀,那麼你必須在42毫秒之內做出迅速的反應,而且這個反應不是一個action,而是一系列的action,每個unit都會採取行動,這對我們演算法的效能、效率、工程上的考慮都是非常大的挑戰。 

第四點,它需要智慧體有一個長期的規劃,而不是一個下意識的動作,是需要有記憶,需要考慮這場戰爭應該採取什麼樣的策略,中盤應該怎麼考慮,發展到後期又應該採取什麼樣的策略,而且這個策略的計劃是根據偵查到的所有的資訊動態去調整,這對人工智慧的挑戰是非常非常大的。 

第五點,在《星際爭霸》裡面要玩好的話,必須基於時序上、空間上去做推理,比如說地理位置的優勢,坦克如果架在哪裡可能會比較好,如果開分機在哪個位置去開會比較有利,甚至於軍營造在什麼地方,這些對於AI來說都需要進行一個空間上的推理。 

第六點,《星際爭霸》最高有400個unit,所以其實是需要多個智慧體協作的,需要多個兵種去配合,這也是對AI來講一個很大的挑戰。 

 《星際爭霸》裡面AI的研究或者競賽不是最近才出現的,其實在2010年的時候已經有大量的研究人員在研究《星際爭霸》裡面的AI,主要是以加拿大Alberta大學為主的研究力量,包括一些老師和學生,而且有三個固定的競賽和一些迴圈賽,大家在上面PK。

這一類AI的話是Classic AI,也就是沒有學習能力、沒有模型、也不需要訓練,而是基於預程式設計的規則,所以不是非常靈活,這種演算法下的AI其實離真正超過人類或者打敗人類目標還是非常非常遠的,它們可以打敗內建的AI,但是還遠遠比不上人類的專業選手,甚至連普通選手基本上也打不過。 

另外一類是Modern AI,也就是以智慧體自主學習為主的演算法,從去年開始這個領域火起來了。比如阿里巴巴和倫敦大學學院,最近在合作的基於《星際爭霸1》裡面做一些新的AI的嘗試。 另外就是Google DeepMind,去年11月份他們和暴雪合作,會基於《星際爭霸2》去開放一個API,讓大家基於《星際爭霸2》開發自己的AI演算法,另外像Facebook也有一些團隊做這方面的研究。

2. 深度強化學習

強化學習是非常接近人類學習的一個學習機制,通過這個Agent跟環境的互動,在互動當中學習。Agent會觀察周圍的環境,然後環境會給它一些反饋,Agent根據狀態和反饋會做出一些動作,這些動作會或多或少的影響這個環境,環境會根據這個動作反饋一些Reward,Reward可能是獎勵的也可能是懲罰的,Agent根據這樣的試錯,不斷的去調整。

Agent背後有兩個概念非常重要,一個是不停的優化策略,什麼樣的狀況下采用什麼樣的Action是合理的,另外一個是用價值函式評估當前的狀態它的價值是怎麼樣的。 

強化學習跟深度學習結合,就叫深度強化學習。因為深度學習或者神經網路是非常適合去做這種表示學習的,可以表示成一個複雜的函式。policy或者value用神經網路去逼近的話,在工程上或者效率上是非常好的提升。

以AlphaGo的例子來講,在訓練的時候分成三個階段,第一個階段,從人類的棋譜裡面學習人類的先驗的知識,通過監督學習學習一個較好的、勝率較高的policy network;第二個階段,基於監督學習學習出來的policy network,然後自我對弈,通過policy gradient再去優化policy network,這就比之前學出來的policy
network要更好;第三階段,再用學出來的強化學習版的policy network自我對弈,獲得一個最佳。

3. 多智慧體協作

 

其實目前為止所有的AI的智慧體比較成功的一些應用基本都是這種單個的Agent,其實對於人類來講,協作智慧是智慧體的一個非常大的方面,我們的祖先智人為什麼可以統治地球,其中一個很大的原因就是,他們學會了大規模的協作,而且是非常靈活的協作。可以想象一下,未來全部都是這種AI的智慧體,它們能不能自我學習到人類水平協作的一個智慧呢?

 

我們用了一個詞Artificial Collective Intelligence,這對現實和未來都有非常大的意義。比如手機淘寶,現在絕大部分流量背後都是一個演算法推薦出來的,不管廣告還是搜尋其背後都是AI的智慧體在做,目前這些智慧體都是各出各的優化,或者推出自己的商品。

其實我們在考慮的是,比如手機淘寶首頁裡邊有愛逛街、猜你喜歡這種位置,那麼他們能不能夠協同地去推薦一些這樣的商品,從而可以讓使用者的體驗最好,讓平臺的價值最大化。其實以後可能都是演算法經濟、AI經濟,都是這種AI的Agent,比如滿大街可能都是自動駕駛的無人車,他們之間是不是也需要一些協作,讓交通出行效率能夠達到最大化。

 

最近我們在《星際爭霸》裡的微觀戰鬥場景下,提出來一個多智慧體雙向協作網路,關於這個網路的詳細內容大家感興趣可以下載我們的paper看一下,這個工作是我們跟UCL一起合作完成的,用來探索或者解決多智慧體協作的問題。

 

這是我們提出來的BiCNet(Multiagent Bidirectionally-Coordinated Net)的網路結構,它其實也是比較經典的結構,分成兩部分,左邊這部分是一個policy的網路,就是說從下往上會把《星際爭霸》的環境進行一些抽象,包括地圖的資訊、敵方單位的血量、攻擊力,還有我方unit的資訊,抽象出來形成一個共享的State,經過一個雙向的RNN這樣的網路,進行充分的雙向的溝通,再往上每個Agent去得出自己的Action。

比如我到某一個地方去攻擊誰。左邊這個policy network就是對於當前的狀態應該採取什麼行動,右邊就是一個value的network,根據前面policy得出來的Action,還有抽象出來的State進行評估,Q值大概是多少,做出一個預判。當採取這些行動以後,這個環境就會給出相應的反饋,一些Reward來說明這步打的好還是不好,然後會通過一個Reword從右邊這個網路下來,去反向傳播更新裡面的引數。 

這個網路有幾點比較好的設計:

第一,它的scalability比較好,《星際爭霸》裡面打仗的時候隨時可能會有傷亡,這個Agent死掉以後這個網路不是還可以正常的工作,包括源源不斷湧現的新的Agent進來,是不是也是可以工作。我們看到雙向網路引數是共享的,所以是不會有影響的;

第二,我們在中間用了這樣一個雙向網路以後,其實是在一個效率和效能之間做了比較好的平衡,如果用全連線網路的話,計算量會過大。但是我們用一個雙向網路,前面告訴你大概要做什麼樣的Action,回來再告訴前面的人他們採取了什麼樣的Action,一結合,最後算出來應該追加的策略是什麼樣子,從實際來看效果也是非常好的。

其實我們認知計算實驗室在設計一些演算法或者模型的時候會參考神經科學裡邊目前的一些研究成果,我們認為研究認知心理學、大腦、類腦的研究或者神經科學,對於做人工智慧應該有兩個好處。

第一個好處就是,神經科學具有啟發性,就是當你在一些具體的問題或者場景裡面去思考的時候,會遇到一些問題,這些問題可能是從來沒有人解過的,如果神經科學、交叉科學裡有類似的這種結構或者演算法,這些可能會很好的解決你的問題,帶來演算法上的一些啟發。反過來另外一點,神經科學也可以幫你做驗證,你設計一個演算法以後,如果神經科學裡面有類似的結構,那麼很大概率這個演算法是可以工作的。

其實我們的Actor-Critic網路在人腦裡面也是有相應的對應,左邊就是Actor-Critic這個網路,右邊是我們的大腦,大腦裡邊紋狀體就是負責Actor、Critic兩部分,這個紋狀體腹部是負責Critic這部分,背部是負責Actor這部分,Reward下來以後我們大腦會計算,這與預期的Reward有什麼差距,這個差距就會以多巴胺的形式影響到Actor,下一次你就要按照這個去調節,讓下一次Action做的更好一點。其實多巴胺體現在我們的演算法裡面就是TD
error,也就是我們算的Reward的誤差,這其實是一個很好的對應。

4. 實驗平臺和實際效果

 

前面是網路架構的設計,為了實現這樣一個演算法模型,我們搭了一個實驗平臺,這個實驗平臺就是基於Facebook的TorchCraft,它是把《星際爭霸1》和Torch封裝在一起,但是我們比較習慣於TensorFlow和Python,所以在上面做了一個封裝,再把這套架構放在這個OpenAI標準介面裡邊,大家有興趣可以試一下。 

這個架構主要分成兩部分,對應剛才說的強化學習,左邊是Environment,其實就是《星際爭霸》這個遊戲,包括引擎,還有裡面的DLL,DLL基於BWEnv,這是一個官方認可的DLL。基於這個BWEnv DLL把內部的狀態、指令封裝起來,其實這就是一個Server,右邊就是Agent,是一個Client,這樣你可以連上很多的Agent玩這個遊戲。

中間是傳遞的資訊,Environment會把它每一幀的資料吐給Agent,Agent會把每一幀的資料抽象成狀態,然後再把這個State送到model裡面去學習或者做預測,反過來會預測出來一些Action,這些Action會封裝成指令,再發回給《星際爭霸》的Environment,比如說開槍或者逃跑,這個是我們搭的這樣一個《星際爭霸》的實驗平臺。

下面是我們這個實驗平臺做到的一些效果,總結起來有五種可觀測的智慧:

 第一種,可以配合走位。這個例子就是三個槍兵打一個Super的小狗,這個小狗是我們編輯過的,血量非常大,一下子打不死。三個槍兵打一個小狗,a/b這兩個圖,在訓練的早期其實是沒有學會太多的配合意識,所以他們走位的時候經常會發生碰撞,經過可能幾萬輪的訓練以後,他們慢慢學會了配合隊友的走位,這樣大家撞不到一起。

 

第二個場景,這個配合就是邊打邊撤,Hit and Run這樣的技能,這個例子就是三個槍兵打一個狂徒,利用遠端攻擊的優勢來消滅敵人。

 第三種,掩護攻擊。剛才三個槍兵打一個狂徒的時候是同時撤退,但是在這個場景下有些槍兵可能會去吸引這個小狗或者去阻擋一下,讓另外兩個槍兵抓住這個時間空隙來消滅這個小狗。非常有意思的一點就是,這種協作不是在任何情況下都會出現的,如果你的環境不是那麼的有挑戰性,可能它就是簡單的Hit
and Run就足夠了,如果我們的環境更嚴苛一點,比如這個小狗血量調高,攻擊力從3調到4,或者血量從210調到270,發現它又學會了另一種更高階的掩護攻擊的協作,這就非常有意思了。

 第四種,分組的集火攻擊。這個例子是15個槍兵打16個槍兵,大家想想應該怎麼取勝?策略可能3個槍兵或者4個槍兵自動組成一組,這3個槍兵先幹掉一個、再幹掉一個,就是把火力集中,但又不是15個槍兵打1個,而把火力分散一點,最後可能我們這方還剩6個槍兵,對方可能全部消滅掉了,這個都是通過很多輪次的學習之後他們自動去學到的這樣一個配合。

 

第五種,不光是槍兵之間學會配合,還可以多兵種配合,異構的Agent的配合。這個例子就是,兩個運輸機,每個運輸機帶一個坦克去打一頭大象,正常來講,兩個坦克打一個大象肯定是打不過的,加上運輸機的配合以後,大象攻擊某一個坦克的時候,運輸機會及時的把這個坦克收起來,讓大象撲空,同時另外一個運輸機趕緊把它的坦克放下去,去攻擊大象,這樣一來一回可能大象一點便宜佔不到就被消滅了,這個是基於我們之前的做出BiCNet一個協作的展現。

5. 關於未來的一些思考

但是《星際爭霸》裡其實不光是微觀戰鬥,其實更難的是巨集觀的策略方面,怎麼樣“巨集觀 微觀”打一整個遊戲,這樣其實我們也有一些思考,可能不是特別成熟,但是我們可以一起探討一下。

 第一點,要玩一個full-game,如果是簡單的單層次的強化學習,可能解決不了問題,因為action
space實在太大了,一個比較自然的做法就是做層級式的方式,可能上層是策略規劃,下面一層就是它的戰鬥、經濟發展、探路、地圖的分析等等,這樣的話一層一層的,就是高層給下層設定一個goal,下層再給下面一層設計一個goal,其實這跟人的問題分解是比較類似的。

 第二點,我們覺得值得去研究和探討的是模仿學習,Imitation Learning,剛剛講的AlphaGo的例子也是Imitation
Learning,第一步通過監督學習學習比較好的策略,再把監督學習學好的策略通過自我的對弈去提升,在《星際爭霸》裡面更需要這種模仿學習,比如說我們兩個槍兵打一個小狗的時候,我們認為一個好的策略是一個槍兵吸引小狗在那兒繞圈,然後另外一個槍兵就站在中心附近開槍,把這個小狗消滅,兩個槍兵一滴血可以不死。但是這種策略是比較難學習的,所以我們先給它人為的讓這個槍兵在裡面畫圈,畫上幾步之後槍兵自己學會畫圈了,帶著小狗,然後另外一個槍兵在後面追著屁股打,這種探索就非常的有效。

 

第三點,我們叫Continual Learning,如果要邁向通用智慧,這是繞不過去的課題。Continual Learning像人一樣,我們學會了走路,下一次我們學會了說話,我們在學說話的時候可能就不會把走路這件事情這個本領忘掉,但是在《星際爭霸》一些場景的時候,神經網路學到A的時候再去學B,這個時候可能會把A的事情忘掉。

舉個例子,一開始我們訓練一個槍兵打一個小狗,這個小狗是電腦裡邊自帶的AI,比較弱,這個槍兵學會了邊打邊撤,肯定能把小狗打死。我們再反過來訓練一個小狗,這個小狗去打電腦槍兵,這個小狗學會最佳策略就是說一直追著咬,永遠不要猶豫,猶豫就會被消滅掉,所以它是一條惡狗,一直追著槍兵咬。

然後我們把這槍兵和小狗同時訓練,讓他們同時對弈,這樣發現一個平衡態,就是槍兵一直逃,狗一直追,《星際爭霸》設計比較好的就是非常平衡。然後這個槍兵就學會了一直跑,我們再把這個槍兵放回到原來的環境,就是再打一個電腦帶的小狗,發現它也會一直跑,它不會邊打邊撤。你發現它學習的時候,學會了A再學會B,A忘了,這個其實是對通用人工智慧是非常大的挑戰,最近DeepMind也發了一個相關工作的Paper,這也是一個promising的方向,大家有興趣可以去看一下,他們的演算法叫EWC。

最後一點,前面有說到幾大挑戰,其中有一大挑戰就是長期的規劃,長期規劃裡邊我們認為一個比較好的做法就是,給這種強化學習裡面去引入Memory的機制,這也是目前的一個比較火的方向,像Memory Networks、DNC,要解決的問題就是,我們在學習的過程當中應該記住什麼東西,從而使得我們可以達到一個很好的最大的Reward。