0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

David Ha公布了重现世界模型实验的一种方法,本文带来分步解读

DPVg_AI_era 来源:未知 作者:李倩 2018-07-03 10:33 次阅读

“世界模型”(World Models)是谷歌大脑研究科学家 David Ha 和 Swiss AI Lab 负责人 Jürgen Schmidhuber 共同提出的一个为强化学习环境构建的神经网络模型。“世界模型”论文一经发布就引发了热烈讨论。近日,论文作者之一的 David Ha 公布了重现世界模型实验的一种方法,本文带来分步解读。

“世界模型”(World Models)是谷歌大脑研究科学家 David Ha 和 Swiss AI Lab 负责人 Jürgen Schmidhuber 共同提出的一个为强化学习环境构建的神经网络模型。世界模型可以通过无监督的方式快速训练,让人工智能在 “梦境” 中对外部环境的未来状态进行预测,大幅提高了完成任务的效率。这篇论文一经发布就引发了热烈讨论。

近日,论文作者之一的 David Ha 公布了重现世界模型实验的一种方法,本文带来分步解读。

已有其他人独立实现了世界模型。Keras 有一个实现再现了 CarRacing-v0 实验的一部分。PyTorch 也有一个项目,试图在 OpenAI Retro Sonic 环境中实现此模型。

关于世界模型,我们已经在原始的交互式的论文中作了充分的讨论,在此不再详细解读论文。

软件设置

我使用以下设置测试代码:

Ubuntu 16.04

Python 3.5.4

TensorFlow 1.8.0

NumPy 1.13.3

VizDoom Gym Levels

OpenAI Gym 0.9.4(Gym 1.0+ breaks VizDoom,可以适用于 CarRacing 任务)

cma 2.2.0

mpi4py 2,请参阅我们为此项目分配的 estool

Jupyter Notebook,用于模型测试和跟踪进度

我使用 OS X 进行推理,但使用 Google Cloud VM 训练模型。我在 P100 GPU 实例上训练了 V 和 M 模型,使用 CMA-ES 在纯 CPU 实例上训练了具有 64 个 cpu-cores(n1-standard-64)的控制器 C。以下将概述哪部分训练需要 GPU,哪些部分仅使用 CPU,并尝试降低运行此实验的成本。

运行预训练模型

你只需要将 repo 克隆到以 CPU 模式运行的台式电脑上,使用 repo 中提供的预训练好的模型来重现结果。不需要 Clould VM 或 GPU。

CarRacing-v0

如果你使用的是 MacBook Pro,我建议将分辨率设置为 “更多空间”,因为 CarRacing-v0 环境呈现的分辨率较高,并且不符合默认的屏幕设置。

在命令行中,进入 carracing 子目录。尝试自己玩游戏,在终端中运行 python env.py。你可以使用键盘上的四个箭头键来控制汽车。按(上,下)进行加速 / 制动,(左 / 右)进行转向。

在这个环境下,每次运行都会生成一个新的随机轨迹。虽然如果我非常仔细地开车,可以轻松获得 800 分以上的分数,但 900 分以上就很难。斯坦福大学有些学生也发现难以持续高于 900 分。解决这一环境的要求是在 100 个连续的随机路径上平均获得 900 分。

要运行一次预训练的模型并以完全渲染模式查看 agent,请运行:

python model.py render log/carracing.cma.16.64.best.json

在无渲染模式下运行预训练的模型 100 次(在无渲染模式下,由于需要使用 OpenGL 为该环境提取像素信息作为观测值,因此仍然会在屏幕上渲染出更简单的东西):

python model.py norender log/carracing.cma.16.64.best.json

该命令将在 100 次试验后输出每 100 次试验的分数,它也会输出平均分和标准差。平均分数应该在 900 以上。

要在使用 M 生成的环境中运行预训练好的控制器,并使用 V 进行可视化:

python dream_model.py log/carracing.cma.16.64.best.json

DoomTakeCover-v0

在 doomrnn 目录中,在由 M 生成的环境中运行 python doomrnn.py

你可以按左、下或右在这个环境中玩游戏。要可视化在真实环境中运行的预训练模型,请运行:

python model.py doomreal render log/doomrnn.cma.16.64.best.json

请注意,除了重构帧和游戏的实际帧之外,还会修改环境以显示裁剪后的 64 x 64 px 的帧。要在实际环境中运行模型 100 次并计算平均分数,请运行:

python model.py doomreal norender log/doomrnn.cma.16.64.best.json

你应该在 100 次随机 episodes 中获得超过 900 时间步的平均分数。如果你想要获取 agent 在生成环境中玩游戏的统计信息,则可以使用 doomrnn 代替 doomreal,上面这两行代码仍然工作。如果你想更改生成环境的温度,请修改 doomrnn.py 中的常量 TEMPERATURE,当前的设置是 1.25。

要可视化在生成环境中玩游戏的模型,请运行:

python model.py doomrnn render log/doomrnn.cma.16.64.best.json

从头开始训练

DoomTakeCover-v0

我们先讨论 VizDoom 实验,因为这个实验从头开始实现需要的计算较少。 由于你可能会更新 repo 中的模型,因此我建议 fork 这个 repo 并在你的 fork 中 clone/update。我建议在 tmux 会话中运行任何命令,以便关闭 ssh 连接时作业仍将在后台运行。

先创建一个具有~200GB 存储容量和 220GB RAM 的 64 核 CPU 实例,并在该实例中克隆 repo。 在 doomrnn 目录中,有一个名为 extract.py 的脚本,它将从 random policy 中提取 200 episodes,并在 doomrnn / record 中保存为 .npz 文件。名为 extract.bash 的 bash 脚本将运行 extract.py 64 次,因此通过运行 bash extract.bash,我们将在 doomrnn / record 中生成 12800 个 .npz 文件。有些情况可能会随机失败,所以我们产生了一些额外的数据,尽管最终我们只用了 10000 episodes 来训练 V 和 M。这个过程需要几个小时(可能不用 5 小时)。

在 record 子目录中创建 .npz 文件之后,我创建了一个具有~200GB 存储空间和 220GB RAM 的 P100 GPU 实例,并在其中克隆了该 repo。我使用 ssh copy 命令 scp 将 CPU 实例中的所有 .npz 文件复制到 GPU 实例的同一个 record 子目录中。如果 scp 不起作用,你可以使用 gcloud 工具。如果两个实例在同一个区域中,这应该会非常快,不到一分钟。将. npz 文件复制到 GPU 机器后,请关闭 CPU 实例。

在 GPU 机器上,运行命令 bash gpu_jobs.bash 来训练 VAE,预处理录制的数据集并训练 MDN-RNN。

这个 gpu_jobs.bash 将按顺序运行以下三项:

1)python vae_train.py——这将训练 VAE,并且在训练后,模型将被保存在 tf_vae / vae.json 中

2)接下来,它将通过启动:python series.py,使用预训练的 VAE 预处理收集的数据。一个新的数据集将在一个名为 series 的子目录中创建。

3)接下来,保存一个名为 series.npz 的数据集,脚本将使用以下命令启动 MDN-RNN 训练器:python rnn_train.py。这将在 tf_rnn / rnn.json 和 tf_initial_z / initial_z.json 中生成一个模型。initial_z.json 文件保存了生成环境时所需的 episode 的初始潜在变量(z)。整个过程可能需要 6~8 小时。

notebook “vae_test.ipynb” 将在训练数据集上使用 VAE 对输入 / 重建图像进行可视化。

V 和 M 训练完毕后,你将得到 3 个新的 json 文件,现在必须将 vae.json,initial_z.json 和 rnn.json 复制到 tf_modelssub 目录并覆盖以前的文件。你应该使用 git add doomrnn / tf_models / *. json 来将这些新模型更新到 git repo,并将更新提交给你的 fork。完成这个操作后,可以关闭 GPU 机器。你需要再次启动 64-core CPU 实例,然后重新登录机器。

现在,在 64-core CPU 实例上,运行基于 CMA-ES 的训练,在 doomrnn 目录中启动 python train.py 命令。这将启动 trainer 并继续训练,直到 Ctrl-C 这个工作。控制器 C 将在 M 的生成环境中以 1.25 的 temperature 进行训练。你可以通过加载正在生成的日志文件的 plot_training_progress.ipynb notebook 来监视进度。经过 200 次迭代(或大约 4-5 小时)后,应该足以获得可观的结果,就可以停止了。我在接近 1800 次迭代后停止,尽管它在 200 次之后就没有真正增加价值了,所以可以不用浪费钱。将 log / *. json 中的所有文件添加到已经 fork 的 repo 中,然后关闭实例。

图:使用 CMA-ES 训练 DoomRNN,在生成的环境中记录 C 的性能

使用你的桌面实例,并再次 pull 已经 fork 的 repo,现在可以运行以下代码来测试新训练的 V,M 和 C 模型。

python model.py doomreal render log/doomrnn.cma.16.64.best.json

你可以用 doomrnn 替换 doomreal 或者渲染为 norender 来尝试生成的环境,或者尝试 agent 100 次。

CarRacing-v0

CarRacing-v0 的过程与前面的 VizDoom 示例几乎相同,因此本节主要讨论有差异的地方。

由于 CarRacing-v0 的环境是使用 OpenGL 构建的,因此即使在 gym 环境的无渲染模式下,它也依赖于图形输出,因此在 CloudVM box 中,必须用 headless X 服务器来包装命令。你可以在 carracing 目录下的 extract.bash 文件中看到,在真正的命令之前运行 xvfb-run -a -s "-screen 0 1400x900x24 +extension RANDR"。除此之外,收集数据和训练 V 和 M 模型的过程与 VizDoom 相同。

请注意,在训练 VAE 和 MDN-RNN 模型后,必须分别将 vae.json,initial_z.json 和 rnn.json 复制到 vae,initial_z 和 rnn 目录(而不是像 DoomRNN 中复制到 tf_models),并覆盖以前的文件,然后照常更新 forked repo。

图:vae_test.ipynb 用于检查在 CarRacing-v0 提取的数据上训练的 VAE。

在这个环境下,我们使用 V 和 M 模型作为模型预测控制(MPC),并在实际环境中训练控制器 C,而不是在生成环境里训练。 因此,你需要运行 gce_train.bash,而不是运行 train.py。因为我们在实际环境中训练,与 DoomRNN 相比,训练速度较慢。由于是在 tmux 会话中运行训练,你可以通过在另一个 tmux 会话中并行运行 Jupyter 来使用 plot_training_progress.ipynb notebook 监控进度,这会加载正在生成的日志文件。

图:使用 CMA-ES 训练 CarRacing-v0。记录 C 在实际环境中的性能。

在 150-200 generations(或大约 3 天)之后,应该足以达到~880 的平均分数,非常接近想要的 900 分。如果你对 850 + 分就满意了,建议这时就可以停下来。定性地说,与最终 agent 达到 900 + 分相比,850-870 的分数并没有很糟糕,我不想在云上浪费血汗钱。获得 900 + 分可能需要数周。最终模型以 log / *. json 格式保存,你可以按通常的方式进行测试和查看。

贡献

有很多很酷的想法可以尝试,例如,迭代训练方法,迁移学习,intrinsic motivation,以及其他环境。

图:A generative noisy pixel pendulum environment?

如果你想扩展代码并尝试新的东西,我建议修改代码并尝试解决特定的新环境,而不是尝试改进代码以同时在多个环境中工作。我发现对于研究工作,如果要尝试解决困难的环境,通常需要特定的自定义修改。欢迎提交带有独立子目录的 pull request,子目录可以针对你尝试解决的特定环境量身定制,并在子目录的 README.md 文件中说明。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 神经网络
    +关注

    关注

    42

    文章

    4751

    浏览量

    100445
  • 人工智能
    +关注

    关注

    1791

    文章

    46711

    浏览量

    237236
  • 强化学习
    +关注

    关注

    4

    文章

    265

    浏览量

    11200

原文标题:【代码+教程】重现“世界模型”实验,无监督方式快速训练

文章出处:【微信号:AI_era,微信公众号:新智元】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    基于助听器开发的一种高效的语音增强神经网络

    受限的微控制器单元(microcontroller units,MCU)上,内存和计算能力有限。在这项工作中,我们使用模型压缩技术来弥补这差距。我们在HW上对RNN施加约束,并描述一种方法
    发表于 06-07 11:29

    一种基于路测数据的传播模型校正方法

    准确性等问题,提出了一种利用现网路测数据进行传播模型校正的方法.从理论上证明了路测信号可以替代连续波测试信号用于传播模型校正,通过增加路测次数和利用历史数据、邻区数据等
    发表于 04-23 11:52

    Nexar如何为FPGA设计提供一种全新的方法

     本文概述开发这种系统所必须面对的各种设计挑战,并讲解了Altium公司的最新电子设计环境Nexar如何为FPGA设计提供一种全新的方法。这种方法
    发表于 05-08 06:02

    探索一种降低ViT模型训练成本的方法

    其上的实验来评估性能,当每次实验的训练成本过高时,这不是一种可扩展的方法。通过降低训练成本,缩短了开发周期。2 更容易接近。大多数ViT模型
    发表于 11-24 14:56

    单片机软件产生高频方波的一种方法

    单片机软件产生高频方波的一种方法
    发表于 05-15 14:00 50次下载

    一种获取键盘扫描码的实验方法及应用

    本文介绍一种将通用PC机键盘输出的按键扫描码利用简单的实验莸取的方法,这种方法在设计利用PC键盘做键盘扩展的单片机系统接口设计中具有
    发表于 03-30 09:49 13次下载

    得到模拟应用设计经验的一种方法

    得到模拟应用设计经验的一种方法
    发表于 01-24 16:29 8次下载

    关于实时操作系统中任务间通信的一种方法

    关于实时操作系统中任务间通信的一种方法
    发表于 09-03 11:45 3次下载
    关于实时操作系统中任务间通信的<b class='flag-5'>一种方法</b>

    DSP硬件驱动程序的一种方法

    DSP硬件驱动程序的一种方法
    发表于 10-19 10:48 1次下载
    DSP硬件驱动程序的<b class='flag-5'>一种方法</b>

    一种分步动态自回归KPCA算法

    针对滑动窗自适应核主元分析法KPCA)在处理参数敏感和缓慢劣化问题时存在的过适应现象,容易产生漏报的问题,提出了一种分步动态自回归KPCA算法。首先,借鉴动态数据矩阵思想,分步建立初始模型
    发表于 12-19 14:48 0次下载

    一种广义运动模糊模型

    从光流场的角度出发,建立了一种广义运动模糊模型,并依据该模型推导出前向运动模糊核,为高速铁路前向运动视频图像去模糊奠定理论基础.给出了理论分析后,设计
    发表于 01-12 14:46 0次下载

    移动通信中使用软件无线电实现AGC的一种方法

    移动通信中使用软件无线电实现AGC的一种方法说明。
    发表于 05-27 17:01 2次下载

    一种结合敏捷方法和V模型的汽车软件开发方法

    表明,在汽车软件开发中结合使用敏捷过程和V模型是有前景的,有必要开发一种结合敏捷方法和V模型的汽车软件开发方法
    发表于 08-20 16:09 1667次阅读

    rup是一种什么模型

    RUP(Rational Unified Process,统建模语言)是一种软件开发过程模型,它是一种迭代和增量的软件开发方法。RUP是由
    的头像 发表于 07-09 10:13 1127次阅读

    一种简单高效配置FPGA的方法

    本文描述一种简单高效配置FPGA的方法,该方法利用微处理器从串行外围接口(SPI)闪存配置FPGA设备。这
    的头像 发表于 10-24 14:57 294次阅读
    <b class='flag-5'>一种</b>简单高效配置FPGA的<b class='flag-5'>方法</b>