當前位置:
首頁 > 科技 > 那個爆火的「夢中修鍊」AI,你也能用Keras搭一個了

那個爆火的「夢中修鍊」AI,你也能用Keras搭一個了

原作:David Foster

林鱗 栗子 編譯自 Medium

量子位 出品 | 公眾號 QbitAI

上月,量子位報道了Google Brain的David Ha和「LSTM之父」Jürgen Schmidhuber的論文World Models。論文中習得周星馳睡夢羅漢拳的AI可在夢裡「修鍊」,好生厲害~

這篇文章就教你如何用Python和Keras搭建一個屬於自己的「夢境修鍊AI」。

開始教程前,先放上原研究的論文地址:

https://arxiv.org/abs/1803.10122

第一步:理解環境

我們要搭建一個能在2D車道環境中開車的強化學習模型,那麼這個環境從哪來呢?我推薦OpenAI GYM,可進入下方地址獲取。

環境獲取地址:

https://gym.openai.com/

在這個任務的每個時間步中,我們需要用64×64像素的車輛和環境的彩圖喂演算法,並且需要返回下一組操作,尤其當方向(-1到1),加速度(0到1)和制動(0到1)變化時。

這個動作將隨後被傳遞到環境中,之後再返回下一組操作,如此循環。

得分會隨著智能體跑過軌道而積累,隨著時間步消耗,每個時間步得-0.1分。例如,如果一個智能體用732幀跑完了軌道,那麼最後的得分就是1000-0.1×732=926.8分。

下面這張圖展示的是一個智能體在前200個時間步中執行的[0,1,0]的動作,但之後畫風一轉突然變成了隨機亂跑……不過這顯然不是個好策略。

OK第一步已經完成,我們接下來的任務是,訓練智能體理解它周圍環境的信息,確定下一步的最佳行動。

第二步:解決方案

開始第二步前先給大家推薦我們今天這篇論文的在線交互版~

交互版地址:

https://worldmodels.github.io/

接下來我將順著上面的這個方案,重點其中的幾部分是怎樣組合起來的。這樣吧,我們將虛擬環境與真實開車情況做對比,直觀理解一下這個解決方案。

這個方案由三部分組成,每一部分都需要單獨訓練:


一種變分自編碼器(VAE)

想像一下,當你在開車的同時考慮別的事情時,你不會分析視野中的每個「像素」。你的大腦會自動將視覺信息壓縮成更少的「本徵」實體,如道路的彎曲程度、即將到來的轉彎和相對於道路的位置,指揮下一步動作。

這就是VAE要做的——將64×64×3(RGB)的輸入圖像遵循高斯分布壓縮成一個32維的本徵矢量latent vector(z)。

這一步非常重要,現在對智能體周圍環境的表示變得更小了,因此學習過程將變得更加高效。


帶混合密度網路輸出層的循環神經網路(MDN-RNN)

如果你的決策中沒有MDN-RNN組件,那麼開車時可能是這樣的情景。

當你在開車時,每個場景都不會完全出乎你的意料。在我們這個程序里,這種前瞻性的思考由RNN完成,在我們這個例子中,LSTM中總共有256個隱藏單元,這個隱藏狀態的向量由h表示。

和VAE相似,RNN也試圖對汽車當前在環境中的狀態建立一個「本徵」理解,但這一次帶著一個目標:基於之前的「z」和之前的動作,預測下一個「z」可能是什麼樣子。

MDN輸出層僅允許出現下一個「z」從任何一個高斯分布中提取的情況。

在這篇World Models的研究中,下一個觀察到的潛在狀態可能從任何一種高斯分布中得到。


控制器

到目前為止,我們還沒講到關於選擇操作的事~這部分主要是控制器完成的。

控制器是一個緊密連接的神經網路,輸入z的聯結(長度為32的VAE當前潛在狀態)和h(長度為256的RNN隱藏態)。

這3個輸出神經元對應於三個動作,並按比例縮小到合適的範圍。


模擬「三方會談」

如果說你還是不太明白這三部分職責之間的聯繫,那我模擬一下行車過程中它們三方的對話,幫你形象理解一下。

VAE:前面看起來是條直路,向左有個輕微的拐彎,汽車正朝著道路的方向行駛(z)。

RNN:根據你的描述(z),以及控制器選擇上個時間步猛加速的行為,我將更新我的隱藏狀態(h),這樣下個觀察到的視野就會被預測為一條直線,但在視野中稍微偏左一點。

控制器:基於VAE (z)的描述和RNN (h)的當前隱藏狀態,我的神經網路輸出下一個動作為[0.34,0.8,0]。

這個動作將被傳遞給環境,然後返回更新後的視野,如此反覆循環。

看明白了吧?就是這三部分控制了車輛的移動。那麼接下來,是時候研究如何設置環境,幫訓練自己的智能體。

第三步:設置環境

如果你的筆記本性能比較高,可以在本地運行解決方案。對於電腦條件一般的程序猿們,我還是建議你用Google Cloud Compute,快還方便。

https://cloud.google.com/compute/

下面這些步驟我已經在Linux (Ubuntu 16.04)上測試過了——如果你要在Mac或Windows系統里裝,更改安裝包的相關指令即可。

跟我一步一步來——

1. 克隆存儲庫

儲存庫地址:

https://github.com/AppliedDataSciencePartners/WorldModels

在命令行中,找到想要克隆存儲庫的地方,輸入以下內容:

這個庫是由World Model的一作David Ha開發的實用estool庫改編的,他用Keras和TensorFlow後端實現了神經網路的訓練。

2.設置虛擬環境

我們需要創建一個Python 3虛擬環境(我用的是virutalenv和virtualenvwrapper)

3.安裝包

4.安裝requirements.txt

第四步:生成隨機rollout

對於賽車環境來說,VAE和RNN可以用於隨機的rollout數據上——也就是說,在每一個時間步中隨機採取行動產生的觀測數據。實際上,我們使用的是偽隨機動作,最開始會強迫汽車加速,讓它脫離起跑線。

由於VAE和RNN獨立於決策控制器,所以需要保證我們提供各種各樣的觀察結果,和各種各樣的動作,將它們存為訓練數據。

要生成隨機的rollout,可以從命令行運行以下指令:

或者在一台沒有顯示器的伺服器上運行以下指令:

這將產生2000次的輸出,每個rollout最長為300個時間步。

兩組文件在中保存,一是(將64×64×3圖像存儲為numpy數組),二是(存儲三維動作)

第五步:訓練VAE

上面我們介紹了VAE是操縱小車在環境中移動的一把手,現在我們就講講如何訓練它。這一步可能比你想像的要簡單的多,因為所需文件只要文檔就好了。不過溫馨提示一下,確保你已經完成了第四步,因為要之後將這些文檔放於文件夾中。

從命令行運行:

我們將從0到9的每批數據上訓練一個新VAE。

模型的權重將被存儲在中,是在提示腳本從頭開始訓練模型。

如果文件夾中有weights.h5,並且沒有指定標記時,腳本將從該文件載入權重,並繼續訓練現有模型。這樣,你就可以批量迭代VAE。

度低了,VAE架構規範在文件夾中。

第六步:生成RNN數據

現在我們有了訓練好的VAE,就可以用它生成為RNN訓練集。

RNN需要將VAE中編碼的圖像數據(z)和動作(a)作為輸入,並將VAE中預先編碼的圖像數據作為輸出。你可以通過運行下面的指令生成這些數據:

這將改變和文件中從batch 0到batch 9的數據,並且將它們轉化成RNN需要的正確格式完成訓練。

兩組文件將保存在中,存儲[z a]連接的向量,存儲的是前一個時間步的z向量。

第七步:訓練RNN

上一步生成了RNN的數據後,訓練它只需和文件就可以了。在這裡再次提醒:第六步一定要完成,這些文件都要在文件夾里才可以。

在命令行運行下列代碼:

這將在0到9的每批數據上訓練一個新的VAE。模型權重將被保存到中。標誌提示腳本從頭開始訓練模型。

和VAE一樣,如果文件夾中存在並且沒有指定標記,那麼腳本將從該文件載入權重,並繼續訓練現有模型。通過這種方式,您可以迭代地批量訓練RNN。

找不到RNN架構說明的可以去翻翻文件,可能會讓你小小開心一下。

第八步:訓練控制器

這是一個愉快的章節。

上面,我們已經用深度學習搭建了一個VAE,它可以把高維圖像壓縮成一個低維潛在空間;還搭好了一個RNN,可以預測潛在空間隨著時間推移會發生怎樣的變化。能走到這一步,是因為我們給VAE和RNN各自裝備了一個由隨機rollout data組成的訓練數據集。

現在,我們要使用一種強化學習方法,依靠名為CMA-ES的進化演算法來訓練控制器。

輸入向量有288維,輸出向量是3維。於是,我們一共有288 x 3 + 1 (bias) = 867個參數需要訓練。

首先,CMA-ES要為這867個參數,創建多個隨機初始化副本,形成種群 (population) 。而後,這個演算法會在環境中,測試種群中的每一個成員,記錄平均分。像達爾文的自然選擇一樣,分數比較高的那些權重就會獲得「繁衍」後代的資格。

敲下這個代碼,給每個參數選擇一個合適的值,就可以開始訓練了:

如果沒有顯示器的話,就用這個代碼:

其中,

:這個數字設置不要超過核數。

:這裡是每個worker要測試的,種群中的成員數量。

:這裡是種群里每個成員需要接受打分的集數。

:這裡是一集里最大的時間步數。

:這裡是在長達100集的最佳權重評估過程中,經歷了多少代進化。

在默認情況下,控制器每一次都會從頭開始運行,把當前狀態保存到controller目錄下的pickle文件中。然後,下次我們就可以從存檔的地方繼續訓練。

在每一代繁衍完成之後,演算法的當前狀態和最佳權重集合都會輸出到文件夾。

第九步:可視化

到這裡,我們的智能體走過了200代,練到了883.13的平均分。它輪迴的天地是:Google Cloud,Ubuntu 16.04 vCPU, 67.5 RAM,步驟和參數都和這篇文章里寫的一樣。

論文的作者大大們訓練出906的平均分,那是2000代修仙的結果,也是目前這個環境下的最高分了。他們需要的配置也高一些,訓練數據有10,000集,種群大小是64,計算機是64核等等。

將控制器的當前狀態可視化,要敲上面這個代碼。其中:

:這是你想要賦予控制器的那些優秀權重的json路徑。

:在屏幕上渲染環境。

:把mp4輸出到./video文件夾:

:開始100集的控制器測試,輸出平均分。下面是個可愛的小Demo。

第十步:太虛幻境

前面已經有很多顆賽艇了,不過論文的下一小節著實讓我吃了一鯨。我感覺,這個方法還是很有現實意義的。

論文中介紹了在名為DoomTakeCover的另一個環境里,獲得的美妙訓練結果。這裡的目標是讓智能體學會躲避火球,活得越長越好。

這一章里,我們可以看到,智能體是如何在VAE和RNN聯合打造的幻境里 (而非所處的環境里) ,一步步解鎖遊戲技能的。

唯一不同的是,這裡的RNN還要學會預測,自己在下一個時間步里撲街的概率。如此一來,VAE與RNN的組合可以生成一個自己需要的環境,再用它來訓練控制器。這便是浩瀚無邊的「World Model」了。

亦真亦夢的總結

我們可以把幻境學習的過程總結一下——

智能體的原始訓練數據只是和真實環境的隨機互動而已。有了這些,它就能對世界運行規律產生一個潛在的理解——自然分組、物理原理,以及自己的行為會對世界的狀態產生怎樣的影響。

然後,依靠這份理解,智能體便會為某個特定的任務,建立一套最佳的執行策略。這裡,它甚至不需要接受真實環境的考驗,只要在自己幻想出來的環境模型里玩耍,就當測試了。

那裡綠草如茵

就像小朋友初學走路,那是多麼生意盎然的場景啊。

作者系網易新聞·網易號「各有態度」簽約作者

加入社群

量子位AI社群16群開始招募啦,歡迎對AI感興趣的同學,加小助手微信qbitbot6入群;

此外,量子位專業細分群(自動駕駛、CV、NLP、機器學習等)正在招募,面向正在從事相關領域的工程師及研究人員。

進群請加小助手微信號qbitbot6,並務必備註相應群的關鍵詞~通過審核後我們將邀請進群。(專業群審核較嚴,敬請諒解)

誠摯招聘

量子位正在招募編輯/記者,工作地點在北京中關村。期待有才氣、有熱情的同學加入我們!相關細節,請在量子位公眾號(QbitAI)對話界面,回復「招聘」兩個字。


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 量子位 的精彩文章:

獨家 誰是何曉飛?
陸奇李開復余凱談AI十年機遇,Hinton和LeCun會如何評價?

TAG:量子位 |