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

Pytorch 如何将强化学习环境矢量化?,pytorch,vectorization,reinforcement-learning,Pytorch,Vectorization,Reinforcement Learning,我有一个Python类,它符合OpenAI的环境API,但它是以非矢量化的形式编写的,即它每一步接收一个输入操作,每一步返回一个奖励。如何对环境进行矢量化?我在GitHub上找不到任何清晰的解释。您可以编写一个自定义类,在维护基本的Gym API的同时,对环境的内部元组进行迭代。实际上,会有一些差异,因为底层环境不会在同一时间段终止。因此,将标准的步骤和重置功能组合在一起更容易 有一种方法叫做步骤。下面是一个例子: class VectorEnv: 定义初始值(自我,制造环境,n): self.

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

您可以编写一个自定义类,在维护基本的Gym API的同时,对环境的内部元组进行迭代。实际上,会有一些差异,因为底层环境不会在同一时间段终止。因此,将标准的
步骤
重置
功能组合在一起更容易 有一种方法叫做
步骤
。下面是一个例子:

class VectorEnv:
定义初始值(自我,制造环境,n):
self.envs=元组(为范围(n)中的u生成_env_fn()
#仅在培训开始时调用此选项一次(可选):
def种子(自我,种子):
断言len(self.envs)=len(seeds)
返回元组(env的环境种子,zip中的环境种子(self.envs,种子))
#仅在培训开始时调用此选项一次:
def重置(自):
返回元组(self.envs中的env的env.reset())
#在每个时间步调用此选项:
def步骤(自我、行动):
断言len(self.envs)=len(操作)
返回值=[]
对于env,一个在zip中的文件(self.envs,actions):
观察、奖励、完成、信息=环境步骤(a)
如果这样做:
观察=环境重置()
返回值。追加((观察、奖励、完成、信息))
返回元组(返回值)
#在培训结束时,将其称为:
def关闭(自我):
对于self.envs中的环境:
环境关闭()
然后您可以这样实例化它:

导入健身房
make_env_fn=lambda:gym.make('CartPole-v0'))
环境=矢量环境(制造环境,n=4)

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

我很好奇,如果一个矢量化的环境接受一系列动作,那么它的使用情形是什么?一个环境不会接受一系列动作。相反,我希望能够传入操作数组,并将每个操作发送到单独的环境。稳定的基线和基线都提供
subcvecenv
,但它们只在TensorFlow中工作,甚至不是最新的版本。好吧,我没有考虑这种可能性。。。我好像不耐烦,看看有没有人能帮忙!Reddit上也有人问这个问题。是的,我问的是:谢谢!是否有一种方法可以轻松地并行化环境,而不是串行运行每个步骤?另外,我应该如何处理在不同步骤数后结束的环境?可以使用线程替换
for
循环的
,例如,通过使用
多处理
模块。老实说,我不认为它会使事情加速很多,除非您的环境运行起来非常昂贵,并且可以证明线程创建的开销是合理的。通常,训练代理是性能瓶颈(特别是在使用深度神经网络的情况下),因此最好将优化重点放在这一点上。对于第二个问题,通常在固定的时间步长后停止训练,即使某些环境没有完成。因此,如果你有10个环境,并且你要训练你的代理总共1000000个时间步长,你只需将向量环境步骤100000次,然后关闭它——即使说,7/10的底层环境仍然处于一个插曲的中间。我相信是他干的。请注意,
VectorEnv
会在环境提前完成时自动重置环境,因此这些细节会被有效地抽象掉。