用Python寫Gameboy模擬器,還能訓練AI模型:丹麥小哥大學項目火了

2020-12-15 機器之心Pro

機器之心報導

機器之心編輯部

感覺用 Atari 遊戲研究人工智慧有點「不夠接地氣」?現在我們可以使用 Gameboy 模擬器了。

對於很多 80 後、90 後來說,任天堂 Gameboy 代表了青春的很大一部分。很多我們耳熟能詳的遊戲都是最初搭載在這款 8 位遊戲掌機上的,包括鼎鼎有名的《馬裡奧》、《塞爾達》系列。對於國內玩家來說,我們玩得最多的則應該是《口袋妖怪》系列了。

這款遊戲機距離首次發布已過去了 30 年時間,不過人們對於它的熱情卻絲毫不減。昨天,一款利用 Python 編寫的 Gameboy 模擬器在社交網絡上吸引了人們的廣泛關注。

爺的青春回來了?作者在 Reddit 上發出的帖子迅速獲得了上千點讚。

該項目的作者之一 Mads Ynddal 宣布,PyBoy 的 1.0 版正式發布。

PyBoy 是什麼?

簡而言之,它是一個完全用 Python 從頭開始編寫的 Game Boy 模擬器,並且支持通過 API 編寫腳本。研究者添加了類型定義,使其可以使用 Cython 編譯軟體,從而獲得與用 C 和 C++編寫的模擬器相媲美的性能。

項目連結:https://github.com/Baekalfen/PyBoy

特點

PyBoy 被設計成通過 Python 訪問,因此支持並鼓勵人們做實驗研究,機器人和人工智慧在作此嘗試。研究者正在構建遊戲特定的包裝器,目前,包裝器可讓程式設計師與俄羅斯方塊和超級瑪麗進行交互,而不需要對 Game Boy 有深入的了解。可以參考該文檔:https://docs.pyboy.dk。

項目作者還想學習和嘗試更多奇特的功能,根據大學項目的研究,他們向模擬器添加了倒回功能,也就是說,您可以在任何遊戲中倒回時間。

PyBoy 模擬器架構

1990 年,任天堂為 Game Boy 申請了專利。下圖展示了該專利中 CPU、RAM、盒帶和顯示屏之間的集成與連接。

Game Boy 專利中的架構圖。

PyBoy 項目成員基於此在 Python 中為每個組件制定類(class),從而在「主機系統」上為「客戶系統」搭建了基礎(系統運行 Python)。該客戶系統就是虛擬的 Game Boy 硬體,理論上它能夠運行為 Game Boy 編寫的每一個軟體部分。

下圖展示了 PyBoy 模擬器中所有類及其關係:

PyBoy 對強化學習的意義以及與其他環境的比較

這些年來,已有很多人開發過 Gameboy 模擬器,現在的電腦和手機上都有可運行的工具。為什麼要用 Python 來寫一款呢?當然是用來訓練人工智慧的。

想打遊戲?Gameboy 對於現在的人來說恐怕有點「難以上手」。

最接近通用人工智慧的方法——強化學習

通用人工智慧這一概念指的是機器能夠成功完成任意一件人類能夠做到的智力型任務。目前我們對 AI 的研究距離這一目標還差很遠的距離,吳恩達之前就表示過,深度學習做的僅是高維的「curve fitting」。

不同於那些依靠預先收集數據(甚至需要大量人工標記)的機器學習算法,強化學習是一種僅通過環境獎賞進行訓練的算法,其工作機制類似於人體內部的多巴胺系統。強化學習是目前最接近於人類從經驗中學習這一能力的機器學習算法,尤其適用於智能體需要根據其所處環境進行決策的情景。

下圖展示了 RL 智能體是如何僅以遊戲圖像作為輸入,來學習馬裡奧控制策略的。

為什麼大量關於 RL 的研究都在 Atari 上進行,而不是其他更實際的問題?

關於 RL 的研究使用 Atari 作為基準的原因主要有如下幾點:

Atari 環境能夠讓我們使用相同的算法測試多個不同的環境,驗證 RL 算法的通用性;

由於輸入僅為遊戲圖像,增加了問題的複雜性;

Atari 為研究人員提供了一個公認的測試平臺,能夠較為公平地比較不同算法之間的性能;

RL 需要大量的交互數據進行學習,在真實環境中實際測試之前,Atari 為算法的初期驗證提供了一個安全、快速、低成本的測試平臺。

下圖為一些 Atari 環境的展示:

Atari、PySC2 之類環境與 PyBoy 對比

上一小節介紹了在 Atari 環境中訓練 RL 智能體的諸多優勢,然而隨著 RL 的發展,這一相對較簡單的環境逐漸不再適用於目前新的 RL 研究。不久之前,由 DeepMind 提出的 Agent57 在所有 Atari 環境中表現均超越了人類玩家平均水平,也預示著在 Atari 環境上的 RL 研究逐漸進入尾聲。

更困難環境有諸如 DeepMind 與暴雪合作的 PySC2,需要智能體學會複雜的協同、對抗策略。雖然 AlphaStar 在這一環境中取得了令人矚目的成果,但仍存在很多亟待解決的問題。以下為 PySC2 環境示意圖。

PyBoy 環境的難度可以說介於 Atari 與 PySC2 之間,它為我們提供了一個驗證 RL 性能的新基準。在將 RL 應用於更複雜的實際問題之前,我們可以先在這一難度適中的環境中進行低成本、高效的測試。

就像特斯拉的人工智慧和自動駕駛視覺總監 Andrej Karpathy 說的,「One should always try a BB gun before reaching for the Bazooka.」

Github 介紹

如何安裝?

如果已經配置了一個能夠正常運行 Python 的環境,那麼安裝會非常簡單:

通過軟體包管理器安裝 SDL2(sudo apt install libsdl2-dev 或是 brew install sdl2)

使用 pip install pyboy 安裝 Pyboy

可以直接從終端 $ pyboy file.rom 使用 PyBoy 或者在 Python 腳本中使用:

from pyboy import PyBoypyboy = PyBoy('ROMs/gamerom.gb')while not pyboy.tick(): pass

該項目同時支持 macOS, Raspberry Pi (Raspbian), Linux (Ubuntu), 以及 Windows 10.

PyBoy API 文檔

如果用戶需要創建一個自己的機器人或者是 AI,可以在 PyBoy Documentation (https://baekalfen.github.io/PyBoy/index.html) 找到所有用以支持的外部組件,其中各種類及其用法都非常詳細,這裡不再一一贅述。(如下圖結構索引)

簡短示例

PyBoy 可以作為 Python 中的對象加載。所以它可以從另一個腳本進行初始化,並可以由該腳本控制和探測。看一下 gamewrapper_tetris.py 上一個粗糙的「機器人」,正在與遊戲進行交互。當然,所有的外部組件都可以在 PyBoy 文檔中找到。

對於一般的 Game Boy 文檔,可以查看 Pan Docs,其中包含了每個主題的詳細信息。

以下是從屏幕讀取數據的簡短演示,該代碼也可以在 gamewrapper_mario.py 中找到:

import osimport sysfrom pyboy import PyBoy, WindowEvent# Makes us able to import PyBoy from the directory belowfile_path = os.path.dirname(os.path.realpath(__file__))sys.path.insert(0, file_path + "/..")# Check if the ROM is given through argvif len(sys.argv) > 1: filename = sys.argv[1]else: print("Usage: python mario_boiler_plate.py [ROM file]") exit(1)

quiet = "--quiet" in sys.argvpyboy = PyBoy(filename, window_type="headless" if quiet else "SDL2", window_scale=3, debug=not quiet, game_wrapper=True)pyboy.set_emulation_speed(0)assert pyboy.cartridge_title() == "SUPER MARIOLAN"

mario = pyboy.game_wrapper()mario.start_game()assert mario.score == 0assert mario.lives_left == 2assert mario.time_left == 400assert mario.world == (1, 1)assert mario.fitness == 0 # A built-in fitness score for AI developmentlast_fitness = 0print(mario)

pyboy.send_input(WindowEvent.PRESS_ARROW_RIGHT)for _ in range(1000): assert mario.fitness >= last_fitness last_fitness = mario.fitness

pyboy.tick() if mario.lives_left == 1: assert last_fitness == 27700assert mario.fitness == 17700 # Loosing a live, means 10.000 points in this fitness scoringprint(mario) breakelse: print("Mario didn't die?") exit(2)

mario.reset_game()assert mario.lives_left == 2

pyboy.stop()

如果你在加載了 Super Mario Land ROM 的情況下運行上述代碼,則將在下面得到圖片和終端輸出。值得注意的是,Mario 的形態顯示為索引 0,1,16,17。

作者簡介

該項目的作者 Asger Anders Lund Hansen、Mads Ynddal 和 Troels Ynddal 均來自丹麥。畢業於丹麥哥本哈根大學的 Mads Ynddal 表示,事實上這一 Gameboy 模擬器可以追溯到 2015 年他在大學期間的項目。

Gameboy 模擬器的的 1.0 版發布了,但對於開發者們來說還有很多事可以去做。項目研發者表示,目前可以推進的方向包括為模擬器加入聲音、彩色、Gameboy 模擬連線,以及更多遊戲的封裝,當然還有在其之上訓練神經網絡的示例。

希望在人們的努力下,Gameboy 中的遊戲也能重獲新生。更重要的是,它現在還有了訓練人工智慧的任務。

相關焦點

  • 這個丹麥小哥的項目火了!他用Python寫了個遊戲機
    連結:https://www.reddit.com/r/Python/comments/g484d4/today_im_releasing_pyboy_v100_a_game_boy_emulator/、https://github.com/Baekalfen/PyBoy/最近有一個叫PyBoy的開源項目火了
  • AIOpen 預訓練語言模型專刊徵稿
    2018 年 ELMo、BERT 和 GPT 的成功發布,表明了預訓練語言模型(PLM)的成功,隨後又在自然語言理解和生成方面取得了重大突破。目前,在探索更有效的預訓練架構方面,已經做了很多卓有成效的工作,比如使用跨模態數據、跨語言數據和結構化知識等方法改進預訓練語言模型,或將 PLM 創新地應用於各種與 NLP 相關的任務。
  • 手把手:用Python搭建機器學習模型預測黃金價格
    新年第一天,讓我們嘗試用python搭建一個機器學習線性回歸模型,預測金價!自古以來,黃金一直作為貨幣而存在,就是在今天,黃金也具有非常高的儲藏價值,那麼有沒有可能預測出黃金價格的變化趨勢呢?答案是肯定的,讓我們使用機器學習中的回歸算法來預測世界上貴重金屬之一,黃金的價格吧。
  • 一行代碼不用寫,就可以訓練、測試、使用模型,這個項目幫你做到
    用戶無需編寫一行代碼即可使用機器學習模型,只要有 yaml 或 json 文件,來描述你想做什麼即可。一行代碼不用寫,就可以訓練、測試和使用模型,還有這樣的好事?最近,軟體工程師 Nidhal Baccouri 就在 GitHub 上開源了一個這樣的機器學習工具——igel,並登上了 GitHub 熱榜。
  • 介紹TensorFlow物體檢測API訓練神經網絡、Python腳本尋找威利的過程
    與傳統的計算機視覺圖像處理方法不同的是,它只使用了少數幾個標記出威利位置的圖片樣本,就訓練成了一套「尋找威利」的系統。 訓練過的圖像評估模型和檢測腳本發布在作者的GitHub repo上。 本文介紹了用TensorFlow物體檢測API訓練神經網絡、並用相應的Python腳本尋找威利的過程。
  • 七夕節脫單「神助攻」,AI教你寫情話
    熱心的說明:下面是講技術的環節,想了解怎麼用的小夥伴可以快速往下滑ERNIE-GEN是面向生成任務的預訓練-微調框架,首次在預訓練階段加入span-by-span 生成任務,讓模型每次能夠生成一個語義完整的片段。在預訓練和微調中通過填充式生成機制和噪聲感知機制來緩解曝光偏差問題。
  • ai本身涉及到的東西有哪些?核心是什麼
    人工智慧的大多數技術都可以寫出像網頁一樣的代碼,可以使用類似python的庫。也有相應的專用語言支持ai,主要是一些工具語言(比如python的pypcgl,perl的scip)。部分ai庫內置了機器學習的算法,這些算法實際上大多都是在離散數學中的概率論中的數學模型。
  • 轉型AI產品經理,原來不需要學那麼深的算法和數學模型
    大概可以用以下幾個標籤簡單概括我:前網際網路產品經理、大學學渣、非計算機專業、不懂編程,可以說是除了瞎逼逼,啥也不會…4)有粉絲等不及喬治·馬丁老爺子寫《冰與火之歌》第六部,就自己用LSTM算法學習了《冰與火之歌》的前五部後續寫了第六部,據說AI這部作品中還揭示了前幾部中埋了很久的懸念
  • 作詞家下崗系列:教你用 AI 做一個寫歌詞的軟體
    其中:x(t)x(t)代表在序列索引號tt時訓練樣本的輸入。同樣的,x(t1)x(t1)和x(t+1)x(t+1)代表在序列索引號t1t1和t+1t+1時訓練樣本的輸入。h(t)h(t)代表在序列索引號tt時模型的隱藏狀態。
  • 築造AI抗疫防線,百度開源業內首個口罩人臉檢測及分類模型
    今天,百度宣布免費開源業內首個口罩人臉檢測及分類模型。該模型可以有效檢測在密集人流區域中佩戴和未佩戴口罩的所有人臉,同時判斷該者是否佩戴口罩。廣大開發者和企業廠商可通過免費開源的AI模型,快速完成軟體開發,為打贏疫情阻擊戰貢獻科技力量!
  • 讓騰訊大佬告訴你,寫python到底用什麼IDE合適
    不管你是 Python 新手還是老鳥,肯定糾結過一個問題:到底用什麼編輯器寫 Python 代碼好?比如說,你喜歡使用Notebook,這不能說有大佬推薦你使用pycharm,你就馬上放棄Notebook,或者今天突然 vs code這個IDE火起來來,你就立馬轉戰vscode剝開IDE的功能說,你真的喜歡用嗎,你用的習慣嗎,每個IDE都有自身的優點,使用什麼IDE關鍵在自己,即便是你覺得自己使用的IDE
  • 百度再創中國AI速度 不用寫代碼一站式搞定工業質檢定製AI模型
    柳州源創電噴技術有限公司在校企合作項目下,基於百度EasyDL零門檻AI開發平臺創建了一個閥座智能檢測模型,正確率已達95%以上,實現了使用機器自動化快速高準確率的檢測方式,為公司全年節省超60萬成本。
  • 醫學生福利:3D列印創造低成本、高保真器官模擬器
    2020年8月18日,白令三維從外媒獲悉,西英格蘭大學列印研究中心(CFPR)的一個團隊正在利用3D列印技術製作逼真的器官模型,用於手術訓練。據研究人員介紹,該項目的目的是創建媲美人體組織 "外觀、彈性和一致性 "的器官模型。
  • 學會了玩街霸Ⅱ的AI,你怕不怕?
    值得一提的是基於圖像觀察空間缺失的修改:DQN使用模型來預測哪些行動最佳,而不是用窮舉法測試每個可能的行動。畢竟考慮到觀察空間的大小,探索每個可能的行動幾乎是不可能的。模擬器連接在我們訓練人工智慧之前,我們必須把它連接到街頭霸王上。Gyroscope可以通過iOS和Unity的SDK連接。
  • 一個模型擊潰12種AI造假,各種GAN與Deepfake都陣亡
    訓練AI辨別真偽剛才生成的數據集,包含了11個模型生成的假圖。不過,真假分類器並不是用這個大合集來訓練的。真正的訓練集裡,只有英偉達ProGAN這一個模型的作品,這是關鍵。△ProGAN過往作品展團隊說,只選一個模型的作品用來訓練,是因為這樣的做法更能適應現實任務:現實世界裡,數據多樣性永遠是未知的,你不知道自己訓練出的AI需要泛化到怎樣的數據上。所以,乾脆就用一種模型生成的圖像來訓練,專注於幫AI提升泛化能力。
  • 如何用 Python 寫一個安卓 APP ?
    22點24分準時推送,第一時間送達  編輯:技術君 | 來源:youerning  上一篇:  正文  前言  用 Python 寫安卓 APP 肯定不是最好的選擇,目前用Java和 kotlin
  • 零基礎快速入門python教程,結合新手練習的5大項目
    一行寫多個語句Python是一個語句放在一行,行尾可以選擇性的加上;但如果想在一行放多個語句,就需要用;來分隔語句:a = 1; b = 2; c = 3;雖然這在語法上可行,但不是一個好習慣,絕大多數的編程規範都是要一行寫一個語句.
  • 直播丨商湯科技:如何做模型量化,訓練極低比特網絡
    一、課程信息主題:如何做模型量化,訓練極低比特網絡時間:4月9日(周四)20:00-21:00觀看連結:↓↓↓http://www.mooc.ai/open/course/786?from=leiphonecolumn_mooc0408二、分享提綱1、如何訓練極低比特(<4bit)的網絡2、如何訓練高效的二值化網絡3、如何用量化技術來加速模型訓練
  • 手把手教程:如何從零開始訓練 TF 模型並在安卓系統上運行
    定義模型體系結構然後我們將用 cnn 定義網絡架構。>訓練模型 然後我們使用 model.fit()來訓練模型。python 代碼轉換 如果你可以訪問模型訓練代碼,則這是轉換的首選方法。請參閱下面關於如何使用 TFLite 模型運行推斷的 python 代碼片段。示例輸入是隨機輸入數據,你需要根據自己的數據更新它。
  • 一行代碼不用寫,就可以訓練、測試、使用模型,這個star量1.5k的...
    用戶無需編寫一行代碼即可使用機器學習模型,只要有 yaml 或 json 文件,來描述你想做什麼即可。一行代碼不用寫,就可以訓練、測試和使用模型,還有這樣的好事?最近,軟體工程師 Nidhal Baccouri 就在 GitHub 上開源了一個這樣的機器學習工具——igel,並登上了 GitHub 熱榜。目前,該項目 star 量已有 1.5k。