Gym小记(二)

浅析Gym中的env

        近期在Gym上做有关强化学习的实验,用的是OpenAI Gym环境,但是我对于其中的state、observation、action存在疑问,到底这些量都包含什么呢?

        然后我就去官网的Forum上去找,虽然有人存在相同的疑问,却没有人给出回答,所以只能自己去看Github上的环境代码了。现在将对Pendulum-v0进行简要分析,后面用到其他环境时将同样会分享出来。


        上面这就是Github上的Pendulum的实现代码。

        首先,明确目标,我们想要知道Pendulum环境中的state、observation、action分别是什么。我们现在带着问题对代码进行分析,先来看看_get_obs()函数:

def _get_obs(self):
        theta, thetadot = self.state
        return np.array([np.cos(theta), np.sin(theta), thetadot])
        显然,stata是Pendulum的角度和角速度,记为th和thdot,至于具体哪个角度我们将在后面进行分析。

        此外,同样可以看出observation包括了cos(th)、sin(th)、thdot三个量。

        上面这二者的定义很符合我们在强化学习中学到的知识,state是最原始的环境内部的表示,observation则是state的函数。比如说,我们所看见的东西并不一定就是它们在世界中的真实状态,而是经过我们的大脑加工过的信息。

        紧接着,我们找到了如下语句:

self.action_space = spaces.Box(low=-self.max_torque, high=self.max_torque, shape=(1,))
        这是action的定义,对于Pendulum问题来说,action space只有一个维度,就是电机的控制力矩,且有最大值和最小值的限制。

        到此为止,我们最初的三个疑问便解决了。那奖励呢?奖励是怎么计算的?

        我们找到如下代码:

costs = angle_normalize(th)**2 + .1*thdot**2 + .001*(u**2)
        这是代价,而最后_step()函数返回的是:

return self._get_obs(), -costs, False, {}
        也即reward=-costs,所以我们对costs进行分析就可以了。上面return中的done值得注意,一直传的都是False,所以这个问题没有所谓的解决一说。

        costs包含三项,一是angle_normalize(th)**2,二是.1*thdot**2,三是.001*(u**2)。第一项我们后面分析;第二项表示对于角速度的惩罚,毕竟如果我们在到达目标位置(竖直)之后,如果还有较大的速度的话,就越过去了;第三项是对于输入力矩的惩罚,我们所使用的力矩越大,惩罚越大,毕竟力矩×角速度=功率,还是小点的好。

        最后,我们对angle_normalize(th)**2进行分析,显然,这是对于当前倒立摆与目标位置的角度差的惩罚,那到底th表示哪个角度呢?

        对于angle_normalize()函数分析如下:

def angle_normalize(x):
        return (((x+np.pi) % (2*np.pi)) - np.pi)
        我们先对(x+pi)%(2*pi)-pi进行分析,带入几个角度,比如x=pi/4,return=pi/4;x=3*pi/4,return=3*pi/4;x=5*pi/4,return=-3*pi/4。这样我们就可以绘图如下:


        这就是我们的th,至此,我们的分析就告一段落啦~

        对了,我们可以通过下面的代码对于observation、action的维度进行验证:

print env.observation_space
print env.action_space
        输出如下:

       

        嗯,和我们上面的分析一致,OK。

        再啰嗦一下,里面对于torque、th和thdot都是有限制的:

self.max_speed=8
self.max_torque=2.
high = np.array([1., 1., self.max_speed])
self.action_space = spaces.Box(low=-self.max_torque, high=self.max_torque, shape=(1,))
self.observation_space = spaces.Box(low=-high, high=high)

        cos和sin都是大于-1小于1,thdot大于-8小于8,torque大于-2小于2,至于单位我们就不用考虑咯。

        对了,我们通常使智能体进行学习时,通常会设置episode的数量以及每一个episode中step的数量,值得注意的是,在gym中,绝大多数环境默认的max_episode_steps=200,也就是说对于一些环境的step函数永远不会返回一个True的done而言,最多也就跑200个step:


        当然,对于这里的Pendulum也是一样,在200个step之后,就会将done设为True,虽然class PendulumEnv中没有将done设为True:


       

        关于Pendulum我们就分析到这里了,下一个环境再见~




  • 18
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 13
    评论
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值