OpenAI gym的建模思想

2023-11-12

一、强化学习问题需要描述那些内容

强化学习中最主要的两类对象是“个体”和“环境”,其次还有一些像“即时奖励”、“收获”、“状态”、“行为”、“价值”、“策略”、“学习”、“控制”等概念。这些概念把个体和环境联系起来。通过理论学习,我们知道:

1. 环境响应个体的行为。当个体执行一个行为时,它需要根据环境本身的动力学来更新环境,也包括更新个体状态,同时给以个体一个反馈信息:即时奖励。

2. 对于个体来说,它并不掌握整个环境信息,它只能通过观测来获得其可以获得的信息,它能观测到哪些信息取决于问题的难度;同样个体需要一定的行为与环境进行交互,哪些行为是被允许的,也要由个体和环境协商好。因此环境要确定个体的观测空间和行为空间。

3. 个体还应该有一个决策功能,该功能根据当前观测来判断下一时刻该采取什么行为,也就是决策过程。

4. 个体具有执行一个确定行为的功能。

5. 智能的个体应能从与环境的交互中学习到知识,进而在与环境交互时尽可能多的获取奖励,最终达到最大化累积奖励的目的。

6. 环境应该给个体设置一个(些)终止条件,即当个体处在这个状态或这些状态之一时,约定交互结束,即产生一个完整的Episode。随后重新开始一个Episode或者退出交互。

把上面的过程提炼成伪代码可以是下面这样:

 

class Environment(): self.states # 所有可能的状态集合 self.agent_cur_state # 记录个体当前的状态 self.observation_space # 个体的观测空间 self.action_space # 个体的行为空间 def reward(self) -> reward # 根据状态确定个体的即时奖励 def dynamics(self, action) -> None # 根据当前状态和个体的行为确定个体的新状态 def is_episode_end(self) -> Bool # 判断是否一个Episode结束 def obs_for_agent() -> obs # 环境把个体当前状态做一定变换,作为个体的观测 class Agent(env: Environment): self.env = env # 个体依附于一个环境存在 self.obs # 个体的观测 self.reward # 个体获得的即时奖励 def performPolicy(self, obs) -> action # 个体执行一个策略产生一个行为 def performAction(self, action) -> None # 个体与环境交互,执行行为 action = self.performPolicy(self.obs) self.env.dynamics(action) def observe(self) -> next_obs, reward # 个体得到从环境反馈来的观测和奖励 self.obs = self.env.obs_for_agent() self.reward = self.env.reward()

按照上面的设计,可以写出一个不错的个体与环境的类。但是我们不打算按照这个写下去,我们看看gym库是如何描述环境,以及个体通过什么方式与环境进行交互。

二、gym库介绍

gym的官方网址在:这里,其库代码托管地址在:这里

gym库的在设计环境以及个体的交互时基本上也是解决上述问题,但是它有它的规范和接口。gym库的核心在文件core.py里,这里定义了两个最基本的类Env和Space。前者是所有环境类的基类,后者是所有空间类的基类。从Space基类衍生出几个常用的空间类,其中最主要的是Discrete类和Box类。通过其__init__方法的参数以及其它方法的实现可以看出前者对应于一维离散空间,后者对应于多维连续空间。它们既可以应用在行为空间中,也可以用来描述状态空间,具体怎么用看问题本身。例如如果我要描述上篇提到的一个4*4的格子世界,其一共有16个状态,每一个状态只需要用一个数字来描述,这样我可以把这个问题的状态空间用Discrete(16)对象来描述就可以了。对于另外一个经典的小车爬山的问题(如下图),小车的状态是用两个变量来描述的,一个是小车对应目标旗杆的水平距离,另一个是小车的速度(是沿坡度切线方向的速率还是速度在水平方向的分量这个没仔细研究),因此环境要描述小车的状态需要2个连续的变量。由于描述小车的状态数据对个体完全可见,因此小车的状态空间即是小车的观测空间,此时再用Discrete来描述就不行了,要用Box类,Box空间可以定义多维空间,每一个维度可以用一个最低值和最大值来约束。同时小车作为个体可以执行的行为只有3个:左侧加速、不加速、右侧加速。因此行为空间可以用Discrete来描述。最终,该环境类的观测空间和行为空间描述如下:

self.min_position = -1.2 self.max_position = 0.6 self.max_speed = 0.07 self.goal_position = 0.5 self.low = np.array([self.min_position, -self.max_speed]) self.high = np.array([self.max_position, self.max_speed]) self.action_space = spaces.Discrete(3) self.observation_space = spaces.Box(self.low, self.high)

从这段代码可以看出,要定义一个Discrete类的空间只需要一个参数n就可以了,而定义一个多维的Box空间需要知道每一个维度的最小最大值,当然也要知道维数。

有了描述空间的对象,再来看环境类如何声明就简单的多了。先来看看代码中关于环境基类的一段解释:

class Env(object): """The main OpenAI Gym class. It encapsulates an environment with arbitrary behind-the-scenes dynamics. An environment can be partially or fully observed. The main API methods that users of this class need to know are: step reset render close seed When implementing an environment, override the following methods in your subclass: _step _reset _render _close _seed And set the following attributes: action_space: The Space object corresponding to valid actions observation_space: The Space object corresponding to valid observations reward_range: A tuple corresponding to the min and max possible rewards Note: a default reward range set to [-inf,+inf] already exists. Set it if you want a narrower range. The methods are accessed publicly as "step", "reset", etc.. The non-underscored versions are wrapper methods to which we may add functionality over time. """ # Override in SOME subclasses def _close(self): pass # Set these in ALL subclasses action_space = None observation_space = None # Override in ALL subclasses def _step(self, action): raise NotImplementedError def _reset(self): raise NotImplementedError def _render(self, mode='human', close=False): return def _seed(self, seed=None): return []

看得出,个体主要通过环境的一下几个方法进行交互:step,reset,render,close,seed,而这几个都是公用方法,具体每一个方法实际调用的都是其内部方法:_step,_reset,_render,_close,_seed。此外这段描述还指出,如果你要编写自己的环境类,也主要是重写这些私有方法,同时指定该环境的观测和行为空间。_close方法可以不用重写。这几个方法主要完成的个性化功能如下:

_step: 最核心的方法,定义环境的动力学,确定个体的下一个状态、奖励信息、是否Episode终止,以及一些额外的信息,按约定,额外的信息不被允许用来训练个体。

_reset: 开启个体与环境交互前调用该方法,确定个体的初始状态以及其他可能的一些初始化设置。

_seed: 设置一些随机数的种子。

_render: 如果需要将个体与环境的交互以动画的形式展示出来的话,需要重写该方法。简单的UI设计可以用gym包装好了的pyglet方法来实现,这些方法在rendering.py文件里定义。具体使用这些方法进行UI绘制需要了解基本的OpenGL编程思想和接口,这里暂时不做细说。

可以看出,使用gym编写自己的Agent代码,需要在你的Agent类中声明一个env变量,指向对应的环境类,个体使用自己的代码产生一个行为,将该行为送入env的step方法中,同时得到观测状态、奖励值、Episode是否终止以及调试信息等四项信息组成的元组:

state, reward, is_done, info = env.step(a)

state 是一个元组或numpy数组,其提供的信息维度应与观测空间的维度一样、每一个维度的具体指在制定的low与high之间,保证state信息符合这些条件是env类的_step方法负责的事情。

reward 则是根据环境的动力学给出的即时奖励,它就是一个数值。

is_done 是一个布尔变量,True或False,你可以根据具体的值来安排个体的后续动作。

info 提供的数据因环境的不同差异很大,通常它的结构是一个字典:

{"key1":data1,"key2":data2,...}

获取其中的信息应该不难。

最后一点,在自己的代码中如何建立个环境类对象呢?有两种情况,一种是在gym库里注册了的对象,你只要使用下面的语句:

import gym env = gym.make("registered_env_name")

其中不同的环境类有不同的注册名,只要把make方法内的字符串改成对应的环境名就可以了。

另外一种使用自己编写的未注册的环境类,这种很简单,同一般的建立对象的语句没什么区别:

env = MyEnvClassName()

相信读者已经基本清楚了如何使用gym提供的环境类了。下一步就是如何编写自己的环境类了。


转自:https://zhuanlan.zhihu.com/p/28086233

转载于:https://www.cnblogs.com/yifdu25/p/8295052.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

OpenAI gym的建模思想 的相关文章

随机推荐

  • java开发利用jacob将word转pdf

    jacob 缺点 需要 window 环境 而且速度是最慢的需要安装 msofficeWord 以及 SaveAsPDFandXPS exe word 的一个插件 用来把 word 转化为 pdf 开发流程 SaveAsPDFandXPS
  • STM32驱动BH1750模块

    模块描述 BH1750FVI是一款用于I2C总线接口的数字环境光传感器IC 该集成电路最适合获取环境光数据 用于调整手机的 LCD和键盘背光功率 可以在高分辨率下检测宽范围 1 65535 lx 引脚说明 VCC 5V GND GND SC
  • Tomcat-JDBC源码解析及优化

    数据库连接池 连接池是常见的一种资源复用的技术 利用连接池 可以将那些创建开销较大的资源汇聚到一个池子里缓存起来 需要使用的时候只需要从连接池里取出来就可以了 中间省去了频繁的创建和销毁的过程 数据库连接池就是其中的典型应用 深入Tomca
  • jmeter分布式测试配置

    分机配置 1 执行配置文件 bin jmeter properties 文件 2 配置远程端口号 jmeter默认端口号1099 可以不进行配置 3 设置远程执行模式 设置配置文件 mode Standard前面的 注释去掉 server
  • HTML5元素周期表

    http www 52html5 com manual html5 Elements Table
  • chatGPT 学习分享:内含PPT分享下载

    InstructGPT论文地址 Training language models to follow instructions with human feedback chatGPT地址 openAI 个人整理的PPT 可编辑 下载地址 c
  • 光遇自动弹琴脚本代码_刚入门测试?那你就不得不看一下!一行代码解决问题...

    对于刚开始做自动化测试的新手同学来说 我们还是非常建议大家通过IDE提供的设备窗口去连接测试设备的 这样不仅可以非常直观地看到设备的画面 还可以在运行脚本时 自动帮大家生成带连接设备参数的运行命令 减少很多不必要的错误 当然 很多同学也会有
  • nodejs+npm的安装与配置

    目录 下载与安装 下载 安装 配置 nodejs相关配置 npm相关配置 nodejs的基本使用 搭建简易后端服务器 npm的基本使用 搭建vue 2 0开发环境 下载与安装 下载 点击 Node js中文网 根据自身系统进行下载即可 建议
  • 打不出电话显示无法连接到服务器,打电话显示无法连接到服务器

    打电话显示无法连接到服务器 内容精选 换一换 华为云帮助中心 为用户提供产品简介 价格说明 购买指南 用户指南 API参考 最佳实践 常见问题 视频帮助等技术文档 帮助您快速上手使用华为云服务 有以下几种现象 将制作好的SD卡插入开发者板并
  • mysql数据库用户控制权限

    grant all on dbname tablename to newuser identified by newuser123 拥有所有权限 grant select on dbname tablename to newuser ide
  • 使用HAL库开发STM32:GPIO口基础使用与外部中断

    文章目录 目的 GPIO口基础使用 基础说明 初始化设置 输出与控制 读取端口值 GPIO口与外部中断 总结 目的 对于MCU来说GPIO口的使用是最基础的内容 仅使用GPIO口和延时等 就可以完成很多功能了 GPIO口基础使用 基础说明
  • 报错‘function’object has no attribute‘XXXX’

    报错原因 可能是方法后面没有加 train x为dataframe train X train x to numpy train X train X reshape train X shape 0 train X shape 1 1 运行结
  • CNN目标检测(三):SSD详解

    SSD github https github com weiliu89 caffe tree ssd SSD paper https arxiv org abs 1512 02325 SSD eccv2016 slide pdf http
  • ShareSDK各社交平台申请APPkey 的网址及申请流程汇总

    http bbs mob com thread 275 1 1 html 平台 开放平台地址 APPkey 申请流程 新浪微博 http open weibo com http bbs mob com thread 89 1 4 html
  • 提示由于找不到MSVCR120.dll文件,怎么修复呢?MSVCR120.dll是什么文件?

    打开游戏或者软件的时候 电脑提示由于找不到MSVCR120 dll文件 无法执行此代码是原因呢 其实就是电脑系统中的MSVCR120 dll文件丢失或者损坏了 MSVCR120 dll文件可以帮助系统运行一些需要Microsoft Visu
  • 08年上最新各大IT公司薪水行情(硕士)

    08年最新各大IT公司薪水行情 最近终于把自己给卖了 这几个月来自己陆陆续续的面试的有30多家公司 主要是IT公司 准备把今年我所知道的IT公司的待遇薪水总结一下 这里面包括我自己找工作所知道的 我们系的其他同学已经拿到的offer 还有几
  • Python 利用pexpect和paramiko模块进行远程服务器的监控

    一 模块的安装 安装pexpect模块 pip install pexpect 安装paramiko模块 yum install python devel pip install paramiko 注意 如果不安装python devel
  • jsp记住密码怎么实现_Java Web网站怎么利用Cookie实现记住密码功能

    在做java web网站开发时 为了避免每次登录都需要输入用户名和密码 我们会使用Cookie技术来实现记住密码功能 在这里小编使用简单的项目案例来教大家具体的实现过程 前期准备 1 下载好jquery 在这里我们采用3 5 1版本的jqu
  • Python数据分析环境搭建

    1 Python数据分析简介 Python是一种面向对象的解释型计算机程序设计语言 其使用 具有跨平台的特点 可以在Linux macOS以及Windows系统中搭建环境并使用 其编写的代码在不同平台上运行时 几乎不需要做较大的改动 使用者
  • OpenAI gym的建模思想

    一 强化学习问题需要描述那些内容 强化学习中最主要的两类对象是 个体 和 环境 其次还有一些像 即时奖励 收获 状态 行为 价值 策略 学习 控制 等概念 这些概念把个体和环境联系起来 通过理论学习 我们知道 1 环境响应个体的行为 当个体