走进强化学习
董林森 I 文
李元龙 I 技术审稿
随着深度强化学习(Deep Reinforcement Learning)算法的快速发展,例如DDPG, A3C, Rainbow[1-3]等算法的提出,以及强化学习模型如围棋[4]等越来越多实际领域的突破性进展,越来越多的学者投入到了这一领域的研究工作。如何快速搭建深度强化学习算法及其框架以便于研究和实验成为一个不可忽视的问题。本文将通过介绍OpenAI Gym[5], Baselines[6], rllab [7]等开源强化学习框架及其应用,来降低进行强化学习研究的开发代价,使得研究者能够快速实现强化学习算法的测试、部署和对比。
本文会涉及到Python、TensorFlow、强化学习及面向对象编程 (Object-Oriented Programming)的背景知识。
强化学习基本概念
首先介绍强化学习的基本模型。如图1,在一个环境(Environment)中,强化学习通过控制一个智能体(Agent),在每个时刻t,通过观测环境的状态(State), 由自身的策略(Policy),产生一个行为(Action),在环境中执行该行为后,得到新的状态,同时得到一个奖励 (Reward)。智能体的目标为通过调整自身策略来最大化累计奖赏(Long term reward) 。整个过程建立在马尔科夫决策过程 (Markov Decision Process) 上。
图1. 强化学习基本框架 [Sutton et al. 2018]
在对强化学习有了基本了解后,我们开始介绍现有的深度学习开源框架的使用,包括Gym,Baselines,rllab。
OpenAI Gym
Gym是OpenAI 开源的一个深度学习环境。(图2)它集成了包括Mujoco,Classic Control,Atari等测试环境和游戏。环境的行为类型包括了离散控制和连续控制,观测空间的复杂度上包涵从只有2维的Pendulum到HuanmoidStandup的367维。
图2 部分OpenAI Gym环境
对于Gym的基本安装和使用,官方文档[8]有较清楚的介绍,我们这里介绍如何实现自己的Gym环境。
A. 首先查看Gym的源代码 gym/gym/core.py 下的Class Env(object)
图3. gym environment 基类
根据代码中相应的文档,我们可以实现以下代码:
图4. 基于gym environment 实现的环境
在代码中,首先我们的环境需要继承Gym的基本类Env。同时,对于observation_space, action_space,gym提供了一些封装的类供我们使用,代码在/gym/spaces。如我们的例子中使用的Box用来表示一个多维的连续变量。它所提供的sample方法,可以方便我们直接随机生成observation或者action。同样,gym提供了 discrete表示离散多维状态, multiBinary表示多维二进制变量等,基本满足我们的使用需求。
B.现在通过在gym中注册我们自己实现的环境,使得能够通过gym统一的 gym.make()方法声明一个自己的环境。
将我们的代码组织成如下结构:
图5. 环境代码的组织结构
__init__.py为如下代码,其通过register将自己的环境注册到gym中:
图6. 新环境注册实现
C. 打开一个python console运行以下代码:
图7. 新环境测试运行
可以看到我们成功通过gym.make的统一接口实现了自己的环境的创建。但需要注意的是,gym关于environment的文档并不丰富,所以在进行算法测试时,建议大家进行手动测试和查看源代码来了解测试环境,从而使自己对算法的测试和调参更有把握。同时OpenAI维护了对部分环境的LeaderBoard [9] ,使得大家可以对自己的算法结果进行比较。
样例代码地址: https://github.com/Lukeeeeee/WechatDemo-CAP
OpenAI Baselines
接下来再介绍OpenAI的另一个开源库baselines。这个仓库提供了大量高质量实现的深度强化学习算法,包括DDPG, DQN, PPO等。我们可以借助这些代码快速在不同的环境上进行测试,同时避免自己从零开始实现这些算法带来的各种错误,来达到快速复现别人的工作或者实现自己实验的目的。
以DDPG为例,baselines里提供了不同的action noise,layer normalization, parameter adaptive noise等方法, 同时它完全兼容gym,方便大家在不同的gym环境上进行测试。
但Baselines的不同算法在实现时,并没有采用相同的接口和设计,因此我们很难使用baselines的代码加入到自己的算法框架中。所以建议在使用时,更多以参考其实现方法为主。如果尝试封装baselines的模型,需要仔细阅读源代码,避免在使用时出现比如模型未初始化,Batch Normalization 使用错误等问题。
rllab
Gym只提供环境,Baselines只提供算法。相比于Gym和Baselines, rllab同时提供了环境和强化学习算法的封装,因此使用起来更加方便。同时它也完全兼容Gym。rllab提供了包括 REINFORCE, Trust Region Policy Optimization, Cross Entropy Method等强化学习方法,Ou Noise, Gaussian Noise等不同种类的探索策略,Hessian Free Optimizer, First Order Optimizer 等优化方法。如图8为rllab 中强化学习算法的抽象类。
图8. rllab中强化学习算法基类
总结来说,rllab 提供了一个建立在gym上的更丰富的框架,对于研究人员来说是一个非常易用和全面的平台。
总结
本文对gym, baselines, rllab三个开源项目的简单介绍,希望可以使得大家以后再进行强化学习的开发和研究时,能有效利用这些代码,快速实现和验证自己的算法,降低算法的实现难度,能够把更多的时间用来模型的调参、优化等。
参考文献
[1]Lillicrap T P, Hunt J J, Pritzel A, et al. Continuous control with deep reinforcement learning[J]. Computer Science, 2015, 8(6):A187.
[2]Mnih V, Badia A P, Mirza M, et al. Asynchronous Methods for Deep Reinforcement Learning[J]. 2016.
[3]Hessel M, Modayil J, Van Hasselt H, et al. Rainbow: Combining Improvements in Deep Reinforcement Learning[J]. 2017.
[4]Silver D, Schrittwieser J, Simonyan K, et al. Mastering the game of Go without human knowledge.[J]. Nature, 2017, 550(7676):354-359.
[5]https://gym.openai.com/
[6]https://github.com/openai/baselines
[7]rllab.readthedocs.io/en/latest/
[8] https://github.com/openai/gym
[9]https://github.com/openai/gym/wiki/Leaderboard
本文版权归作者所有。
新加坡南洋理工CAP组
领取专属 10元无门槛券
私享最新 技术干货