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

Posted

技术标签:

【中文标题】如何向量化强化学习环境?【英文标题】:How does one vectorize reinforcement learning environments? 【发布时间】:2020-04-21 11:52:09 【问题描述】:

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

【问题讨论】:

我很好奇拥有一个接受一系列动作的矢量化环境的用例是什么? 单一环境不会接受一系列动作。相反,我希望能够传入一系列动作并将每个动作发送到单独的环境。 stable_baselines 和 baselines 都提供SubprocVecEnv,但这些仅在 TensorFlow 中有效,甚至在最新版本中也无效。 好吧,我没想到这种可能性...我似乎很有趣,看看是否有人可以提供帮助! Reddit here 上也有人问过这个问题。 是的,那是我问的:D 【参考方案1】:

您可以编写一个自定义类来迭代内部环境元组,同时维护基本的 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()

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

import gym
make_env_fn = lambda: gym.make('CartPole-v0')
env = VectorEnv(make_env_fn, n=4)

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

【讨论】:

谢谢!有没有一种方法可以轻松地并行化环境,而不是依次运行每个步骤? 另外,我应该如何处理在不同步数后结束的环境? 有可能用线程替换for 循环,例如通过使用multiprocessing 模块。老实说,我认为它不会加快速度,除非您的环境运行起来非常昂贵并且证明线程创建的开销是合理的。通常,训练代理是性能瓶颈(尤其是在您使用深度神经网络时),因此最好将优化重点放在这一点上。 对于第二个问题,通常即使某些环境没有完成,您也会在固定数量的时间步长后停止训练。因此,如果您有 10 个环境,并且您想要训练您的代理总共 1,000,000 个时间步,您只需将向量环境步进 100,000 次然后关闭它——即使 7/10 的基础环境仍在中间的一集。我相信the A3C paper 做到了这一点。请注意,VectorEnv 会在环境提前完成时自动重置环境,因此这些细节被有效地抽象掉了。

以上是关于如何向量化强化学习环境?的主要内容,如果未能解决你的问题,请参考以下文章

基于强化学习的期权量化交易回测系统1

基于强化学习的期权量化交易回测系统2

基于强化学习的期权量化交易回测系统2

基于强化学习的期权量化交易回测系统3

基于强化学习的期权量化交易回测系统3

ReLeQ:一种自动强化学习的神经网络深度量化方法