OpenAI研究 宇宙
openai发布了 Universe,这是一个软件平台,用于测量和训练 AI 在全球游戏、网站和其他应用程序中的通用智能。
Universe 允许 AI 代理 像人类一样使用计算机:通过查看屏幕像素并操作虚拟键盘和鼠标。我们必须在我们期望它们解决的所有任务上训练 AI 系统,而 Universe 让我们可以训练一个单一的代理来完成人类可以用计算机完成的任何任务。
4 月,我们 推出了 Gym,这是一个用于开发和比较 强化学习 (RL) 算法的工具包。使用 Universe,任何程序都可以变成 Gym 环境。Universe 通过在VNC远程桌面后面自动启动程序来工作 ——它不需要对程序内部、源代码或机器人 API 的特殊访问。
今天的发布包含一千个 环境 ,包括 Flash 游戏、 浏览器任务以及 slither.io 和 GTA V等游戏。其中数百个已准备好用于强化学习,几乎所有都可以使用 universe Python 库自由运行,如下所示:
import gym
import universe # register Universe environments into Gym
env = gym.make('flashgames.DuskDrive-v0') # any Universe environment ID here
observation_n = env.reset()
while True:
# agent which presses the Up arrow 60 times per second
action_n = [[('KeyEvent', 'ArrowUp', True)] for _ in observation_n]
observation_n, reward_n, done_n, info = env.step(action_n)
env.render()
我们的 目标 是开发一个单一的人工智能代理,可以灵活地将其过去在宇宙环境中的经验应用到快速掌握陌生、困难的环境,这将是迈向通用智能的重要一步。有很多方法可以提供 帮助:允许我们使用您的游戏、在 Universe 任务中训练代理、(很快)集成新游戏或(很快)玩游戏。
在 EA、Microsoft Studios、Valve、Wolfram 和许多其他公司的支持下,我们已经获得 Universe AI 代理的许可,可以自由访问游戏和应用程序,例如 Portal、 Fable Anniversary、 World of Goo、 RimWorld、 Slime Rancher、 Shovel Knight、 SpaceChem、 Wing Commander III、 命令与征服:红色警戒 2、 辛迪加、 魔毯、 镜之边缘、 Sid Meier 的半人马座阿尔法星和 Wolfram Mathematica。我们期待整合这些以及 更多.
背景
人工智能领域在过去几年中取得了飞速发展。计算机现在可以 以前所未有的准确度看、 听和 翻译 语言。他们还在学习 生成图像、 声音和 文本。强化学习系统, AlphaGo,打败围棋世界冠军。然而,尽管取得了所有这些进步,我们正在构建的系统仍然属于“狭义人工智能”的范畴——它们可以在特定领域实现超人的表现,但缺乏在该领域之外做任何有意义的事情的能力。例如,AlphaGo 可以在围棋中轻松击败你,但你不能向它解释不同棋盘游戏的规则并期望它与你一起玩。
具有一般问题解决能力的系统——类似于人类常识,允许代理快速解决新的艰巨任务——仍然遥不可及。一个明显的挑战是我们的代理不会将他们的经验与他们一起带到新任务中。在一个标准的训练机制中,我们从头开始初始化智能体,让它们在数千万次试验中随机抽动,因为它们学会重复那些恰好导致有益结果的动作。如果我们要在普遍智能代理方面取得进展,我们必须让他们体验广泛的任务,这样他们才能发展出可以在新任务中有效重用的世界知识和问题解决策略。
宇宙基础设施
Universe 通过一个通用界面公开各种环境:代理通过观察屏幕像素并生成键盘和鼠标命令来操作远程桌面。环境公开了一个 VNC 服务器, universe 库将代理变成了一个 VNC 客户端。
我们的 universe 设计目标是支持单个 Python 进程以每秒 60 帧的速度并行驱动 20 个环境。每个屏幕缓冲区都是 1024x768,因此单纯地从外部进程读取每一帧将占用 3GB/s 的内存带宽。 我们用 Go编写了一个面向批处理的 VNC 客户端,它在 Python 中作为共享库加载,并为每个环境增量更新一对缓冲区。在对 VNC 服务器、编码和未记录的协议选项的多种组合进行试验后,我们现在通常以每秒 60 帧的速度驱动数十个环境,延迟为 100 毫秒——几乎都是由于服务器端编码。
以下是我们当前实现的一些重要属性:
将军。代理可以使用此界面(最初是为人类设计的)与任何现有的计算机程序进行交互,而无需模拟器或访问程序的内部结构。例如,它可以玩任何电脑游戏、与终端交互、浏览网页、在 CAD 软件中设计建筑物、运行照片编辑程序或编辑电子表格。
为人类所熟悉。由于人们已经非常熟悉像素/键盘/鼠标的界面,因此人类可以轻松地操作我们的任何环境。我们可以将人类表现作为有意义的基线,并通过简单地保存 VNC 流量来记录人类演示。我们发现在切换到 RL 以针对给定的奖励函数进行优化之前,演示对于使用具有行为克隆的明智策略(即使用监督学习来模仿人类的行为)来初始化代理非常有用。
VNC 作为标准。VNC 的许多实现都可以在线获得,有些实现默认打包到最常见的操作系统中,包括 OSX。甚至还有 JavaScript中的 VNC 实现,它允许人们在不安装任何新软件的情况下提供演示——这对于 Amazon Mechanical Turk 等服务很重要。
易于调试。我们可以在训练或评估代理时对其进行观察——我们只需将 VNC 客户端附加到环境的(共享)VNC 桌面即可。我们还可以保存 VNC 流量以供将来分析。
我们都很惊讶我们能让 VNC 工作得这么好。随着我们扩展到更大的游戏,我们很有可能会开始使用额外的后端技术。但初步迹象表明,我们可以将现有实施推向更远:通过正确的设置,我们的客户可以诱使 GTA V 在公共互联网上以每秒 20 帧的速度运行。
环境
我们已经将大量环境集成到 Universe 中,并将这些视为开始。每个环境都打包为一个 Docker 镜像,并托管 两个 与外界通信的服务器:发送像素和接收键盘/鼠标命令的 VNC 服务器,以及发送强化学习任务奖励信号的 WebSocket 服务器(以及任何辅助信息,如文本或诊断)并接受控制消息(如要运行的特定环境 ID)。
雅达利游戏
Universe 包括来自 Arcade Learning Environment 的 Atari 2600 游戏。这些环境现在在 quay.io/openai/universe.gym-core Docker 镜像中异步运行,并允许代理通过网络连接,这意味着代理必须处理滞后和低帧率。在云端的本地网络上运行,我们通常看到每秒 60 帧,观察滞后 20 毫秒,动作滞后 10 毫秒;在公共互联网上,这会下降到每秒 20 帧、80 毫秒的观察滞后和 30 毫秒的动作滞后。
Flash游戏
我们将 Flash 游戏作为扩展 Universe 的起点——它们在 Internet 上无处不在,通常具有比 Atari 更丰富的图形,但仍然非常简单。到目前为止,我们已经筛选了超过 30,000 个,估计还有一个数量级。
我们最初的 Universe 版本包括 1,000 个 Flash 游戏(100 个具有奖励功能),我们在权利持有者的同意下在quay.io/openai/universe.flashgames Docker 镜像中分发 。此图像启动 TigerVNC 服务器并启动 Python 控制服务器,该服务器使用 Selenium 打开 Chrome 浏览器到包含所需游戏的容器内页面,并自动点击启动游戏所需的任何菜单。
提取奖励。虽然没有奖励功能的环境可用于无监督学习或生成人类演示,但 RL 需要奖励功能。与 Atari 游戏不同,我们不能简单地从进程内存中读取成功标准,因为每个游戏存储此信息的方式差异太大。幸运的是,许多游戏都有一个屏幕分数,我们可以将其用作奖励函数,只要我们能够解析它即可。而现成的 OCR 如 Tesseract 在具有干净背景的标准字体上表现出色,但它很难处理多种游戏中常见的多种字体、移动背景、华丽动画或遮挡对象。我们开发了一个基于卷积神经网络的 OCR 模型,该模型在 Docker 容器的 Python 控制器内运行,解析分数(来自通过 VNC 自循环维护的屏幕缓冲区),并通过 WebSocket 通道将其传达给代理。
浏览器任务
人类共同将互联网建设成一个巨大的信息宝库,专为人类视觉消费而设计。Universe 包括基于浏览器的环境,需要 AI 代理像人一样阅读、导航和使用网络——使用像素、键盘和鼠标。
今天,我们的代理主要学习与常见的用户界面元素(如按钮、列表和滑块)进行交互,但在未来他们可以完成复杂的任务,例如在互联网上查找他们不知道的内容、管理您的电子邮件或日历、完成 可汗学院 课程,或处理 Amazon Mechanical Turk 和 CrowdFlower 任务。
迷你比特世界。我们首先着手创建一个新的基准,以在简单的设置中捕捉浏览器交互的显着挑战。我们将此基准称为 Mini World of Bits。我们将其视为 MNIST的类比,并相信掌握这些环境可为模型和训练技术提供有价值的信号,这些模型和训练技术将在完整的网站和更复杂的任务上表现良好。我们最初的 Mini World of Bits 基准测试包含 80 个环境,从简单(例如单击特定按钮)到困难(例如在模拟电子邮件客户端中回复联系人)。
真实世界的浏览器任务。我们已经开始研究更现实的浏览器任务。代理接受指令,并在网站上执行一系列操作。一种这样的环境将所需航班预订的详细信息交给代理,然后要求它操纵用户界面来搜索航班。(我们使用这些网站的缓存记录来避免向它们发送垃圾邮件,或预订大量真实航班。)
未来的整合
这个基础设施是通用的:我们可以集成任何可以在 Docker 容器(最方便)或 Windows 虚拟机(不太方便)中运行的游戏、网站或应用程序。我们希望社区的 帮助 继续扩展 Universe 环境的广度,包括完成我们 合作伙伴 游戏、Android 应用程序(模拟器可以在 Docker 中运行)、 fold.it、Unity 游戏、HTML5 游戏、在线教育游戏的集成,以及人们想到的其他任何东西。
Microsoft 的 Project Malmo 团队将与 Universe 集成,我们也期待支持其他 AI 框架。
运行环境
尽管种类繁多,但运行 Universe 环境需要的设置最少。您只需要安装 Docker 和 universe:
$ git clone https://github.com/openai/universe && pip install -e universe
我们将每个类似环境的集合打包成一个“运行时”,这是一个暴露两个端口的服务器:5900(用于 VNC 协议交换像素/键盘/鼠标)和 15900(用于 WebSocket 控制协议 )。例如, quay.io/openai /universe.flashgames Docker 镜像是一个可以为许多不同的 Flash 游戏环境提供服务的运行时。
启动运行时。您可以从控制台启动您的第一个运行时,如下所示:
# -p 5900:5900 and -p 15900:15900 expose the VNC and WebSocket ports
# --privileged/--cap-add/--ipc=host needed to make Selenium work
$ docker run --privileged --cap-add=SYS_ADMIN --ipc=host \
-p 5900:5900 -p 15900:15900 quay.io/openai/universe.flashgames
这将下载并运行 Flash 游戏 Docker 容器。您可以通过将自己的 VNC 查看器连接到端口 5900 来查看和控制远程桌面,例如通过 TurboVNC或 通过端口 15900 上的网络服务器提供的 基于浏览器的 VNC 客户端。默认密码是 openai。OSX 还有一个本地 VNC 查看器,可以通过在终端中运行 open vnc://localhost:5900 来访问它。(不幸的是,OSX 查看器没有实现 Tight 编码,这是大型游戏的最佳选择。)
编写自己的代理。您可以使用自己喜欢的框架(例如TensorFlow 或 Theano)轻松编写自己的代理 。(我们提供了一个起始 TensorFlow 代理。)在每个时间步,代理的观察包括一个 NumPy 像素数组,并且代理必须发出 VNC 事件列表(鼠标/键盘操作)。例如,以下代理将激活 Dusk Drive 并不断向前推进:
import gym
import universe # register Universe environments into Gym
env = gym.make('flashgames.DuskDrive-v0') # any Universe [environment ID](https://github.com/openai/universe/blob/master/universe/__init__.py#L297) here
# If using docker-machine, replace "localhost" with your Docker IP
env.configure(remotes="vnc://localhost:5900+15900")
observation_n = env.reset()
while True:
# agent which presses the Up arrow 60 times per second
action_n = [[('KeyEvent', 'ArrowUp', True)] for _ in observation_n]
observation_n, reward_n, done_n, info = env.step(action_n)
env.render()