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

2018-06-22 16:20:43 浏览数 (1)


新智元编译

来源:blog.otoro.net

作者:David Ha 编译:肖琴

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

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

近日,论文作者之一的 David Ha 公布了重现世界模型实验的一种方法,本文带来分步解读。GitHub 上的参考 TensorFlow 模型:https://github.com/hardmaru/WorldModelsExperiments

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

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

World Models 论文:https://worldmodels.github.io/

软件设置

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

  • 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 文件中说明。

阅读材料:

建议在尝试重现实验之前阅读以下文章,以获取一些背景知识。

  • World Models 论文:https://worldmodels.github.io/
  • A Visual Guide to Evolution Strategies:blog.otoro.net/2017/10/29/visual-evolution-strategies
  • Evolving Stable Strategies:blog.otoro.net/2017/11/12/evolving-stable-strategies/

以下是可选阅读材料:

  • Mixture Density Networks:blog.otoro.net/2015/06/14/mixture-density-networks/
  • Mixture Density Networks with TensorFlow:blog.otoro.net/2015/11/24/mixture-density-networks-with-tensorflow/

如果你不熟悉 Variational Autoencoders,请阅读以下教程:

  • Variational Autoencoder in TensorFlow:https://jmetzen.github.io/2015-11-27/vae.html
  • Building Autoencoders in Keras:https://blog.keras.io/building-autoencoders-in-keras.html
  • Generating Large Images from Latent Vectors:blog.otoro.net/2016/04/01/generating-large-images-from-latent-vectors/

如果你不熟悉连续序列生成的 RNN,请阅读以下材料:

  • Generating Sequences With Recurrent Neural Networks:https://arxiv.org/abs/1308.0850
  • A Neural Representation of Sketch Drawings:https://arxiv.org/abs/1704.03477
  • Handwriting Generation Demo in TensorFlow:blog.otoro.net/2015/12/12/handwriting-generation-demo-in-tensorflow/
  • Recurrent Neural Network Tutorial for Artists:blog.otoro.net/2017/01/01/recurrent-neural-network-artist/

原文:http://blog.otoro.net/2018/06/09/world-models-experiments/


0 人点赞