当前位置: 首页 > 科技观察

用Python写个Gameboy模拟器,还能训练AI模型:丹麦哥的大学项目火了

时间:2023-03-20 16:35:39 科技观察

感觉用Atari游戏研究人工智能有点“不够接地气”?现在我们可以使用Gameboy模拟器了。对于很多80后、90后来说,任天堂Gameboy代表了他们青春的很大一部分。很多我们熟悉的游戏最初都是在这台8位游戏机上搭载的,包括大家熟知的《马里奥》、《塞尔达》系列。对于国内的玩家来说,《口袋妖怪》系列应该是我们玩的最多的一款了。这款游戏机首次发布已经30年了,但人们对它的热情丝毫未减。昨天,一款用Python编写的Gameboy模拟器在社交网络上引起了广泛关注。师父的青春回来了?作者在Reddit上的帖子迅速获得了数千个赞。该项目的作者之一MadsYnddal宣布正式发布PyBoy1.0版本。什么是PyBoy?简而言之,它是一个完全用Python从头开始??编写的GameBoy模拟器,并支持通过API编写脚本。研究人员添加了类型定义,使得使用Cython编译软件成为可能,实现了与用C和C++编写的模拟器相当的性能。项目链接:https://github.com/Baekalfen/PyBoyFeaturesPyBoy被设计为通过Python访问,因此它支持和鼓励人们做实验研究,机器人和人工智能正在尝试。研究人员正在构建特定于游戏的包装器,目前允许程序员与俄罗斯方块和超级马里奥互动,而无需深入了解GameBoy。可以参考这个文档:https://docs.pyboy.dk。项目作者也想学习和尝试更多奇特的特性,根据大学项目的研究,他们在模拟器中加入了倒带功能,即可以在任何游戏中倒带时间。PyBoy模拟器架构1990年,任天堂为GameBoy申请了专利。下图显示了该专利中CPU、RAM、墨盒和显示器之间的集成和连接。来自GameBoy专利的架构图。基于此,PyBoy项目的成员用Python为每个组件开发了一个类,从而在“宿主系统”(系统运行Python)上构建了“客户端系统”的基础。这个客户端系统就是虚拟的GameBoy硬件,理论上它可以运行为GameBoy编写的每一个软件。下图显示了PyBoy模拟器中的所有类及其关系:PyBoy对强化学习意味着什么以及它与其他环境的比较这些年来,许多人开发了Gameboy模拟器,这是现在可以在计算机和手机上使用的工具。为什么要用Python写一个?当然是用来训练人工智能的。想玩游戏?Gameboy对于现在的人来说可能有点“上手难”。最接近通用人工智能的方法——强化学习通用人工智能的概念是指能够成功完成人类可以完成的任何智力任务的机器。目前,我们对人工智能的研究离这个目标还很远。吴恩达之前说过,深度学习做的只是高维的“曲线拟合”。与那些依赖预先收集的数据(甚至需要大量人工标记)的机器学习算法不同,强化学习是一种仅通过环境奖励进行训练的算法,其工作方式类似于人体内部的多巴胺系统。强化学习是目前最接近人类从经验中学习的能力的机器学习算法,尤其适用于智能体需要根据环境做出决策的场景。下图显示了RL代理如何学习仅以游戏图像作为输入的马里奥控制策略。为什么很多关于RL的研究都在Atari而不是其他更实际的问题上进行?RL的研究使用Atari作为基准主要有以下原因:Atari环境允许我们使用相同的算法测试多个不同的环境,以验证RL算法的通用性;由于输入只是游戏图像,因此增加了问题的复杂性。复杂;Atari为研究人员提供了一个公认的测试平台,可以公平地比较不同算法的性能;RL需要大量的交互式数据进行学习。在真实环境中进行实际测试之前,Atari是对算法的初步验证。提供了一个安全、快速、低成本的测试平台。下图为部分Atari环境:Atari、PySC2等环境与PyBoy对比。上一节介绍了在Atari环境中训练RL代理的许多优点。然而,随着强化学习的发展,这种相对简单的环境逐渐不再适用于当前新的强化学习研究。不久前,DeepMind提出的Agent57在所有Atari环境下超越了人类玩家的平均水平,这也预示着Atari环境下的RL研究逐渐接近尾声。更困难的环境包括PySC2,这是DeepMind和暴雪之间的合作,它需要智能体学习复杂的协调和对抗策略。尽管AlphaStar在这种环境下取得了骄人的成绩,但仍有许多问题需要解决。下面是PySC2环境的示意图。PyBoy环境的难度可以说介于Atari和PySC2之间,它为我们提供了验证RL性能的新基准。这种中等难度的设置使我们能够在将RL应用于更复杂的现实世界问题之前进行低成本且高效的测试。正如特斯拉的人工智能和自动驾驶视觉总监AndrejKarpathy所说,“在伸手去拿火箭筒之前,总是应该先试试BB枪。”Github介绍如何安装?如果你已经配置好可以正常运行Python的环境,那么安装会非常简单:通过包管理器安装SDL2(sudoaptinstalllibsdl2-dev或brewinstallsdl2)使用pipinstallpyboy直接从终端安装Pyboy$pyboyfile.rom使用PyBoy或在Python脚本中:frompyboyimportPyBoypyboy=PyBoy('ROMs/gamerom.gb')whilenotpyboy.tick():pass这个项目支持macOS、RaspberryPi(Raspbian)、Linux(Ubuntu)和Windows10.PyBoyAPI文档如果用户需要创建自己的机器人或AI,他们可以在PyBoy文档(https://baekalfen.github.io/PyBoy/index.html)中找到所有支持的外部组件,其中包括各种类及其用法很详细,这里就不赘述了。(下面的结构索引)PyBoy的简短示例可以作为Python中的对象加载。所以它可以从另一个脚本初始化,并且可以由该脚本控制和探测。查看gamewrapper_tetris.py,了解与游戏交互的原始“机器人”。当然,所有外部组件都可以在PyBoy文档中找到。对于一般的GameBoy文档,请查看PanDocs,其中包含每个主题的详细信息。这是一个从屏幕读取数据的简短演示,代码也可以在gamewrapper_mario.py中找到:0,file_path+"/..")#CheckiftheROMisgiventhroughargviflen(sys.argv)>1:filename=sys.argv[1]else:print("Usage:pythonmario_boiler_plate.py[ROMfile]")exit(1)quiet="--quiet"insys.argvpyboy=PyBoy(filename,window_type="headless"ifquietelse"SDL2",window_scale=3,debug=notquiet,game_wrapper=True)pyboy.set_emulation_speed(0)assertpyboy.cartridge_title()=="SUPERMARIOLAN"mario=pyboy.game_wrapper()mario.start_game()assertmario.score==0assertmario.lives_left==2assertmario.time_left==400assertmario.world==(1,1)assertmario.fitness==0#Abuilt-infitnessscoreforAIdevelopmentlast_fitness=0print(mario)pyboy.send_input(WindowEvent.PRESS_ARROW_RIGHT)for_inrange(1000):assertmario.fitness>=last_fitnesslast_fitness=mario.fitnesspyboy.tick()ifmario.lives_left==1:assertlast_fitness==27700assertmario.fitness==17700#Loosingalive,means10.000pointsinthisfitnessscoringprint(mario)breakelse:print("Mariodidn'tdie?")exit(2)mario.reset_game()assertmario.lives_left==2pyboy.stop()如果你在加载超级马里奥乐园ROM的情况下运行上面的代码,你将得到下面的图像和终端输出请注意,马里奥的形式显示为索引0、1、16,17.关于作者本项目的作者是AsgerAndersLundHansen、MadsYnddal和TroelsYnddal,他们都来自丹麦。毕业于丹麦哥本哈根大学的MadsYnddal表示,其实这款Gameboy模拟器可以追溯到他2015年的大学项目。Gameboy模拟器1.0版本已经出来,但开发者还有很多工作要做。项目开发者表示,可以推进的方向包括模拟器增加声音、颜色、Gameboy模拟连接,以及更多的游戏封装??,当然上面还有训练神经网络的例子。希望在人们的努力下,Gameboy上的游戏也能获得新生。更重要的是,它现在肩负着训练人工智能的任务。