更快地学习 Breakout





5.00/5 (3投票s)
在本文中,我们将了解如何使用不同的学习算法(以及更多内核和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会带来一些有趣的挑战,正如我们将在下一篇文章中发现的那样。