65.9K
CodeProject 正在变化。 阅读更多。
Home

OpenAI Gym 入门:Atari Breakout

starIconstarIconstarIconstarIconstarIcon

5.00/5 (3投票s)

2020 年 6 月 29 日

CPOL

3分钟阅读

viewsIcon

16922

在本文中,我们将开始研究 OpenAI Gym 环境和 Atari 游戏 Breakout。

在本系列的之前的文章中,我们研究了经典的强化学习环境:cartpole 和 mountain car。 在本系列的剩余部分,我们将把注意力转移到 OpenAI Gym 环境,特别是 Breakout 游戏。

游戏涉及一堵积木墙、一个球和一个挡板。 如果球击中积木,你将获得一些分数,并且积木会被移除。 你必须移动屏幕底部的挡板以避免球出界,这会导致你失去五个生命中的一个。

Atari 环境的命名约定

因为我发现 Atari 环境的命名约定有些令人困惑,所以我认为在这里简要解释一下它们是有意义的。

环境名称包括一个版本和一个后缀。

版本

  • v0 的重复动作概率为 0.25,这意味着四分之一的时间将使用之前的动作而不是选择的动作。 这些所谓的粘性动作 是一种在原本确定的环境中引入随机性的方法,主要用于基准测试。
  • v4 总是执行选择的动作。
  • Breakout 没有版本 1、2 或 3。

后缀

  • 无后缀:在每一步跳过 2、3 或 4 帧,每次随机选择
  • 确定性:每一步跳过 4 帧
  • NoFrameskip:每一步跳过 0 帧

实际上,我发现帧跳过选项并没有带来很大的不同。 这可能是因为大多数运行都使用了 DQN 以及经验缓冲区,因此您实际上只是将四个相似的经验泵入池中,但并没有立即从它们中学习。 可能是使用确定性环境可以让您使用更小的缓冲区获得相同的结果,但不一定能更快地学习。

图像 vs RAM

Atari 游戏环境有两种根本不同的版本。 标准版本,也是使用最广泛的版本,提供它们的观察结果,以屏幕上的像素为单位。 在每一步,您都会观察到一个形状为 (210, 160, 3) 的 uint8 值数组,表示每个像素的红色、绿色和蓝色值。 第二个版本以计算机内存中发生的事情为单位产生观察结果。 Atari 2600,模拟这些环境是为了启用这些环境,只有 128 字节的 RAM。 不是 128K,而是 128 字节!

在本系列中,我们将尝试解决这两种类型的 Atari 环境。 我们将从更简单、研究更完善的版本开始:从屏幕上发生的事情中学习。

从像素学习 Breakout

这是我用于从像素学习的代码

import pyvirtualdisplay

_display = pyvirtualdisplay.Display(visible=False, size=(1400, 900))
_ = _display.start()

import ray
from ray import tune
from ray.rllib.agents.dqn import DQNTrainer

ray.shutdown()

# twice the conservative memory settings from https://docs.rayai.org.cn/en/master/memory-management.html
ray.init(
    include_webui=False, ignore_reinit_error=True,
    memory=4000 * 1024 * 1024,
    object_store_memory=400 * 1024 * 1024,
    driver_object_store_memory=200 * 1024 * 1024)

ENV = "BreakoutNoFrameskip-v4"
TARGET_REWARD = 200
TRAINER = DQNTrainer

tune.run(
    TRAINER,
    stop={"episode_reward_mean": TARGET_REWARD,
    config={
      "env": ENV,
      "num_gpus": 0,  #1,
      "monitor": True,
      "evaluation_num_episodes": 25,
      "num_workers": 0,
      # based on https://github.com/ray-project/ray/blob/master/rllib/tuned_examples/dqn/atari-duel-ddqn.yaml
      "double_q": True,
      "dueling": True,
      "num_atoms": 1,
      "noisy": False,
      "prioritized_replay": False,
      "n_step": 1,
      "target_network_update_freq": 8000,
      "lr": .0000625,
      "adam_epsilon": .00015,
      "hiddens": [512],
      "learning_starts": 20000,
      "buffer_size": 400_000,
      "rollout_fragment_length": 4,
      "train_batch_size": 32,
      "exploration_config": {
        "epsilon_timesteps": 500_000,
        "final_epsilon": 0.01,
      },
      "prioritized_replay_alpha": 0.5,
      "final_prioritized_replay_beta": 1.0,
      "prioritized_replay_beta_annealing_timesteps": 2_000_000,
      "timesteps_per_iteration": 10_000,
    }
)

请注意,使用此配置,在没有 GPU 的单个 CPU 核心上达到 200 的性能需要 36 小时。 这确实表明,只要您有耐心,就可以尝试使用廉价的硬件进行强化学习。

训练进度相对线性

下一篇文章中,我们将看到如何使用不同的学习算法(加上更多核心和 GPU)在 mountain car 环境上更快地训练。 如果您正在关注,您可能不想等到简单的方法完全训练完毕后再继续。

© . All rights reserved.