强化学习在游戏环境中的应用

在本文中,将深入探讨如何使用强化学习训练一个代理来解决特定的游戏环境问题。将使用一种更复杂的算法来更快地训练代理。首先,让仔细检查环境的细节。

可以使用以下简单的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, "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模型要快得多。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485