一、选择框架
RL方面学习框架和平台很多,比较出名的有DeepMind的 Control Suite,OpenAI的 Gym 和 MuJoCo,以及Roboschool、PyBullet等等。
模型和算法依赖于后端使用的库有numpy, tensorflow, keras, pytorch等等。
作为一个初学者,我选则比较常用的OpenAI的 Gym 和 MuJoCo作为环境,Python 2.7 or 3.5以上都可以。在Linux上测试会比较稳定,Windows折腾一下也行。
安装Gym:
# 不翻墙可能速度会比较慢
pip install gym
# 用清华镜像下载
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple gym
MuJoCo安装过程:mujoco win7下载安装
另外,OpenAI出品了强化学习 (RL) 入门教程,叫Spinning Up。
完全没有机器学习基础的人类,也可以迅速上手强化学习。有实战,有论文,有习题,帮你从入门到精通。
地址:Spinning Up
二、认识Gym
Gym是OpenAI的开源测试平台,可以从官方文档了解一下gym
Gym主要有以下几个环境:
-
经典控制和玩具文字:完成小规模任务,大部分来自RL文献。 他们是来帮助您入门的。
-
算法:执行计算,例如添加多位数和反转顺序。 有人可能会反对说,这些任务对于计算机而言很容易。 挑战在于仅从示例中学习这些算法。 这些任务具有很好的特性,即可以通过改变序列长度来轻松地改变难度。
-
Atari:玩经典的Atari游戏。 我们以易于安装的形式集成了Arcade学习环境(这对强化学习研究产生了重大影响)。
-
2D和3D机器人:在仿真中控制机器人。 这些任务使用了MuJoCo物理引擎,该引擎设计用于快速准确的机器人仿真。 其中包括加州大学伯克利分校研究人员的最新基准测试的一些环境(偶然会在今年夏天加入我们)。 MuJoCo是专有软件,但提供免费试用许可证。
我选择比较简单的CartPole-v1作为学习对象。
一根杆子连接到一辆大车上,大车沿着无摩擦的轨道移动。通过对小车施加+1或-1的力来控制系统。钟摆开始是直立的,我们的目的是防止它倒下来。杆保持直立的每个时间步长都提供+1的奖励。当杆子与垂直线的夹角超过15度时,或者推车从中心移出2.4个单位以上时,一局结束。
三、从代码开始
直接开始学习Gym的用法
官网给出了示例代码:
import gym
env = gym.make('CartPole-v0')
for i_episode in range(20):
observation = env.reset()
for t in range(100):
env.render()
print(observation)
action = env.action_space.sample()
observation, reward, done, info = env.step(action)
if done:
print("Episode finished after {} timesteps".format(t+1))
break
env.close()
这段代码运行之后会出现小车以及车上得到杆子随机运动的图形,以及输出了很多组四个数字
看到这行代码
observation, reward, done, info = env.step(action)
step()函数是关键,它返回了四个值:observation 、reward、done 、info 。
- observation (object): 一个环境特定的对象,代表你对环境的观察。例如,来自相机的像素数据、机器人的关节角度和关节速度,或者棋盘游戏中的棋盘状态。
- reward (float): 由先前行为获得的奖励。大小范围在不同的环境之间变化,但最终目标总是增加你的总奖励。
- done (boolean): 是否该重置环境了。大多数(但不是全部)任务被划分为明确定义的情节,并且done 是True 表明该事件已经终止。(比如,杆子倾斜太远,或者你失去了你的最后生命。)
- info (dict): 用于调试的诊断信息。它有时可以用于学习(例如,它可能包含在环境的最后状态改变背后的原始概率)。然而,官方评估你的算法时不允许使用这个来学习。
这里我们输出了observation ,知道它有四个数值,通过查看CartPole源码知道这四个数值的意义。
Num | Observation | Min | Max |
---|---|---|---|
0 | Cart Position | 4.8 | 4.8 |
1 | Cart Velocity | -Inf | Inf |
2 | Pole Angle | -24 deg | 24 deg |
3 | Pole Velocity At Tip | -Inf | Inf |
就是说输出的值是:[车的位置,车的速度,杆子的角度,杆子顶端的速度]
除了observation以外,还有个action需要注意
Num | Action |
---|---|
0 | Push cart to the left |
1 | Push cart to the right |
在这个游戏中action只有两个值:0或1。0将小车向左推,1将小车向右推。
这里我们采取的策略是随机action
action = env.action_space.sample()
这个游戏的奖励是木棒每保持平衡1个时间步,就得到1分。当杆子与垂直线的夹角超过15度时,或者推车从中心移出2.4个单位以上时,一局游戏结束。