从头开始做一个机器手臂1 搭建结构
学习资料:
为什么做这个实践¶
做这个实践的主要目的就是让我们活学活用, 从0开始搭建一个强化学习框架. 之前我们在强化学习系列教程中学习到了很多强化学习的知识, 了解了各种算法应该怎样运用, 从最简单的 Q-Learning 到结合神经网络的 DQN, 再到做连续动作的 DDPG 以及分布式训练的 A3C 和 DPPO. 但是我们却没有真正意义上的实践过一次, 因为在那个系列中大多数时候我们只关注了算法本身. 但是搭建模拟环境, 调整参数也同样重要. 所以我们在这个系列中将会做到这些, 让你真正意义上入门了强化学习.
要做成怎样¶
这个实践很简单, 我使用的是我自己一年前编写的训练代码, 让机器人手臂学会到达某一个预设点.
不过这次, 我优化了代码结构, 将这个自己做过的练习给大家呈现一遍, 让你也能一步步知道在做强化学习的时候要考量些什么, 怎么样做一个合理的环境. 所以我将从下面几个方面来阐述这些.
代码主结构¶
在做每一个强化学习的时候, 我们最好先规划好要怎么分解这一个 task. 一般来说我们尽量不要把所有代码 (环境, 强化学习算法, 学习主循环) 放在一个脚本中. 拆分成三个脚本分开管理将会更有效率, 更加方便管理, 而且眼睛也不会花了. 这也是我在自己强化学习系列教程中一直给大家呈现的方式.
具体来说, 这三方面的脚本可以是这样:
- 环境脚本 (env.py)
- 强化学习脚本 (rl.py)
- 主循环脚本 (main.py)
我们在主循环脚本中将会 import 环境和强化学习方法, 所以主循环脚本将上面两者给串联了起来. 如果你看到这次教学的代码, 你会发现我将每一步分别打包, part1, part2... 中都有上述三个脚本文件. 我们将在每个 part 中一一添加必要的部分.
这一节, 我们从最基本的 main.py 开始说. 这里涉及了程序的主循环, 也是学习的部分. 整个学习的框架可以被简化成下面这样, 我采取了 gym 模块的形式. 所以如果使用过 gym 的朋友, 你会发现无比的熟悉.
写到这个时候, 我们明白了, 在 rl.py 和 env.py 中, 我们必须有这样几个 function 和 attribute.
- rl.py
rl.choose_action(s)
rl.store_transition(s, a, r, s_)
rl.learn()
rl.memory_full
- env.py
env.reset()
env.render()
env.step(a)
env.state_dim
env.action_dim
env.action_bound
有了这些准则, 我们就能在 rl.py 和 env.py 中进行前期规划了. 所以你可以另外创建一个 env.py 的脚本, 先写好下面这个 ArmEnv
的 class. 然后给他加上上面提到的功能.
然后再创建一个 rl.py 脚本, 用来存放你要使用的 RL 的方法. 因为我想要将这个手臂环境设置成一个连续动作的环境(机器人旋转手臂时的角度是一个连续值), 所以我会选用 DDPG 的算法. 但是如果你想设置的环境是一个离散动作(比如机器人只能选上下左右4个键), 你可能需要选择不同的 RL 算法, 对环境也要有不同的应对方式.
有了这些框架, 我们的主结构就大功告成了, 接着我们就开始继续往下面添砖加瓦吧. 看看如何搭建一个模拟环境.
实战:从头开始搭建训练机器人手臂