那個爆火的“夢中修煉”AI,你也能用Keras搭一個了

量子位發表於2018-04-30
原作:David Foster
林鱗 栗子 編譯自 Medium
量子位 出品 | 公眾號 QbitAI

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

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

640?wx_fmt=gif&wxfrom=5&wx_lazy=1

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

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]的動作,但之後畫風一轉突然變成了隨機亂跑……不過這顯然不是個好策略。

640?wx_fmt=gif

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

第二步:解決方案

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

互動版地址:

https://worldmodels.github.io/

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

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

一種變分自編碼器(VAE)

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

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

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

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

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

640?wx_fmt=png

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

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

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

640?wx_fmt=png

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

控制器

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

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

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

模擬“三方會談”

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

640?wx_fmt=png

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

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

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

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

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

640?wx_fmt=gif

第三步:設定環境

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

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

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

跟我一步一步來——

640?wx_fmt=gif


1. 克隆儲存庫

儲存庫地址:

https://github.com/AppliedDataSciencePartners/WorldModels

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

640?wx_fmt=png

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

2.設定虛擬環境

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

640?wx_fmt=png

3.安裝包

640?wx_fmt=png

4.安裝requirements.txt

640?wx_fmt=png

第四步:生成隨機rollout

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

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

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

640?wx_fmt=png

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

640?wx_fmt=png

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

兩組檔案在./data中儲存,一是obs_data_*.npy(將64×64×3影像儲存為numpy陣列),二是action_data_*.npy(儲存三維動作)

第五步:訓練VAE

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

從命令列執行:
640?wx_fmt=png
我們將從0到9的每批資料上訓練一個新VAE。

模型的權重將被儲存在./vae/weights.h5中,--new_model是在提示指令碼從頭開始訓練模型。

如果資料夾中有weights.h5,並且沒有指定--new_model標記時,指令碼將從該檔案載入權重,並繼續訓練現有模型。這樣,你就可以批量迭代VAE。

度低了,VAE架構規範在./vae/arch.py資料夾中。

第六步:生成RNN資料

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

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

640?wx_fmt=png

這將改變obs_data_* .npyaction_data_*.npy檔案中從batch 0到batch 9的資料,並且將它們轉化成RNN需要的正確格式完成訓練。

兩組檔案將儲存在./data中,rnn_input_* .npy儲存[z a]連線的向量,rnn_output_*.npy儲存的是前一個時間步的z向量。

第七步:訓練RNN

上一步生成了RNN的資料後,訓練它只需rnn_input_*.npyrnn_output_*.npy檔案就可以了。在這裡再次提醒:第六步一定要完成,這些檔案都要在./data資料夾裡才可以。

在命令列執行下列程式碼:

640?wx_fmt=png

這將在0到9的每批資料上訓練一個新的VAE。模型權重將被儲存到./rnn/weights.h5中。new_model標誌提示指令碼從頭開始訓練模型。

和VAE一樣,如果資料夾中存在weights.h5並且沒有指定--new_model標記,那麼指令碼將從該檔案載入權重,並繼續訓練現有模型。通過這種方式,您可以迭代地批量訓練RNN。

找不到RNN架構說明的可以去翻翻./rnn/arch.py檔案,可能會讓你小小開心一下。

640?wx_fmt=png

第八步:訓練控制器

這是一個愉快的章節。

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

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

640?wx_fmt=gif

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

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

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

640?wx_fmt=png

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

640?wx_fmt=png

其中,

--num_worker 16:這個數字設定不要超過核數。

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

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

--max_length 1000:這裡是一集裡最大的時間步數。

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

--init_opt ./controller/car_racing.cma.4.32.es.pk在預設情況下,控制器每一次都會從頭開始執行,把當前狀態儲存到controller目錄下的pickle檔案中。然後,下次我們就可以從存檔的地方繼續訓練。

640?wx_fmt=jpeg

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

第九步:視覺化

640?wx_fmt=gif

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

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

640?wx_fmt=png

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

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

--render_mode:在螢幕上渲染環境。

--record_video:把mp4輸出到./video資料夾:

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

640?wx_fmt=gif

第十步:太虛幻境

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

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

640?wx_fmt=gif

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

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

亦真亦夢的總結

640?wx_fmt=gif

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

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

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

640?wx_fmt=gif 那裡綠草如茵

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

作者系網易新聞·網易號“各有態度”簽約作者


加入社群

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


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


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

誠摯招聘

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

640?wx_fmt=jpeg

量子位 QbitAI · 頭條號簽約作者

վ'ᴗ' ի 追蹤AI技術和產品新動態


相關文章