65.9K
CodeProject 正在变化。 阅读更多。
Home

教机器人走路(AI):连续控制环境简介

starIconstarIconstarIconstarIconstarIcon

5.00/5 (2投票s)

2020年9月25日

CPOL

6分钟阅读

viewsIcon

9273

在本文中,我们将以Bullet物理模拟器为基础,在连续控制环境中进行一些强化学习。

引言

大家好,欢迎来到我关于实践深度强化学习的第二系列文章。

上次我们通过训练一个智能体玩Atari Breakout来学习深度强化学习的基础。如果您还没有阅读过该系列,那可能是最好的起点。

我们之前研究的所有环境都具有离散的动作空间:在任何时间步,智能体都必须从列表中选择一个动作来执行,例如“什么都不做”、“向左移动”、“向右移动”或“开火”。

这次我们的重点将转移到具有连续动作空间的环境:在每个时间步,智能体必须为动作选择一组浮点数。特别是,我们将使用Humanoid环境,鼓励人形角色学习行走。

我们将继续使用Ray的RLlib库进行强化学习过程,因为使用连续动作空间会减少可用的学习算法数量,您可以在功能兼容性矩阵中看到这一点。

要求

这些文章假定您熟悉Python 3和组件的安装。

我们将要训练的连续控制环境比前一个系列的更具挑战性。即使在拥有强大GPU和大量CPU核心的强大机器上,其中一些实验也需要数天才能完成训练。许多公司乐意按小时出租Linux服务器,这也是我运行这些训练课程时采取的方法。它与tmux或screen特别好地结合在一起,使您可以断开并重新连接到正在运行的会话(如果拥有足够强大的机器,还可以同时运行多个实验)。

一个简单的设置脚本

对于这一系列文章,我曾在租用的Linux服务器(特别是Ubuntu)上运行了这些训练课程(以及许多未被采用的课程!)。我发现将所有必需品放在一个设置脚本中很方便。

我们上次没有的主要是PyBullet,它是Bullet物理引擎的Python包装器。

#!/bin/bash

# Get a clean host up to speed for running ML experiments

apt-get update
apt-get upgrade –quiet

apt-get install -y xvfb x11-utils
apt-get install -y git
apt-get install -y ffmpeg

pip install gym==0.17.2
pip install ray[rllib]==0.8.6
pip install PyBullet==2.8.6
pip install pyvirtualdisplay==0.2.* PyOpenGL==3.1.* PyOpenGL-accelerate==3.1.*
pip install pandas==1.1.0

# should be pip install tensorflow_probability, but had to do this:
pip install tfp-nightly==0.11.0.dev20200708
# because of this issue: https://github.com/tensorflow/tensorflow/issues/40584

因此,对于新服务器,我的常规做法是apt-get install wget,然后从我托管的公共服务器上wget上面的脚本,然后运行它来安装我所有的依赖项。

要从远程服务器下载结果,您可以使用scp(或PuTTY的pscp下载到Windows)。

CartPole回顾

使用DQN的Bullet CartPole环境

关于环境

如果您还记得前系列文章中的CartPole环境,我将其描述为强化学习的“Hello World”。它有一个带有一个杆子的轮式推车,智能体可以左右移动推车,并通过尽可能长时间地保持杆子平衡来获得奖励。

CartPole是较简单的强化学习环境之一,仍然具有离散的动作空间。PyBullet包含自己的版本(而不是我们上次使用的OpenAI Gym的版本),您可以尝试运行它来检查PyBullet是否已正确安装。

让我们看一下我们将要使用的特定环境。

>>> import gym
>>> import pybullet_envs
>>> env = gym.make('CartPoleBulletEnv-v1')
>>> env.observation_space
Box(4,)
>>> env.action_space
Discrete(2)

因此,观察空间是一个四维连续空间,但动作空间只有两个离散选项(向左或向右)。这就是我们习惯的。

我们将开始使用我们在前系列中遇到的深度Q网络(DQN)算法。

代码

这是一个在PyBullet的CartPole环境中训练智能体的Python脚本。其总体结构与我们前系列实验中使用的结构相同:设置虚拟显示器以便在服务器上无头运行,干净地重启Ray,注册环境,然后设置它进行训练直到达到目标奖励。

请注意,正是import pybullet_envs将PyBullet环境名称注册到Gym。我发现我需要在make_env函数内部而不是文件顶部导入它,这可能是因为该函数在Ray的远程工作程序上被单独调用。

import pyvirtualdisplay
_display = pyvirtualdisplay.Display(visible=False, size=(1400, 900))
_ = _display.start()

import gym
import ray
from ray import tune
from ray.rllib.agents.dqn import DQNTrainer
from ray.tune.registry import register_env

ray.shutdown()
ray.init(include_webui=False, ignore_reinit_error=True)

ENV = 'CartPoleBulletEnv-v1'
def make_env(env_config):
    import pybullet_envs
    return gym.make(ENV)
register_env(ENV, make_env)
TARGET_REWARD = 190
TRAINER = DQNTrainer

tune.run(
    TRAINER,
    stop={"episode_reward_mean": TARGET_REWARD},
    config={
        "env": ENV,
        "num_workers": 7,
        "num_gpus": 1,
        "monitor": True,
        "evaluation_num_episodes": 50,
    }
)

您可以根据您使用的硬件调整num_gpusnum_workers的值。num_workers的值最多可以比您可用的CPU核心数少一个。

通过将monitor设置为True并将evaluation_num_episodes设置为50,我们告诉RLlib每50集(默认是每10集)保存一次训练过程的统计数据和mp4视频。这些将出现在ray_results目录中。

对我而言,学习进度(progress.csv中的episode_reward_mean)看起来如下,花费176秒达到目标奖励190。

请注意,我们没有更改任何有趣的参数,例如学习率。这个环境足够简单,RLlib用于DQN算法的默认参数无需进行任何微调就能做得很好。

视频

经过训练的智能体与其环境交互看起来像这样

使用PPO的Bullet CartPole环境

改变算法

使用RLlib的一个优点是切换算法很简单。要使用Proximal Policy Optimisation(PPO)而不是DQN进行训练,请添加以下导入:

from ray.rllib.agents.ppo import PPOTrainer

并将TRAINER的定义更改如下:

TRAINER = PPOTrainer

我们将在以后的文章中了解PPO的更多细节,届时我们将使用它来训练Humanoid环境。目前,我们将其视为一个黑匣子,并使用其默认学习参数。

当我运行这个时,训练花费了109.6秒,进度看起来像这样:

这真是一条平滑的曲线!而且训练速度也更快。

视频看起来与DQN算法的训练会话相似,因此我在此不再重复。

连续CartPole环境与PPO

环境介绍

如前所述,传统的CartPole具有离散的动作空间:我们训练一个策略来选择“向左移动”或“向右移动”。

PyBullet还包含CartPole环境的连续版本,其中动作指定一个单一的浮点数值,表示施加到推车上的力(正方向表示一个方向,负方向表示另一个方向)。

>>> import gym
>>> import pybullet_envs
>>> env = gym.make('CartPoleContinuousBulletEnv-v0')
>>> env.observation_space
Box(4,)
>>> env.action_space
Box(1,)

观察空间与之前相同,但这次动作空间是连续的而不是离散的。

DQN算法无法处理连续动作空间。PPO可以,所以我们这样做。

代码

将训练代码中的环境声明更改如下:

ENV = 'CartPoleContinuousBulletEnv-v0'

这次模型花费了108.6秒进行训练(与离散环境相比没有显著差异),进度看起来像这样:

视频

生成的视频看起来像这样:

有更多的振荡发生,但它已经学会了平衡杆。

下次

下一篇文章中,我们将探讨PyBullet提供的两种较简单的运动环境,并训练智能体来解决它们。

© . All rights reserved.