3.2.2 Gym的经典控制环境
Gym内部有很多强化学习环境,同时在网络上也可以找到人们为了特定强化学习任务编写的很多环境。在这些强化学习环境中,用得比较多的一个强化学习环境是所谓的经典控制(Classic Control)环境。这些环境代表一系列的二维空间中的简单强化学习控制任务,由于环境的简单性,可以很容易被用于测试强化学习算法。
下面用最简单的车杆模型(CartPole)来演示一下如何使用这个经典控制环境。车杆模型的一个例子如图3.5所示。在图中可以观察到有一个黑色的滑块(代表一辆小车),这个滑块上有一个长杆,长杆的一个端点固定在车上,另外一个端点则能自由移动。在整个强化学习环境中,小车能够在一个平面上左右自由移动(每一步只能选择向左或者向右移动),而长杆的一端由于固定在车上会随着小车的移动而移动。另外,长杆的另一端会因为重力的缘故而下落。整个智能体的强化学习目标是尽可能让长杆保持向上,如果维持在这个状态(长杆与垂直方向的夹角在15°以内),长杆会一直获取+1的奖励。当长杆和垂直方向的夹角超出一定的角度(即前面所述的15°),或者当小车的位置和中心位置相距在2.4个单位以外的时候,整个强化学习环境将会转入终止状态。
综上所述,作为强化学习的智能体,应该每次做出向左或者向右移动一步的决策,从而保持长杆和垂直方向夹角小于前述角度,并且跟中心的距离不超过前述的限制。
图3.5 车杆模型控制环境示意图
OpenAI Gym可以通过类似于3.2.1节中介绍的函数接口来模拟车杆模型的控制环境。代码3.4演示了如何使用这些函数接口。
代码3.4 车杆模型控制环境演示代码。
在代码3.4中,首先根据名字'CartPole-v0'创建了一个控制环境。OpenAI Gym框架里的每个强化学习环境都有自己的名字,读者可以从官方的文档获取强化学习环境的名字,并且根据名字调用make函数来创建强化学习环境。有了具体的强化学习环境后,可以根据在代码3.3中说明的强化学习环境的使用方法,使用20个片段(Episode)的采样,在每次片段采样开始的时候,首先需要调用reset方法来重置强化学习环境,获取初始的观测状态obs。对于车杆模型来说,强化学习环境的观测状态是一个Python数组,其中的四个值分别代表小车的位置、小车的速度、长杆的速度和长杆的角速度。在实际的算法中,可以使用这四个值作为深度强化学习算法的输入,也可以直接用render方法输出的图像(见文件ex_3_3.py中获取车杆模型当前图像的示例)来作为深度强化学习算法的输入,算法的输出可以是当前状态的价值(价值网络),或者当前状态对应的动作(策略网络)。
接下来通过一个循环获取单次采样的轨迹(Trajectory),这里限制每一次采样的决策最多100步,多于这个步数则重新开始一个新的片段进行采样。在每一步开始之前,需要一个动作action来决定下一步的走向。可以简单地使用action_space变量的sample方法来获取一个随机的动作,也可以由前面所述的价值网络和策略网络,根据当前的强化学习环境状态来获取下一步动作。
然后使用随机采样的方法从动作空间中采样一个动作(对于车杆控制模型,这个值应该是0或者1,分别代表让小车向左或者向右移动)。另外,在训练过程中还需要的一个变量是决策的每一步得到的奖励,这里用reward变量来获取对应的奖励,done变量则如前面所述代表强化学习环境是否处于终止状态。最后的info变量用于调试,在车杆模型控制环境中为空字典。
车杆模型是一个典型的离散动作空间的控制模型,在OpenAI Gym中还有一些连续动作空间的控制环境,比如单摆环境,可以使用名字'Pendulum-v0'来创建这个环境。读者可以在文件ex_3_4.py中找到对应的代码。这个强化学习环境和车杆模型控制环境的区别在于,当我们使用action_space.sample方法的时候,采样的动作是一个连续的介于-2.0到+2.0之间的一个数(具体代表的是作用在这个单摆上的力矩),对应的观测状态是角度的正弦值、余弦值和对应的角速度(角度相对于时间的变化率,类比于车杆模型中的速度)。另外,强化学习的奖励也发生了改变,从源代码可以看出,强化学习的目标是让单摆摆得尽可能高,同时对应的角速度的平方和力矩的平方尽可能小。我们会在后续的算法环节中看到对于连续的动作空间,经典的基于离散的价值网络的方法如DQN等因为对于连续的动作空间不再适用,需要使用策略网络或者其他算法(如DPG)来解决问题。