几行代码实现强化学习
在过去的一年中,强化学习已经取得了重大进步,最新技术每两个月发布一次。 我们已经看到AlphaGo击败了世界冠军围棋选手Ke Jie,Multi-Agents玩了捉迷藏,甚至AlphaStar在星际争霸中也拥有自己的实力。
实施这些算法可能会非常具有挑战性,因为它需要对深度学习和强化学习都有很好的理解。 本文的目的是让您快速使用一些简洁的程序包,以便您可以轻松地开始学习强化学习。
有关如何实施SOTA深度强化学习算法的深入教程,请参阅此内容。 强烈推荐您仔细阅读!
一、环境
在开始实现这些算法之前,我们首先需要创建一个工作环境,即游戏。 对于算法而言,重要的是要了解什么是动作和观察空间。 为此,我们将介绍几个可用于选择有趣环境的软件包。
1. Gym
Gym是用于开发和比较强化学习算法的工具包。 它通常用于实验和研究目的,因为它提供了一个易于使用的界面来处理环境。
只需使用以下命令安装软件包:
pip install gym
之后,您可以使用以下代码创建环境:
import gym env = gym.make(‘CartPole-v0’)
在 CartPole 环境中,您的任务是防止头连接到推车的电线杆掉落。
env变量包含有关环境(游戏)的信息。 要了解CartPole的操作空间是什么,只需运行env.action_space即可产生Discrete(2)。 这意味着可能有两个离散的动作。 要查看观察空间,请运行env.observation_space,它产生Box(4)。 此框代表 n(4)个封闭间隔的笛卡尔积。
要渲染游戏,请运行以下代码:
import gym env = gym.make('CartPole-v0') obs = env.reset() while True: action = env.action_space.sample() obs, rewards, done, info = env.step(action) env.render() if done: break
我们可以看到,如果我们选择采取随机行动,则小车车一直在失败。 最终,目标将是运行强化学习算法,该算法将学习如何解决此问题。
有关Gym中环境的完整列表,请参阅此。
注意:如果您在运行atari(阿塔利)游戏时遇到问题,请参见内容:https://github.com/openai/gym/issues/1726。
2. Retro
创建有趣的环境的另一个选项是使用Retro。 该软件包由OpenAI开发,可让您使用ROMS来模拟Airstriker-Genesis之类的游戏。
只需使用以下命令安装软件包:
pip install gym-retro
然后,我们可以使用以下方法创建和查看环境:
import retro env = retro.make(game='Airstriker-Genesis')
同样,要渲染游戏,请运行以下代码:
import retro env = retro.make(game='Airstriker-Genesis') obs = env.reset() while True: action = env.action_space.sample() obs, rewards, done, info = env.step(action) env.render() if done: break
要安装ROMS,您需要找到相应的.sha文件,然后运行:
python3 -m retro.import /path/to/your/ROMs/directory/
注意:有关易于使用的环境的完整列表,请运行:
retro.data.list_games()
3. Procgen
强化学习的一个典型问题是,生成的算法通常可以在特定环境下很好地工作,但无法学习任何可通用的技能。 例如,如果我们要改变游戏的外观或敌人的反应该怎么办?
为了解决这个问题,OpenAI开发了一个名为Procgen的软件包,该软件包允许创建过程生成的环境。 我们可以使用此软件包来衡量强化学习代理学习通用技能的速度。
渲染游戏非常简单:
import gym param = {"num_levels": 1, "distribution_mode": "hard"} env = gym.make("procgen:procgen-leaper-v0", **param) obs = env.reset() while True: action = env.action_space.sample() obs, rewards, done, info = env.step(action) env.render() if done: break
这将生成可在其上训练算法的单个级别。 有几个选项可用于以程序方式生成同一环境的许多不同版本:
- num_levels-可以生成的唯一级别数
- distribution_mode-使用哪种级别的变量,选项为"easy简单","hard难","extreme极致","memory记忆","exploration探索"。 所有游戏都支持“易”和“难”,而其他选项则取决于游戏。
二、强化学习
现在,终于是时候进行实际的强化学习了。 尽管有许多可用的软件包可用于训练算法,但由于它们的可靠实现,我将主要研究“稳定Baselines ”。
请注意,我不会在此帖子中解释RL算法的实际工作方式,因为这本身就需要一个全新的帖子。 有关最新算法(例如PPO,SAC和TD3)的概述,请参见内容:
https://github.com/dennybritz/reinforcement-learning。
1. 稳定的基线(稳定Baselines)
稳定基准(SB)是基于OpenAI基准的,旨在使研究社区和行业更容易复制,改进和识别新想法。 他们在“基线”上进行了改进,使之成为一个更稳定,更简单的工具,使初学者可以尝试进行“强化学习”,而不会陷入实施细节中。
SB之所以经常使用,是因为它可以轻松,快速地应用最新的强化学习算法。 此外,创建和训练RL模型只需要几行代码。
安装可以简单地通过以下方式完成:pip install stable-baselines。 然后,为了创建和学习RL模型(例如PPO2),我们运行以下代码行:
from stable_baselines import PPO2 from stable_baselines.common.policies import MlpPolicy model = PPO2(MlpPolicy, env, verbose=1) model.learn(total_timesteps=10_000, log_interval=10)
有些事情可能需要一些解释:
- total_timesteps:要训练的样本总数
- MlpPolicy:实现actor-critic的Policy对象。 在这种情况下,将使用2层64层的多层感知器。还有视觉信息策略,例如CnnPolicy甚至CnnLstmPolicy
为了将此模型应用于CartPole示例,我们需要将环境包装在Dummy中,以使其可供SB使用。 然后,在CartPole环境中训练PPO2的完整示例如下:
from stable_baselines.common.policies import MlpPolicy from stable_baselines.common.vec_env import DummyVecEnv from stable_baselines import PPO2 import gym env = gym.make('CartPole-v0') env = DummyVecEnv([lambda: env]) model = PPO2(MlpPolicy, env, verbose=1) model.learn(total_timesteps=50_000, log_interval=10) obs = env.reset() while True: action, _states = model.predict(obs) obs, rewards, dones, info = env.step(action) env.render()
如上图所示,PPO2仅用50,000步就设法找到一种保持极点稳定的方法。 这只需要几行代码和几分钟的处理!
如果要将其应用于Procgen或Retro,请确保选择一个允许基于卷积的网络的策略,因为观察空间很可能是环境当前状态的图像。
最后,CartPole示例非常简单,仅需训练50,000步即可。 大多数其他环境在显示出显着改进之前通常需要执行几千万步。
注意:《稳定基准》的作者警告初学者在产品中使用该软件包之前,对强化学习要有很好的了解。 强化学习有许多关键组成部分,如果其中任何一个出现错误,该算法将失败,并且可能会留下很少的解释。
2. 其他软件包
还有其他一些常用于应用RL算法的软件包:
- TF-Agents-比稳定基线需要更多的编码,但通常是强化学习研究的必备软件包。
- MinimalRL-在Pytorch中以非常少的代码实现的最新RL算法。 它绝对有助于理解算法。
- DeepRL-Pytorch的另一种实现,但是此版本还具有实现要使用的其他环境。
- MlAgents-一个开放源代码的Unity插件,使游戏和模拟可用作培训代理的环境。