几行代码实现强化学习

快乐的鱼儿学敲码 2020-08-10

在过去的一年中,强化学习已经取得了重大进步,最新技术每两个月发布一次。 我们已经看到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插件,使游戏和模拟可用作培训代理的环境。

相关推荐