在本文中,将深入探讨如何使用强化学习训练一个代理来解决特定的游戏环境问题。将使用一种更复杂的算法来更快地训练代理。首先,让仔细检查环境的细节。
可以使用以下简单的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的架构,特别是可能想要调整以改变其性能的事物。在之前的文章中,在一个CPU上运行;这次将利用更多的核心和一个GPU。
Ray的架构包括一个训练器和零个或多个外部工作进程,它们反馈一批观察结果。每个工作进程可以运行一个或多个环境,这取决于配置。
以下是一些可以改变以影响性能和扩展的常见参数:
以下代码设置了七个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,
"rollout_fragment_length": 50,
"train_batch_size": 500,
"num_workers": 7,
"num_envs_per_worker": 5,
"clip_rewards": True,
"lr_schedule": [
[0, 0.0005],
[20000000, 0.000000000001],
]
}
)
使用八个CPU核心和一个GPU,这大约需要0.6小时来训练到200分。比在之前文章中使用的DQN模型要快得多。