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

更快地学习 Breakout

starIconstarIconstarIconstarIconstarIcon

5.00/5 (3投票s)

2020年6月30日

CPOL

3分钟阅读

viewsIcon

9241

在本文中,我们将了解如何使用不同的学习算法(以及更多内核和GPU)来更快地训练山地车环境。

之前的文章介绍了Atari Breakout的OpenAI Gym环境,以及一些使用强化学习训练代理来解决它的代码。

现在,我们将仔细研究此环境的细节,并使用更复杂的算法来更快地训练代理。

检查环境

您可以使用以下简单的Python代码交互式地玩游戏(并且,必须承认,比平时慢)。您需要的键是A(左)、D(右)和空格键(发射球)。只有在具有真实图形显示的环境中,此方法才有效;否则,您可以跳过此部分。

import gym
from gym.utils.play import play, PlayPlot

def callback(obs_t, obs_tp1, action, rew, done, info):
    return [rew]

plotter = PlayPlot(callback, 30 * 5, ["reward"])
env = gym.make("Breakout-ramNoFrameskip-v4")
play(env, callback=plotter.callback, zoom=4)

我们使用回调函数来显示随时间推移获得的奖励。如您所见,除非球击中并移除砖块,否则我们不会获得任何奖励。失去生命不会受到负面奖励。

从该屏幕截图中无法看出一些情况

  • 击碎较高层级的砖块会获得更高的奖励
  • 一段时间后,球拍会变小
  • 球的速度变化很大

因此,这对代理来说是一些需要克服的挑战!

Ray架构概述

由于我们正在检查事物,这是一个简要概述Ray架构的好机会,特别是我们可能想要调整以更改其性能的事物。在之前的文章中,我们在单个CPU上运行;这次我们将使用更多内核和GPU。

Ray的架构由一个训练器和零个或多个外部工作进程组成,这些进程反馈观察批次。每个工作程序可以运行一个或多个环境,具体取决于您的配置。

以下是一些您可以更改以影响性能和缩放的常用参数

  • num_cpus_per_worker:每个工作程序允许使用的CPU数量;对于任何标准环境,这超过一个都没有好处,但如果您有昂贵的自定义环境,则可能有用
  • num_envs_per_worker:每个工作进程启动的环境数量
  • num_gpus:用于训练的GPU总数
  • num_gpus_per_worker:每个工作程序使用的GPU数量,通常为零
  • num_workers:工作进程的数量
  • rollout_fragment_length:在工作程序将其发送回训练器之前,从每个环境中获取的观察数量
  • train_batch_size:训练策略时每个批次中的观察数量

使用IMPALA更快地学习Breakout

以下代码设置了七个Ray工作程序,每个工作程序运行五个Breakout环境。我们还切换到使用IMPALA算法而不是DQN。

import ray
from ray import tune
from ray.rllib.agents.impala import ImpalaTrainer

ray.shutdown()
ray.init(include_webui=False, ignore_reinit_error=True)

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

tune.run(
    TRAINER,
    stop={"episode_reward_mean": TARGET_REWARD},
    config={
      "env": ENV,
      "monitor": True,
      "evaluation_num_episodes": 25,

      # from https://github.com/ray-project/ray/blob/master/rllib/tuned_examples/impala/atari-impala.yaml
      "rollout_fragment_length": 50,
      "train_batch_size": 500,
      "num_workers": 7,
      "num_envs_per_worker": 5,
      "clip_rewards": True,
      "lr_schedule": [
          [0, 0.0005],
          [20_000_000, 0.000000000001],
      ]
    }
)

使用八个CPU内核和一个GPU,这大约需要0.6小时才能训练到200分。比我们在上一篇文章中使用的DQN模型快得多。

进展并非完全线性。特别是,它在结束时有一个非常不稳定的时刻,平均分数骤降。

在不到一半的时间内学会解决Breakout环境后,您可能认为我们已经完成了。但是,不,这只是成功的一半。从RAM而不是像素学习Breakout会带来一些有趣的挑战,正如我们将在下一篇文章中发现的那样。

© . All rights reserved.