免费ip代理下载
自动生成OpenAI Gym环境。RDDL中变量的离散时间步进化由条件概率函数描述,这些函数自然地适应Gym的步骤方案。此外,由于RDDL是一种提升描述,修改和扩展环境以支持多个实体和不同配置变得微不足道,而不是一个容易出错的过程。我们希望pyRDDLGym能够通过RDDL的独特表达能力,为强化学习社区带来新的风潮,从而实现基准测试的轻松快速开发。通过提供对RDDL描述中模型的显式访问,pyRDDLGym还可以促进利用模型知识进行交互学习的混合方法的研究。我们介绍了pyRDDLGym的设计和内置示例,以及纳入框架的RDDL语言的扩展。
强化学习(RL)Sutton和Barto [2018]和概率规划Puterman [2014]是两个研究分支,它们解决了随机问题,通常在马尔可夫假设下进行状态动态建模。规划方法需要给定的模型,而学习方法通过与环境的重复交互来改进,可以将其视为一个黑箱。因此,这两个分支的工具和基准已经分道扬镳。学习代理不需要能够模拟基于模型的转换,因此像OpenAI Gym Brockman等人[2016]这样的框架已经成为标准,也作为第三方基准的接口,如Todorov等人[2012],Bellemare等人[2013]等。
由于模型对于解决学习问题不是必需的,环境在编程语言中是硬编码的。这有几个缺点;如果一个人确实希望看到描述环境的模型,它必须从环境框架中进行逆向工程,复杂的问题可能导致显著的开发周期,代码错误可能会进入环境,最后,没有干净的方法来验证模型或直接重用它。因此,创建一个经过验证的可接受基准是一项具有挑战性的任务。
另一方面,规划代理可以与环境Sanner [2010a]交互,但在许多情况下,在规划代理内部模拟模型以解决问题Keller和Eyerich [2012]。规划社区也为各种类型的问题提出了正式描述语言;这些包括用于经典规划问题的规划域定义语言(PDDL)Aeronautiques et al. [1998],用于涉及时间和连续变量问题的PDDL2.1 Fox和Long [2003],用于具有动作概率效应和奖励的经典规划问题的PPDDL Bryce和Buet [2008],以及用于描述MDP和POMDP的关系动态影响图语言(RDDL)Sanner [2010b]。虽然代理可以使用这些语言描述的模型来模拟转换和计算计划,但通过将数学问题描述与环境生成解耦,利用这些描述语言自动生成环境也是很自然的。
近年来,针对特定描述语言的自动生成工具已经出现,允许自动生成环境和访问问题正式模型,作为规划和学习方法与单一框架交互的桥梁。RDDLSim Sanner [2010a]是一个长期存在的独立框架,它将RDDL问题转化为可交互的环境。RDDLSim是一个Java模拟器,具有独特的API,要求交互代理管理TCP/IP连接。尽管这适用于国际规划竞赛(IPC),但对于快速RL研究来说,门槛很高。一个更新的Python版本的RDDLSim被开发出来,主要支持连续变量的MDP Bueno [2020]。由于它实现了OpenAI Gym接口,这个工具被命名为rddlgym。随后,PDDLGym Silver和Chitnis [2020]被引入。这是一个从PDDL域和问题文件生成Gym环境的Python工具。由于PDDLGym在PDDL文件上工作,它可以生成经典规划问题,即确定性问题。PDDLGym对PPDDL有一些支持,允许它模拟动作概率效应,但状态噪声、并发、观察和其他马尔可夫模型的组成部分不受支持。
为了能够以一般方式描述MDP和POMDP,允许因子描述,我们在本文中介绍了pyRDDLGym,这是一个从RDDL描述自动生成Gym环境的Python框架。该库可在pyRDDLGym获取。pyRDDLGym支持RDDL语言的主要子集,并且还扩展了它以支持MDP中的终端状态。pyRDDLGym与rddlgym不同,因为它允许派生流体、观察、离散流体等。它也是目前唯一支持状态外源性和内源性噪声、动作并发、观察和其他完全描述MDP所需块的框架。我们希望pyRDDLGym能够促进RL和规划社区之间更多的合作。这将允许利用模型描述和交互的混合方法出现。此外,我们的目标是构建一个经过验证的随机域基准,供概率规划和RL社区使用。
RDDL Sanner [2010b] 是一种提升的声明性语言,用于描述MDP,其中状态、动作和观察(无论是离散的还是连续的)都是参数化变量。RDDL利用参数化变量,这有助于扩展域。这些是基本变量的简单模板,可以在给定定义可能域对象的特定问题实例时获得。完全或部分观察到的随机过程的演化通过条件概率函数(CPFs)指定,这些函数在当前状态和动作变量的条件下覆盖下一个状态变量,并允许并发。RDDL中的目标函数由即时奖励和指定的折扣因子定义。对于接地模型(实例),RDDL只是一个因子MDP,如果是部分观察的,则是POMDP。
因此,一个接地的RDDL问题可以适应Gym的交互方案,其中代理采取行动并从环境中接收观察和奖励。在这个黑箱场景中,问题的显式结构丢失,留给代理推理。然而,能够利用模型中信息的代理有可能显著提升其性能。
像所有语言一样,RDDL也在不断发展,以避免歧义并增加表达能力。此外,为了适应Gym方案,引入了额外的功能。与原始语言描述Sanner [2010b]的偏差列在下一节中。
pyRDDLGym支持原始RDDL的大部分内容。以下组件从pyRDDLGym中实现的RDDL变体中省略(或标记为已弃用):
- 派生流体由框架支持,如语言描述中所述。然而,它们被认为是已弃用的,并将在未来版本中移除。
- 状态-动作约束未实现,并在语言中被认为是已弃用的,以避免歧义。仅支持指定状态不变量和动作先决条件的较新语法。
- 动作先决条件根据Sanner [2010b]实现。然而,它们受用户偏好影响。默认情况下,框架不强制执行动作先决条件块中的表达式。因此,在违反时,会向用户打印警告,并通过使用默认值将动作推入合法空间,模拟将继续。为了确保正确行为,期望域设计者包括在CPFs块中处理无效动作的适当逻辑。在用户选择强制执行动作先决条件的情况下,模拟将被中断,并抛出适当的异常。
- 通过环境的标准action_space和state_space属性支持对变量(状态/动作)域的直接查询。为了使此功能正常工作,要求域设计者在动作先决条件块中以“fluent OP BOUND”格式指定每个(提升的)变量边界,其中OP ∈ {, , =, =},BOUND是问题参数的确定性函数,在实例化时进行评估。
在RDDL中,当声明派生或中间流体时,其级别也应声明,以定义其在问题动态贝叶斯网络(DBN)中的位置,这决定了流体的评估顺序。虽然从域设计者的角度来看,级别层次声明并不复杂,但它完全是不必要的。在pyRDDLGym中,遵循Sanner [2010a]的实现,省略了此声明,如果提供则忽略。在任何给定时间步的流体评估顺序始终如下
其中st表示当前状态,dt表示派生流体,it表示中间流体,st+1表示下一个状态。设计域时的一个要求是流体顺序必须形成有向无环图(DAG)。因此,我们首先从所有流体类型的CPFs生成调用图。然后我们使用拓扑排序按评估顺序对流体进行排序。这有两个优点,第一个是流体评估顺序的推理,第二个是验证评估顺序中没有循环,并且(1)中的评估顺序是正确的。
对RDDL的另一个扩展是向语言中添加终端状态。MDP可能有一个终端状态,它可以是目标状态或没有更多可用动作的状态。关键是在这两种情况下,都希望结束模拟,例如,代理撞墙,摆锤超过阈值等。RDDL目前不支持这些情况,只支持固定水平问题。另一方面,Gym可以随时通过done标志终止一个episode。
因此,在RDDL中引入了一个额外的块来支持终端状态。表示终端状态块的关键字是termination,它支持条件列表:
为了与Gym API兼容,需要实现五个方法。首先,__init__(),它初始化环境,并在该方法中完成RDDL的解析、接地和适应环境方案。reset(),其中环境返回到初始状态,并返回初始状态或POMDP情况下的None。step(),其中根据RDDL文件中的CPFs计算转换函数。render(),其中实现可视化,最后是close()方法,其中释放资源以便可以终止模拟。还需要实现两个构造,即action_space和observation_space属性,它们分别通知代理动作和观察空间的类型和域。
RDDL描述包含三个组件。第一个是domain块,其中提供了提升域的信息,例如类型免费ip代理下载、CPFs、流体定义等。第二个组件是instance块,它指定了一个特定问题,即接地提升抽象域所需的所有内容。第三个块是non-fluents块,它从instance块中指向,因为它也是实例化特定问题的一部分。这个块是实例的常量,或者更准确地说,它定义了问题的拓扑结构。要创建一个环境,所有三个组件都是必需的。因此,包含全局问题定义的domain应该在.rddl文件中提供,而其他两个块,因为它们一起定义了一个实例,应该放在第二个单独的.rddl文件中。__init__()方法需要这两个文件才能生成Gym环境。
调用__init__()方法,首先解析domain、instance和non-fluents中提供的RDDL描述,然后对解析树调用接地器以生成所需的具体实例。此时,从RDDL类型到Gym空间的转换完成,并且action和observation属性被填充。CPF采样器对象也在这里为接地问题实例化。在pyRDDLGym中,提供了三个额外的属性。第一个是horizon,它通知代理关于问题的水平,假设没有遇到终端状态。此属性返回的值是instance块中RDDL horizon字段定义的水平步数。第二个属性是NumConcurrentActions,它表示代理可以在单个时间步中发送到框架的最大并发动作数。在RDDL实例中max-nondef-actions字段指定pos-inf的情况下,返回问题中所有可用接地动作的数量,表示并发动作数量没有限制。第三个也是最后一个属性是discount,它简单地通知环境将用于计算总奖励的折扣因子。
RDDL和Gym对状态和动作空间的表示不同。虽然RDDL总是期望接收完整的动作向量,即使max-nondef-actions指示的数量低于可用动作的数量,但Gym交互代理被要求仅提供所需的动作,而不需要显式跟踪问题中的所有动作及其默认值。为了缓解这些问题,pyRDDLGym在Gym.Spaces.Dict对象中实现动作和状态(以及观察),其中键是动作/状态/观察的接地名称,值是在动作情况下传递给模拟的预期值,或在当前时间步的状态/观察值。当要求代理将动作传递给环境时,它只需要传递所需的动作,而不是完整的动作列表,环境将在CPFs评估之前用默认值补充代理指定的动作。
RDDL类型到Gym空间的转换是直观的。实值流体表示为Gym.Spaces.Box,整数转换为Gym.Spaces.Discrete,布尔值转换为Gym.Spaces.Discrete(2)。边界根据动作先决条件块中指定的约束,或表示没有边界值。action_space和observation_space将分别返回动作和观察,其中字典键是动作/状态/观察的接地名称,值是适当的Gym.Spaces。从环境action_space采样将始终返回有效值,因为类型是Gym.Spaces和RDDL类型之间的双向转换,并且由环境属性通知的边界也符合动作先决条件规范。在任何情况下,CPFs也作为最后一道防线,防止超出边界的值。
RDDL是对问题的提升描述,即domain块定义了带有参数的运算符方案,而不是显式变量。因此表达式
对于状态/观察和动作流体,当用参数接地提升流体时,会发生名称转换为接地流体。提升流体名称到接地流体名称的转换是通过下划线完成的。由于下划线在RDDL中是有效的命名字符,流体与参数之间用三重下划线(___)分隔,参数之间用双下划线(__)分隔。即,具有两个参数的提升流体将接地如下
pyRDDLGym支持MDP和POMDP。如果在RDDL文件中没有声明观察流体,框架将返回完整状态。在RDDL中存在观察流体的情况下,框架仅返回观察流体。如果观察到状态流体,则应为状态流体定义观察流体;不可能将状态流体标记为观察到的。尽管这可能看起来像是流体的不必要重复,但它允许在指定观察时增加灵活性,例如确定性观察、随机观察等。由于在转换后的状态上定义观察的转换,在MDP的情况下,时间零点没有观察,只有初始状态。
在标准MDP中,变量值在离散时间步计算,导致过程通过重复执行单步转换函数进行演化。因此,pyRDDLGym中的step()方法评估RDDL问题描述中为实例中所有流体定义的CPFs。pyRDDLGym中的step()方法经历四个主要步骤。首先,它验证动作是否在允许范围内,并相应地发出警告或异常。然后,它根据依赖性分析确定的级别对CPFs进行排序。接下来,它使用当前状态和动作评估CPF表达式。最后,它检查状态是否符合状态不变量,以确保合法转换并识别终端状态。如果任何状态不变量被违反,表明设计错误,则会引发异常,并终止episode,表明不应将其用于学习。
当调用reset()时,模拟将简单地恢复到RDDL的instance块中指定的初始状态。请注意,reset()方法中没有随机性,如果希望重置到不同的初始状态,必须使用新的实例实例化新环境。自然地,只有同一环境的episode之间的初始状态将是相同的,其余步骤将根据RDDL域的CPFs中指定的动态进行随机化。在MDP的情况下,reset()方法将返回状态的初始值,在POMDP的情况下,将返回一个字典,其中所有值都设置为Python值None。
pyRDDLGym还通过Gym的render()方法支持可视化。通过调用render()方法,当前状态的可视化显示在屏幕上,并返回一个图像对象给用户。pyRDDLGym为每个环境实现的默认内置可视化器称为TextViz,它生成一个带有观察及其当前值的文本描述的图像。要创建用户定义的可视化器,只需实现pyRDDLGym.Visualizer.StateViz接口,并使用set_visualizer( )方法将可视化对象指定给环境。pyRDDLGym提供的内置可视化示例如图3所示。
pyRDDLGym为所有示例环境提供高级可视化。除了用于pyRDDLGym教程的经典RDDL域Fire Fighting之外,所有其他示例都涉及连续或混合空间。所有域都有明确定义的内部结构(因子空间),这些结构在RDDL文件中明确指定。框架的最初目标是促进结合强化学习和基于模型的规划的混合方法。因此,我们认为现在是时候为需要不仅仅是无模型学习或组合搜索的问题建立基准了。由于pyRDDLGym是一个多功能框架,所有以前的IPC的RDDL域可以通过提供相关的domain和instance文件Sanner [2010a]轻松导入。值得注意的是,所有过去的IPC问题都可以通过rddlrepository存储库访问并导入到pyRDDLGym中,该存储库可以在以下网址找到:。
目前,pyRDDLGym中实现了15个环境。从之前的模拟器Sanner [2010a]改编而来,Fire Fighting域是一个离散域。它被添加到pyRDDLGym中作为学习pyRDDLGym和RDDL的介绍域。Mars Rover域是标准MAPF问题Standley [2010]的动态版本,具有动态属性和灵感来自Taitler等人[2019]和Fernandez-Gonzalez等人[2018]。Power Unit Commitment示例有两个版本,一个离散动作版本,直接取自2014 IPC,一个连续动作版本。有三个原创域;elevators,一个离散域,Racing car是一个连续控制域,通过调整non-fluents可以构建完全不同的赛车轨道。UAV域是第三个,它也有三个版本。这三个版本在动作空间类型上有所不同。第一个是完全连续的,第二个是完全离散的,第三个是混合离散-连续动作空间。UAV中的动态是Hull [2007]中描述的完整模型的简化版本。
两个域改编自OpenAI Gym经典控制域,以便有一些熟悉域并展示转换过程到RDDL是多么简单。Mountain Car和Cart-pole。Cart-pole有两个版本:一个用于连续动作,一个用于离散动作。另一个域是推荐系统Mladenov等人[2020],它不是一个经典的控制或运筹学问题,但在过去几年中获得了关注,并且在现实生活中扩展到数百万个对象,这对决策算法本身就是一个挑战。最后一个域是一个交通域,模仿QTM/BLX模型Guilliard等人[2016],Lin等人[2009]。它是一个宏观流量和交通模型,可以从单个孤立的交叉口扩展到大型信号交叉口网络。环境列表及其详细信息见表1。此外,附录A给出了如何从问题定义到工作pyRDDLGym环境的示例。
为了访问pyRDDLGym中的内置示例,使用了提供domain和instance文件以及可视化对象的统一接口。ExampleManager对象是所有示例的域、实例和可视化器的注册地。ExampleManager在pyRDDLGym文档中有记录,但它有几个关键方法。第一个是ListExamples(),一个静态方法,列出所有示例并附有简短描述。在该方法中列出的域名可以用来实例化ExampleManager对象并访问示例详细信息。然后可以使用get_domain()和get_instance(#)方法获取domain和instance文件的路径。最后,get_visualizer()返回示例的专用可视化对象。
XADD(扩展代数决策图)Sanner等人[2011]支持符号变量和函数的紧凑表示和操作。事实上,一旦为特定RDDL实例接地,这种数据结构可以用来表示RDDL域中定义的CPFs。pyRDDLGym可以为接地域中的所有状态/观察生成XADDs,供规划代理使用。
通过给定域实例的XADD编译,可以轻松可视化不同流体之间的依赖关系。为此,框架中还提供了动态贝叶斯网络(DBNs)可视化工具。该工具提供了一种生成类似于影响图的图表的方法。
虽然NumPy Harris等人[2020]作为pyRDDLGym的默认后端,但它也支持JAX Bradbury等人[2018]作为替代方案,可以处理梯度。这种能力使得可以使用反向传播方法Wu等人[2017],Bueno等人[2019]进行规划。此外,pyRDDLGym还实现了一个JAXPlanner,它涵盖了RDDL语言的整个范围,便于GPU执行,并解决了随机问题。在实际应用中,给定模型,可以生成由影响图描述的roll-out,并且可以计算总奖励或其他性能指标,如风险Patton等人[2022],并相对于输入进行微分。
JAXPlanner的一个显著特点是其能够处理混合连续-离散状态和动作空间。为了便于对动作流(action-fluents)的CPFs(条件概率函数)求导,JAXPlanner用可微分的松弛替换了功能依赖Fi,这些松弛被形式化为由某些超参数τ索引的函数族。变量,其中,定义了一个等价的有向无环图,它与G有相同的边,但是节点Xi被X˜i替换。因此,实现了一个可微分的模型近似。
鉴于RDDL中的布尔逻辑缺乏固有的可微性,发现能够有效近似布尔逻辑的函数fi,τ变得至关重要。一种方法是用t-范数替换布尔运算,Hájek [2013]。JAXPlanner包含了t-范数近似,但它还提供了操作重载的支持,允许用户定义自己的操作符。这种灵活性使用户能够根据具体需求定制实现。具体来说,t-范数是一个函数,它满足4个属性:交换性、单调性、结合性以及包含恒等元素。对于布尔值量a, b,JAXPlanner使用以下近似:
JAXPlanner提供了两种操作模式,如图5所示。第一种模式是通过执行问题的完整水平rollout来生成直线计划(SLP)。值得注意的是,在每一步使用固定水平的方法会产生类似于模型预测控制的解决方案。第二种模式涉及使用神经网络训练深度反应策略(DRP),类似于Bueno等人[2019]采用的方法。
我们介绍了pyRDDLGym,一个开源的Python框架,它从RDDL域和实例文件自动创建OpenAI Gym环境。我们希望这样一个框架的可用性将有助于促进学习和规划社区的研究人员之间的合作。我们还认为,通过分离问题设计和不再需要的编程任务,可以独立于特定平台建立RL和规划的经过验证的基准。最后,根据我们自己的经验,生成一个全新的环境已经显著加速,并且逻辑可以正式验证,这在迄今为止是不可能的。