OpenAI 挑戰《索尼克》,阿里南大隊如何一舉奪魁?

OpenAI 挑戰《索尼克》,阿里南大隊如何一舉奪魁?

阿里妹導讀:近日,OpenAI舉辦了首屆強化學習競賽Retro Contest,比賽主題就是“用AI玩《刺蝟索尼克》遊戲”,吸引了全球數百支隊伍的競技追逐。最終,由阿里南大的聯合團隊Dharmaraja(法王)隊以壓倒性優勢獲得了冠軍。

今天,我們邀請了團隊的核心成員達卿,全面還原本次比賽背後的技術思考及理解

前言

OpenAI 挑戰《索尼克》,阿里南大隊如何一舉奪魁?

OpenAI 挑戰《索尼克》,阿里南大隊如何一舉奪魁?

這個競賽的目標,是評估強化學習算法從以往的經驗中泛化的能力。具體說,就是讓AI玩視頻遊戲《刺蝟索尼克》(世嘉公司開發的一款競速式2D動作遊戲),其基本上模擬馬里奧的遊戲方式,玩家在儘可能短的時間內到達目的地,索尼克可以通過不停加速來快速完成關卡,最後可能需要對抗BOSS。

之前也有外部的媒體對此進行過報道,但大多是直譯OpenAI的blog。這裡我將從我們的視角分析一下此次比賽,希望可以拋磚引玉,不當之處還請大家批評指正。

OpenAI的弦外之音

OpenAI是斷然不需要靠組織各類學科競賽來博取關注和擴大影響力的,這次破天荒的組織了這個OpenAI Retro Contest的比賽,其根本目的既不是類似商業公司尋找最優算法方案,亦不是擴展自己的人才庫,而是試圖立這樣一個flag:強化學習的強泛化性是通往通用人工智能的關鍵路徑之一。

我們首先來看看強化學習研究中如何評測這件事。不同於監督學習是從監督樣本中學習,強化學習可以自主地跟環境交互,並通過環境反饋的信號不斷調整策略得到自我提升,這個跟人類自主學習的模式非常接近。

但正是因為有大量的固有的標記樣本存在,使得監督學習在評估這件事情上的機制非常完善,類似CIFAR-10這樣的數據集,都非常明確地劃分好了訓練集和測試集,算法只需要在這樣的劃分下測試算法的精度,就可以和其他算法進行公平的比較。如此簡單、成熟而又公平的評估方法,促使了上一個十年的刷榜競賽,把語音識別、圖像檢測和識別以及自然語言處理等任務的精度提升到前所未有的程度。

反觀強化學習,由於沒法在固定的測試數據上評測,所以通常是需要研究者自己實現一個環境,然後彙報算法在這個環境中的性能,其不確定性要遠遠大於在固定數據上的測試精度(如果環境實現的有問題,可能會導致完全相反的結論),使得早年很多強化學習論文中的實驗結果被認可度,相較監督學習而言,其實要低很多。

幸運的是,領域內的學者很快就關注到了這個問題,共建了類似RL-Glue、RLPy、Arcade LearningEnvironment公共的環境庫。在這些庫中,研究者只需要實現智能體學習部分的代碼便可以完成評測。其中的集大成者,是後來居上的OpenAI的gym。除了公共環境之外,甚至允許研究者將其在gym框架下的評測結果上傳到gym的網站,從而自然地形成了每個任務上的算法排行榜,從而使強化學習評測更加趨於成熟和公平。

即便於此,對於近年來的強化學習的進展仍然存在不少質疑。其核心觀點大概有2個:深度強化學習並不work,真正work的可能僅僅是深度神經網絡;強化學習在簡單遊戲上動輒上千萬的訓練幀數,其本質上可能更接近在memorizing搜索到的解,而不是學到了真正的知識。

對於第一點其實沒有討論的必要,舉個例子,深度神經網絡只是一個建模工具,強化學習是一大類學習問題,而NLP則是一個更上層的應用問題,當你使用底層是神經網絡表示的強化學習算法,很好地解決了一個NLP中的一個具體問題時,你能區分是神經網絡、強化學習算法和NLP建模方法誰最重要麼?

但關於第二點的質疑,其實是致命的。我們先看看計算機視覺領域,我們現在可以實際使用到的人臉檢測,照片場景識別等應用都是基於算法工程師在訓練數據上得到的模型,這些模型在我們實際使用中(訓練數據並沒有我們的數據),仍然可以比較精準的檢測人臉,識別場景,其根本原因就在於,監督學習在訓練階段可以以相對比較容易的方式控制模型的複雜度,從而獲得較好的泛化性能。

然而這樣的結論在目前的強化學習研究中並不成立,甚至沒有能引起足夠多的重視。以下圖為例,一個在《極品飛車》遊戲中訓練的自動駕駛策略,如果直接應用到《QQ飛車》,99%的概率要撲街,類似的現象在Atari 2600遊戲中也可以觀察到。

OpenAI 挑戰《索尼克》,阿里南大隊如何一舉奪魁?

這個現象其實並不難解釋,我們在評估強化學習算法時,常規的做法仍然是在同一個環境訓練和測試,這種模式在單個環境學習到最優策略仍然很困難的歷史時期是有意義的,其至少可以比較模型類似監督學習中的“擬合逼近”能力,但可能並不適用於現在或者未來的強化學習研究中。

此外,很容易發現,類似的問題在人類學習中並不存在:一個極品飛車玩的很好的選手,一般也可以非常輕鬆的上手QQ飛車並很快也玩的非常好。基於以上所有的觀察和思考,我們不禁得出這樣的結論:一個更智能的學習算法,不僅可以在一個陌生環境中自主學習到最優策略,而且可以將知識總結泛化,使其在類似的環境中仍然可以表現良好且迅速適應。

因此,OpenAI此次參照監督學習中常規的模式“訓練樣本->驗證樣本->測試樣本”,設立了“訓練環境->驗證環境->測試環境”這一前所未有的方式。當然,類似監督學習中所有的樣本都要滿足i.i.d.假設,這裡訓練環境、驗證環境和測試環境也是滿足於一個環境分佈的,具體地,也就是索尼克遊戲。

索尼克遊戲是一個系列遊戲,按照在不同的場景可以細分為多個獨立的小遊戲,在每個小遊戲中也存在多個不同的關卡,但其核心元素都是相似的,因此非常適合作為一個元環境進行評測。需要指出的是,在此之前也有一些零星的研究在做類似的事情,但這些工作要麼是在非常簡單的toy domain上進行(換言之其對算法比較的結論可能是完全不置信的),要麼是在ALE環境中進行的(ALE中不同遊戲的相似度並不大),所以並沒有一個里程碑式的成果。

OpenAI 挑戰《索尼克》,阿里南大隊如何一舉奪魁?

如果你想深入瞭解強化學習,可以參考我們之前推出的電子書:《強化學習在阿里的技術演進與業務創新》。本書首次在工業界系統地披露強化學習在實踐應用的技術細節,其中更包含了阿里算法工程師對強化學習的深入理解、思考和創新。此書共有12個章節,作者跨越了多個阿里核心算法團隊,希望能和你一起交流、探討。

OpenAI 挑戰《索尼克》,阿里南大隊如何一舉奪魁?

《強化學習在阿里的技術演進與業務創新》免費下載:

https://102.alibaba.com/downloadFile.do?file=1517812754285/reinforcement_learning.pdf

溫馨提醒:

1、本書約20M,需要一定下載時間,請耐心等待哦。

2、流量不足的童鞋,建議將地址複製到PC端瀏覽器後打開下載。

參賽團隊

OpenAI 挑戰《索尼克》,阿里南大隊如何一舉奪魁?

本次比賽,阿里南大隊以壓倒性優勢獲得了冠軍(優勢從public leaderboard一直延續到final private leaderboard)。這支勝利之師成員包括達卿(筆者)、冷江、仁重、波克、胡張廣達(即將入職阿里)以及南京大學機器學習與數據挖掘研究所的俞揚副教授。其中冷江、波克和胡張廣達是今年暑假即將從學校畢業入職該團隊的“準員工”。一方面,考慮在他們入職前2個多月的閒暇時間,我們將這個比賽作為其在強化學習上的實戰演練課題,並在達卿,仁重和俞揚副教授的指導下,遠程合作(橫跨杭州-新加坡-南京)完成這次的比賽;另一方面,由於這次比賽的重點是強化學習在相似多場景中的泛化性和可遷移性,而這個問題在阿里多場景的背景下則尤為顯得重要,例如AE就有這樣的相似多場景:眾多的海外站點。因此,我們組織這3位準阿里員工,在我們的指導下,系統性完成了這次比賽。

同時,也非常感謝阿里臨在團隊和九豐團隊的大力支持。

賽題簡介

在這次比賽中,OpenAI開放了3類索尼克遊戲:Sonic The Hedgehog,Sonic The Hedgehog 2和Sonic 3 & Knuckles。其中每一種遊戲存在著若干的關卡(level),3個遊戲總計有58個關卡。每個關卡的畫面和任務都各不相同,在所有的關卡上,對刺蝟的動作控制是相同的(當然存在某些關卡上存在某些特殊的動作組合,即所謂的技能,但我們並沒有對此進行特殊建模)。

此外,關卡之間是共享部分元素的,即使一個新的關卡你完全沒有看過,但其中的元素A在某些訓練關卡上見過,某些元素B在另外一些關卡上見過等等,因此,是存在泛化的可能的。

OpenAI 挑戰《索尼克》,阿里南大隊如何一舉奪魁?

跟以往的監督學習算法類的比賽不同(通常只需要提交在測試樣本上的預測結果),此次比賽需要提交算法。具體地,將算法依賴的代碼和數據打包成docker鏡像,然後上傳至OpenAI的網站。在收到評測請求之後,OpenAI會針對每一個評測關卡(public leaderboard上有5個評測關卡,而final private test上則有11個),在配置有K80顯卡的aws instance上以獨佔GPU的方式運行我們的算法(感慨一下OpenAI的壕氣,畢竟有上百個團隊在比賽期間不停提交評測請求),學習時間被100萬個遊戲幀和12小時物理時長同時限制,任意條件滿足則程度退出。

在這個過程中,算法在評測關卡上的平均episode reward作為最終的分數,而總分則是在所有評測關卡上的平均。對於每一個這樣的關卡,任務是學習到一個從原始的遊戲的RGB圖像到遊戲手柄的12個物理按鍵的映射,以儘可能短的時間,讓智能體通關。對於這次比賽而言,任務是通過在訓練關卡上的預訓練,儘可能地讓算法在由專業的遊戲設計師重新設計的關於索尼克的全新關卡上,迅速(100萬幀)學習到最優通關策略。

技術方案

根據OpenAI提供的技術報告,針對這個問題,他們內部進行算法調研的結果顯示,取得性能最好的方案是joint PPO, 要遠勝於DQN的綜合改進大雜燴版本Rainbow。同時考慮到ppo對內存的要求要小很多(不像DQN類的算法動輒百萬的replay buffer ),且其樣本利用率要高很多,所以我們計劃首先從joint PPO開始,在訓練遊戲上得到一個全局策略,然後以此作為初始化權重,在測試遊戲上進行100萬幀的學習和測試。

具體地,我們採用了Deepmind在其Nature paper中描述的網絡結構:原始灰度圖像->3層卷積->1層稠密層->動作映射,並且結合在Atari2600上的一些訓練trick(幀隨機跳動、幀堆疊、獎賞縮放等),並在策略的輸入輸出上做了些微小的改進:

● 狀態空間:灰度圖像->RGB圖像。因為Atari遊戲相對簡單,所以灰度圖像提供的信息就足夠了,但索尼克遊戲所有的元素要豐富和複雜許多,所以我們直觀上覺得,灰度圖像提供的信息應該是不夠的。

● 動作空間:直接學習原始12個按鍵的組合顯然是不靠譜的(2^12個動作),結合官方提供的baseline和我們的經驗,抽象瞭如下10個離散動作(actions),其中[]表示的不按任何鍵,對應的就是在遊戲中等待,對應的操作在需要原地等待的關卡中非常有用。

buttons = ["B", "A", "MODE", "START", "UP", "DOWN", "LEFT", "RIGHT", "C", "Y", "X", "Z"]

actions = [['LEFT'], ['RIGHT'], ['LEFT', 'DOWN'], ['RIGHT', 'DOWN'], ['DOWN'], ['DOWN', 'B'], ['B'], [], ['LEFT', 'B'], ['RIGHT', 'B']]

● 獎賞函數:原始環境的獎賞函數是直接正比於智能體所在的x座標值,即

score ∝ x,由於不同遊戲通關所走的x的距離不等,所以這裡做了一個歸一化,使得所有遊戲上,智能體達到終點會得到一個9000的分數。

同時,為了鼓勵智能體以儘可能短的時間到達終點,在一個episode結束後,還會根據智能體通關的時間給予一個0-1000的獎勵,即在比賽開始即通關(雖然是不可能的)會有1000的獎勵,到比賽約定的4500步(對應的是5分鐘的遊戲時間)才通關則有0的獎勵,中間的線性插值可以得到。不難發現,相比Atari的稀疏獎勵,這裡其實已經把問題簡化了,除了1000的對通關時間的獎勵,關於通關本身的獎勵是稠密的:向前走就會有正向瞬時獎勵,向後退就會有負向瞬時獎勵。

這會顯著的加速學習,但也帶來一個致命缺陷,使得智能體的探索能力變得很弱,幾乎沒有回溯的能力,非常容易卡在一個需要回頭走另一條路徑的地方。針對這中情況,我們設計了一種非常巧妙的cache機制,使得智能體回退不產生負向獎賞,同時也避免了這種情況下智能體反覆前進後退的trivial解。

self.episode_negbuf = 0...

reward = env.step(action)if reward < 0 or self.episode_negbuf < 0:

self.episode_negbuf += reward

reward = 0

工程優化

不同於OpenAI使用MPI實現了joint PPO,我們選擇了更為方便的tensorflow的分佈式並行方案:ps節點作為參數服務器,worker節點用作採樣和梯度計算。具體而言,在每個worker中維護了一個retro遊戲的環境,該worker通過和這個環境交互產生四元組(s,a,r,s′)數據,並在這批數據上計算策略梯度,發送至參數服務器進行全局更新。

在一般的監督學習任務中,通常定義好圖,feed進數據直接sess.run就可以了,為了儘可能的利用GPU的並行,一般來說feed的數據的batch數肯定要遠大於1的。

然而在我們這裡每個worker中,其交互的是其中一個環境,為了收集訓練用的episode數據,計算流通常是這樣組織的:整個流程分為採集和訓練2部分,採集部分需要頻繁地和環境進行交互,在TF的op執行和環境的step函數執行之間不斷切換。等收集到了足夠的數據就運行訓練的op,這部分和監督的網絡是類似的。可能有同學要問了,難道沒有那種可以端到端訓練的強化學習框架麼?也不能說完全沒有,例如NIPS16年的best paper,但只是一個很初步的探索,離實用還有非常遠的距離。

OpenAI 挑戰《索尼克》,阿里南大隊如何一舉奪魁?

上面所示的結構在分佈式訓練下帶來2個顯著的性能問題:

  • 在採集數據階段,每次執行π(s)都會使worker向ps發起同步請求。在我們的每次訓練迭代中,會固定的採集8192步,則意味著每次迭代中至少需要從ps同步全局權重8192次。
  • 在只有一個環境的前提下,π(s)輸入的數據的batch只有1(只有一個狀態)),無法充分利用GPU並行。

對應的解決方案也很直接

  • 將π對應的actor網絡複製一份到本地,每次迭代之前先將全局的actor網絡同步至本地的actor網絡,再使用本地actor進行採樣。
  • 每個worker維護n份同一個環境的副本(在不同進程中,cpu上的並行),每次π(s)對n個狀態同時進行決策,即這裡s的batch數為n。值得指出的是,這裡的n並不是越大越好,因為總幀數固定的話,n越大則意味著學習算法在環境上的迭代次數變少了,所以真正的訓練中我們採用了n=10這個相對合理的數值。結合採樣步數8192,所以對應的訓練op的batch數是81920,這個是會撐爆顯存的,所以實際上我們將這將近8萬條樣本拆成若干個小batch分批執行,最終使得一張p100卡可以同時運行3個這樣的worker。

joint PPO訓練

在以上的實現基礎之上,我們開始了一個全局模型(暫且稱之為模型 A)的訓練,下圖是在所有58個訓練關卡上隨著訓練幀數遞增的平均得分

OpenAI 挑戰《索尼克》,阿里南大隊如何一舉奪魁?

上圖中的分數跳躍,對應的是解鎖了某一個技能,使得智能體可以向前方繼續走一長段距離。從上圖可以看出,這個單一全局模型A到1.21.2億幀之後基本就收斂了,大約平均在5500左右。我們將58個遊戲自己的學習曲線展示出來不難發現,仍然有大量的遊戲仍然在開始的地方卡住,如下圖所示:

OpenAI 挑戰《索尼克》,阿里南大隊如何一舉奪魁?

這裡的人類分數是按照如下標準進行的測試:人類選手在訓練遊戲上進行2個小時的練習,然後在測試遊戲上進行1個小時的測試,然後最終平均的分數。

分而學之

鑑於全局模型在訓練遊戲上已經收斂,我們接著將從整個模型出發,分別訓練每一個遊戲,並在此基礎之上,增加了一下獎賞。

  • 金幣的獎勵
  • 來到新位置(x,y)的獎勵
  • 在通關前死掉的懲罰 其中前2點依賴環境返回的info(在訓練環境可以取到,但測試環境中只有RGB圖像),第3點可以通過簡單的啟發式進行設計實現。

分而學之帶來的獎賞提升還是非常明顯的,綜合58個遊戲其平均分數提高至7000左右,我們稱這時的模型為Bs(因為有58個獨立模型)。

合眾為一

我們直觀上認為,之前的全局模型A的表達能力是足夠強的,只是joint訓練無法收斂到全局最優,所以在得到模型Bs之後,我們使用了DeepMimic方法去fine tune模型A,具體地,對PPO中的策略網絡,優化

OpenAI 挑戰《索尼克》,阿里南大隊如何一舉奪魁?

對價值網絡,直接做簡單的迴歸優化即可

OpenAI 挑戰《索尼克》,阿里南大隊如何一舉奪魁?

其中,為了防止策略過擬合訓練遊戲,我們在策略擬合的式子中加入了2項約束:更小的權重和更大的熵,都是限制策略的複雜度,使其學習到更加general的策略,以達到增強泛化性的目的。在DeepMimic收斂之後,我們繼續運行了joint PPO算法在所有遊戲上進行“收官”,畢竟純粹的模仿和強化學習本身的目標並不是完全一致。通過調節係數lambda和β,我們最終得到了模型C,其L2 norm和熵和模型A非常接近,並且作為一個單一模型,在所有訓練遊戲上得到了前所未有的分數,如下表所示:

OpenAI 挑戰《索尼克》,阿里南大隊如何一舉奪魁?

可以看到,和模型A同樣網絡、權重大小、熵的模型C,已經在訓練集上取得了接近7300的成績,對陣人類最好成績接近有45%的勝率。

線上探索

由於我們在訓練過程中使用了很多在測試取不到的信息,例如智能體的座標,所以在實際測試時,我們使用了一個非常簡單的替代方案,即通過圖像來判斷是否到達了一個新地方,由於我們這裡本質是在實現好奇心模型,所以這部分的近似也是可以的。

我們在以下三個視頻中分別展示了使用原始獎賞、增加對探索的鼓勵以及其進一步迭代的策略效果。從中可以看出如果僅僅使用原始的獎賞,智能體極容易困在需要回溯的路徑上,而隨著探索獎賞的加入,智能體甚至學會了在複雜機關上下樓的動作;隨著訓練的進一步迭代,智能體甚至找到了一個遊戲的bug,使其不需要下樓也可以迅速達到前方遠處。

OpenAI 挑戰《索尼克》,阿里南大隊如何一舉奪魁?

OpenAI 挑戰《索尼克》,阿里南大隊如何一舉奪魁?

OpenAI 挑戰《索尼克》,阿里南大隊如何一舉奪魁?

終極測試

最終,在public leaderboard上top10的隊伍被選擇進行最終的測試。在這個測試中,所有的隊伍提交的代碼將在11個由遊戲設計師設計的全新的索尼克遊戲上進行100萬幀的學習測試。為了避開隨機種子的影響,所有的測試都進行了3次,取平均成績作為最後的分數。我們提交的算法最終排名第一,其和第2,3名的學習曲線對比為:

OpenAI 挑戰《索尼克》,阿里南大隊如何一舉奪魁?

可以看到,在學習的初期,我們的優勢並不顯著。但隨著迭代的遞增,其他算法的學習曲線趨於收斂,而我們的算法仍然在穩定提升。下面的視頻顯示了我們的算法在不同的學習步數上的性能對比:

https://v.qq.com/x/page/i0720y0f0jd.html?ptag=qqbrowser

下面的視頻顯示了top3的團隊在某個遊戲中對通關路徑的覆蓋程度,可以看出我們的智能體以最快的速度完成了通關。

https://v.qq.com/page/o/7/m/o0720pylo7m.html?ptag=qqbrowser

思考和不足

  • 除此之外,我們還嘗試了很多方法,例如使用Yolo檢測遊戲裡的關鍵元素,雖然Yolo已經是state-of-the-art的檢測方法了,但是用在這裡還是太慢了。
  • 我們嘗試通過專家replay數據進行訓練,但相比於巨大的策略空間(從圖像到按鍵組合),replay的數據量看起來是遠遠不夠的。
  • 雖然我們在訓練階段得到了看起來最優的模型C,但實際上我們最終還是保守提交了模型A,因為C的泛化性能沒有我們想象的穩定(差於A),換言之,除了L2 norm和entropy,還有其他更重要的量衡量的策略的泛化性,目前尚沒有被人找到。

每天一篇技術文章,

看不過癮?

關注“阿里巴巴機器智能”,

發現更多AI乾貨。


分享到:


相關文章: