OpenAI Gym 入门:Atari Breakout





5.00/5 (3投票s)
在本文中,我们将开始研究 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 环境上更快地训练。 如果您正在关注,您可能不想等到简单的方法完全训练完毕后再继续。