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

标签 pytorch vectorization reinforcement-learning

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

最佳答案

您可以编写一个自定义类,在维护基本 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 这样的包装器单独和自动跟踪每个环境的统计数据。

关于pytorch - 如何矢量化强化学习环境?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59569710/

相关文章:

python - pytorch .stack .squeeze后的最终形状

PyTorch 无法检测 CUDA

recurrent-neural-network - 如何在 PyTorch 中使用 LSTM 进行强化学习?

python - 如何确保所有 PyTorch 代码在 Google Colab 上充分利用 GPU

python - 在python中找到给定元素右侧的第一个非零元素的索引

Matlab:找到没有循环的NaN的相邻实例

reinforcement-learning - 如何理解 Sutton&Barto 的 RL 书中 Watkins 的 Q(λ) 学习算法?

c++ - SSE 比 FPU 慢?

machine-learning - 贝尔曼最优方程与Q-learning的关系

python - 如何使用图像和单独的值作为输入来训练 Keras 模型?混合输入