如何矢量化强化学习环境?

Ryl*_*fer 5 vectorization reinforcement-learning pytorch

我有一个符合 OpenAI 环境 API 的 Python 类,但它是以非向量化形式编写的,即每一步接收一个输入操作并每一步返回一个奖励。如何矢量化环境?我在 GitHub 上没找到任何明确的解释。

Bre*_*ley 7

您可以编写一个自定义类来迭代内部环境元组,同时维护基本的 Gym API。实际上,会存在一些差异,因为底层环境不会在同一时间步终止。因此,可以更轻松地将标准stepreset功能组合到一种称为 的方法中step。这是一个例子:

class VectorEnv:
    def __init__(self, make_env_fn, n):
        self.envs = tuple(make_env_fn() for _ in range(n))

    # Call this only once at the beginning of training (optional):
    def seed(self, seeds):
        assert len(self.envs) == len(seeds)
        return tuple(env.seed(s) for env, s in zip(self.envs, seeds))

    # Call this only once at the beginning of training:
    def reset(self):
        return tuple(env.reset() for env in self.envs)

    # Call this on every timestep:
    def step(self, actions):
        assert len(self.envs) == len(actions)
        return_values = []
        for env, a in zip(self.envs, actions):
            observation, reward, done, info = env.step(a)
            if done:
                observation = env.reset()
            return_values.append((observation, reward, done, info))
        return tuple(return_values)

    # Call this at the end of training:
    def close(self):
        for env in self.envs:
            env.close()
Run Code Online (Sandbox Code Playgroud)

然后你可以像这样实例化它:

import gym
make_env_fn = lambda: gym.make('CartPole-v0')
env = VectorEnv(make_env_fn, n=4)
Run Code Online (Sandbox Code Playgroud)

当您调用 时,您必须为代理做一些簿记才能处理返回值的元组step。这也是我更喜欢将函数传递make_env_fn给 的原因__init__,因为很容易添加包装器,例如gym.wrappers.Monitor单独自动跟踪每个环境的统计信息。