那個爆火的“夢中修煉”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個時間步。
兩組檔案在./data
中儲存,一是obs_data_*.npy
(將64×64×3影像儲存為numpy陣列),二是action_data_*.npy
(儲存三維動作)
第五步:訓練VAE
上面我們介紹了VAE是操縱小車在環境中移動的一把手,現在我們就講講如何訓練它。這一步可能比你想象的要簡單的多,因為所需檔案只要obs_data_*.npy
文件就好了。不過溫馨提示一下,確保你已經完成了第四步,因為要之後將這些文件放於./data
資料夾中。
從命令列執行:
我們將從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中預先編碼的影像資料作為輸出。你可以通過執行下面的指令生成這些資料:
這將改變obs_data_* .npy
和action_data_*.npy
檔案中從batch 0到batch 9的資料,並且將它們轉化成RNN需要的正確格式完成訓練。
兩組檔案將儲存在./data
中,rnn_input_* .npy
儲存[z a]連線的向量,rnn_output_*.npy
儲存的是前一個時間步的z向量。
第七步:訓練RNN
上一步生成了RNN的資料後,訓練它只需rnn_input_*.npy
和rnn_output_*.npy
檔案就可以了。在這裡再次提醒:第六步一定要完成,這些檔案都要在./data
資料夾裡才可以。
在命令列執行下列程式碼:
這將在0到9的每批資料上訓練一個新的VAE。模型權重將被儲存到./rnn/weights.h5
中。new_model
標誌提示指令碼從頭開始訓練模型。
和VAE一樣,如果資料夾中存在weights.h5
並且沒有指定--new_model
標記,那麼指令碼將從該檔案載入權重,並繼續訓練現有模型。通過這種方式,您可以迭代地批量訓練RNN。
找不到RNN架構說明的可以去翻翻./rnn/arch.py
檔案,可能會讓你小小開心一下。
第八步:訓練控制器
這是一個愉快的章節。
上面,我們已經用深度學習搭建了一個VAE,它可以把高維影像壓縮成一個低維潛在空間;還搭好了一個RNN,可以預測潛在空間隨著時間推移會發生怎樣的變化。能走到這一步,是因為我們給VAE和RNN各自裝備了一個由隨機rollout data組成的訓練資料集。
現在,我們要使用一種強化學習方法,依靠名為CMA-ES的進化演算法來訓練控制器。
輸入向量有288維,輸出向量是3維。於是,我們一共有288 x 3 + 1 (bias) = 867個引數需要訓練。
首先,CMA-ES要為這867個引數,建立多個隨機初始化副本,形成種群 (population) 。而後,這個演算法會在環境中,測試種群中的每一個成員,記錄平均分。像達爾文的自然選擇一樣,分數比較高的那些權重就會獲得“繁衍”後代的資格。
敲下這個程式碼,給每個引數選擇一個合適的值,就可以開始訓練了:
如果沒有顯示器的話,就用這個程式碼:
其中,
--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檔案中。然後,下次我們就可以從存檔的地方繼續訓練。
在每一代繁衍完成之後,演算法的當前狀態和最佳權重集合都會輸出到./controller
資料夾。
第九步:視覺化
到這裡,我們的智慧體走過了200代,練到了883.13的平均分。它輪迴的天地是:Google Cloud,Ubuntu 16.04 vCPU, 67.5 RAM,步驟和引數都和這篇文章裡寫的一樣。
論文的作者大大們訓練出906的平均分,那是2000代修仙的結果,也是目前這個環境下的最高分了。他們需要的配置也高一些,訓練資料有10,000集,種群大小是64,計算機是64核等等。
將控制器的當前狀態視覺化,要敲上面這個程式碼。其中:
--filename
:這是你想要賦予控制器的那些優秀權重的json路徑。
--render_mode
:在螢幕上渲染環境。
--record_video
:把mp4輸出到./video資料夾:
--final_mode
:開始100集的控制器測試,輸出平均分。下面是個可愛的小Demo。
第十步:太虛幻境
前面已經有很多顆賽艇了,不過論文的下一小節著實讓我吃了一鯨。我感覺,這個方法還是很有現實意義的。
論文中介紹了在名為DoomTakeCover的另一個環境裡,獲得的美妙訓練結果。這裡的目標是讓智慧體學會躲避火球,活得越長越好。
這一章裡,我們可以看到,智慧體是如何在VAE和RNN聯合打造的幻境裡 (而非所處的環境裡) ,一步步解鎖遊戲技能的。
唯一不同的是,這裡的RNN還要學會預測,自己在下一個時間步裡撲街的概率。如此一來,VAE與RNN的組合可以生成一個自己需要的環境,再用它來訓練控制器。這便是浩瀚無邊的“World Model”了。
亦真亦夢的總結
我們可以把幻境學習的過程總結一下——
智慧體的原始訓練資料只是和真實環境的隨機互動而已。有了這些,它就能對世界執行規律產生一個潛在的理解——自然分組、物理原理,以及自己的行為會對世界的狀態產生怎樣的影響。
然後,依靠這份理解,智慧體便會為某個特定的任務,建立一套最佳的執行策略。這裡,它甚至不需要接受真實環境的考驗,只要在自己幻想出來的環境模型裡玩耍,就當測試了。
△ 那裡綠草如茵
就像小朋友初學走路,那是多麼生意盎然的場景啊。
作者系網易新聞·網易號“各有態度”簽約作者
— 完 —
加入社群
量子位AI社群16群開始招募啦,歡迎對AI感興趣的同學,加小助手微信qbitbot6入群;
此外,量子位專業細分群(自動駕駛、CV、NLP、機器學習等)正在招募,面向正在從事相關領域的工程師及研究人員。
進群請加小助手微訊號qbitbot6,並務必備註相應群的關鍵詞~通過稽核後我們將邀請進群。(專業群稽核較嚴,敬請諒解)
誠摯招聘
量子位正在招募編輯/記者,工作地點在北京中關村。期待有才氣、有熱情的同學加入我們!相關細節,請在量子位公眾號(QbitAI)對話介面,回覆“招聘”兩個字。
量子位 QbitAI · 頭條號簽約作者
վ'ᴗ' ի 追蹤AI技術和產品新動態
相關文章
- 周星馳的睡夢羅漢拳心法,現在AI也學會了:夢中“修煉”,醒來“實戰”AI
- 暗網世界,黑客可能用AI再造了一個“你”黑客AI
- 這樣做,你的APP也能成為下一個爆款APP
- 那個學Python 的同齡人,也許已經超越你了!Python
- 那個學Python的同齡人,也許已經拋棄了你Python
- 一個架構師的快取修煉之路架構快取
- 開發者技能修煉的五個等級
- 半年漲粉1000萬,這個AI聊天搭子是怎麼火的AI
- 軟體巨頭也都有一個硬體夢
- 【火爐煉AI】深度學習006-移花接木-用Keras遷移學習提升效能AI深度學習Keras遷移學習
- 【火爐煉AI】深度學習010-Keras微調提升效能(多分類問題)AI深度學習Keras
- 《贅婿》爆火之下,網路爽文是如何煉成的?
- 一個公式讓你35歲以後能越過越好!大神修煉心法公式
- 新火種AI|微軟扶持下一個OpenAI?Mistral AI新模型對標GPT-4,上線即擠爆微軟OpenAI模型GPT
- 首批開源超300個頂尖模型:這幾家中國「AI主力軍」,合力打造了一個AI模型社群「魔搭」模型AI
- 8個好用的資源網站,一定有你中意的那個網站
- 這個資料庫蒐集了2.4萬個“夢”!用AI分析打分,找出夢境現實關聯,幫你解夢資料庫AI
- css屬性中如果後面個三個值,那麼中間的那個一般代表左右元素的值。CSS
- 【火爐煉AI】深度學習009-用Keras遷移學習提升效能(多分類問題)AI深度學習Keras遷移學習
- 也許我就是那個“微軟的清潔工” (轉)微軟
- AI在用| 又是一年畢業季,給你找了個論文搭子Kimi+AI
- 開發手機軟體是個夢?不,你錯了!
- 是時候給你的產品配一個AI問答助手了!AI
- 【火爐煉AI】機器學習050-提取影像的Star特徵AI機器學習特徵
- 那個小白還沒搞懂記憶體溢位,只能用案例說給他聽了記憶體溢位
- 微軟修復了五個SandboxEscaper零日漏洞中的四個微軟
- typescript修煉指南(一)TypeScript
- 【細說遊戲 AI】這個 AI 好厲害,給我也整一個之狀態機 AI遊戲AI
- 帶你搭一個SpringBoot+SpringData JPA的環境Spring Boot
- 【火爐煉AI】深度學習005-簡單幾行Keras程式碼解決二分類問題AI深度學習Keras
- 曾經爆火的「流批一體」現在怎麼樣了?
- 換了馬甲也能認出“你” | 有了這個資料集,AI有望揪出變種勒索軟體AI
- m1晶片也能用的AI影像降噪軟體:Topaz DeNoise AI晶片AI
- 【火爐煉AI】機器學習041-NLP句子情感分析AI機器學習
- 【火爐煉AI】機器學習049-提取影像的SIFT特徵點AI機器學習特徵
- 【火爐煉AI】機器學習042-NLP文字的主題建模AI機器學習
- 【火爐煉AI】機器學習049-提取影象的SIFT特徵點AI機器學習特徵
- 搭個 Web 伺服器(一)Web伺服器