快速上手深度强化学习?学会TensorForce就够了

2019 年 3 月 27 日 新智元



  新智元推荐 

来源:强化学习与自动驾驶

(ID:rl_and_ad)

作者:卓求

整理编辑:三石

【新智元导读】深度强化学习已经在许多领域取得了瞩目的成就,并且仍是各大领域受热捧的方向之一。本文深入浅出的介绍了如何利用TensorForce框架快速搭建深度强化学习模型。


深度强化学习(Deep Reinforcement Learning, DRL)是目前最热门的方向之一,从视频游戏、围棋、蛋白质结构预测到机器人、计算机视觉、推荐系统等领域已经取得了很多令人瞩目的成就且仍在蓬勃发展中。


AlphaGo第一作者Davild Silver就认为通用人工智能需要强化学习结合深度学习来实现,即AGI=DL+RL




框架


为了便于研究人员快速搭建出强化学习模型,很多机构发布了强化学习基准算法或框架,其中较早的有OpenAI Baselines [1]、伯克利的rllab [2],最新的有18年谷歌发布的Dopamine [3]、Facebook发布的Horizon [4]。具体见下表:



本文介绍的是TensorForce并非由这些大机构发布,而是由几个剑桥大学的博士生开发、维护的。


当时选择TensorForcce是因为需要在ROS框架下开发,而如上表列出的,它完全支持Python2,且包含很多主流的强化学习算法、支持OpenAI Gym、DeepMind Lab等常用于强化学习算法测试的基准环境。


TensorForce是架构在TensorFlow上的强化学习API,最早在17年就开源了,并发布了博客[5]介绍其背后的设计思想及基本应用。


这里简单介绍一下TensorForce的设计思想


框架设计的难点在于如何解耦出其它层面的内容,尽可能将共用的部分抽象出来。拿强化学习来说,智能体与环境不断通过交互试错来学习,如果由我们从头自己编程实现某个RL任务,为了方便智能体与环境很自然地会写在一起。但作为框架却不行,需要将智能体从环境中解耦出来。


TensorForce包括了下面四个层面的概念


Environment <-> Runner <-> Agent <-> Model


Agent在训练前可以加载model,训练后保存model,运行时接收state,(预处理后)作为model的输入,返回action。模型会根据算法及配置自动更新。Runner将Agent和Environment之间的交互抽象出来作为函数。Environment根据应用场景的不同需要自己写接口,后文会提供一个机器人导航环境的接口案例。如果是学习或者算法测试,可以使用现成的基准环境,TensorForce提供了OpenAI Gym、OpenAI Universe和DeepMind Lab的接口。


第一行代码


下面通过使用近端策略优化(Proximal Policy Optimization, PPO)算法训练OpenAI Gym中倒立摆来初识TensorForce的简洁和强大。


from tensorforce.agents import PPOAgentfrom tensorforce.execution import Runnerfrom tensorforce.contrib.openai_gym import OpenAIGym# Create an OpenAIgym environment.environment = OpenAIGym('CartPole-v0', visualize=True)network_spec = [  dict(type='dense', size=32, activation='relu'),  dict(type='dense', size=32, activation='relu')]agent = PPOAgent(  states=environment.states,  actions=environment.actions,  network=network_spec,  step_optimizer=dict(     type='adam',     learning_rate=1e-3  ),  saver=dict(directory='./saver/', basename='PPO_model.ckpt', load=False, seconds=600),  summarizer=dict(directory='./record/', labels=["losses""entropy"], seconds=600),)# Create the runnerrunner = Runner(agent=agent, environment=environment)# Start learningrunner.run(episodes=600, max_episode_timesteps=200)runner.close()


很快,倒立摆能够平衡:

使用TensorBoard查看训练过程(左图是loss,右图是entropy):



上面我们只用了30行代码实现了PPO算法训练倒立摆,代码首先定义了环境和网络(两层32个节点的全连接网络,激活函数为relu),然后定义了agent,agent的参数中states, actions, network三个参数是必填的,step_optimizer定义了优化器,saver和summarizer分别保存模型和训练过程。最后通过runner来实现agent和environment的交互,总共跑了600个episodes,每个episode的最大步长是200。


runner解耦出了交互过程,实际上是是下面过程的循环:


# Query the agent for its action decisionaction = agent.act(state)# Execute the decision and retrieve the current informationobservation, terminal, reward = GazeboMaze.execute(action)# Pass feedback about performance (and termination) to the agentagent.observe(terminal=terminal, reward=reward)


在上述过程中,agent会储存相关信息来更新模型,比如DQNAgent会存储(state, action, reward, next_state)。


视频游戏


TensorForce提供了丰富的observation预处理功能,视频游戏是DRL最先取得突破的方向,以Flappy Bird为例,需要进行四个步骤的预处理


  1. 转化为灰度图,去除不必要的颜色信息;

  2. 缩小输入的游戏截屏,resize为80*80;

  3. 堆叠连续的四帧,推导出运行信息;

  4. 归一化处理,以便于训练。



使用TensorForce可以很方便地进行预处理:


states = dict(shape=(3264, 18723, 3), type='float')states_preprocessing_spec = [  dict(    type='image_resize',     width=80,      height=80),   dict(       type='grayscale' ),   dict(       type='normalize')   dict( type='sequence',        length=4)]
agent = DQNAgent( states=states,  actions=actions, network=network_spec, states_preprocessing=states_preprocessing_spec)



环境搭建


如果要在具体的应用场景中使用TensorForce就需要根据应用场景手动搭建环境,环境的模板为environment.py [7],其中最重要的函数是execute,该函数接收agent产生的action,并在环境中执行该action,然后返回next_state,reward,terminal。这里我以搭建的Gazebo中的机器人导航环境为例,进行介绍。


首先搭建仿真环境如下图:




设计环境的接口及其与agent交互的过程:



仿真开始,init函数打开Gazebo并加载对应的导航环境,reset函数初始化机器人,execute函数接收到action后通过ROS发送对应的速度命令,Gazebo中的机器人接收到速度命令后执行对应的速度,机器人传感器返回相应的信息,计算对应的reward,读取视觉传感器的RGB图像作为next_state,判断是否到达目标点或者碰撞,如果是Terminal为True,该episode结束。完整的代码见 [8]。


复杂网络


DRL网络和算法是智能体最重要的两部分,一个确定模型结构、一个决定模型更新。上面只介绍了简单的模型,对于有些复杂网络需要层叠的方式来定义,如下如:



该网络的输入为64*48*3的RGB图像,由卷积层提取特征后与2维的速度信息和运动信息共同输入全连接层进行决策。首先定义state:


states = dict(  image=dict(shape=(48, 64, 3), type='float'), # Observation  previous_act=dict(shape=(2,), type='float'), # velocity  relative_pos=dict(shape=(2,), type='float')  # target)


然后定义action即velocity,这里为机器人的线速度(限制在[0,1])和角速度(限制在[-1,1]):


dict(linear_vel=dict(shape=(), type='float', min_value=0.0, max_value=1.0),angular_vel=dict(shape=(), type='float', min_value=-1.0, max_value=1.0))


然后通过层叠的方式来定义网络结构:


network_spec = [   [   dict(type='input', names=['image']),   dict(type='conv2d', size=32window=(86), stride=4, activation='relu', padding='SAME'),   dict(type='conv2d', size=64window=(43), stride=2, activation='relu', padding='SAME'),   dict(type='pool2d', pooling_type='max'window=2, stride=2, padding='SAME'),   dict(type='conv2d', size=64window=2, stride=2, activation='relu', padding='SAME'),   dict(type='flatten'),   dict(type='output', name='image_output')     ],     [    dict(type='input', names=['image_output''previous_act''relative_pos'], aggregation_type='concat'),    dict(type='dense', size=512, activation='relu'),    dict(type='dense', size=512, activation='relu'),     ]]

完整代码见[8]


其它


1. agent会有actions_exploration参数来定义exploration,默认值为'none',但这并不代表不探索,以PPO为例,模型在输出的时候不输出直接的确定性动作(只有DPG才会输出确定性动作),而是分布,输出在分布上采样输出,这可以看作是一种exploration。

2. 网络的输出层是根据action自动添加的,在network中定义输入层和隐藏层即可

3.  如果不再需要exploration而只是exploitation,则运行:


agent.act(action, deterministic=True)


此时agent执行greedy策略。而如果模型训练完成,不再训练则:


agent.act(action, independent=True)


此时函数只执行act不执行observe来更新模型

4. PPO算法相比于DQN,不仅性能好,并且对超参数更鲁棒,建议优先选择PPO


参考链接:

[1] https://github.com/openai/baselines

[2] https://rllab.readthedocs.io/en/latest/index.html

[3] https://github.com/google/dopamine

[4] https://github.com/facebookresearch/Horizon

[5] https://reinforce.io/blog/

[6] https://tensorforce.readthedocs.io/en/latest/

[7] https://github.com/tensorforce/tensorforce/blob/master/

tensorforce/environments/environment.py

[8] https://github.com/marooncn/navbot/blob/master/rl_nav


更多阅读


本文经授权转载自公众号“强化学习与自动驾驶”,ID:rl_and_ad



【2019新智元 AI 技术峰会精彩回顾


2019年3月27日,新智元再汇AI之力,在北京泰富酒店举办AI开年盛典——2019新智元AI技术峰会。峰会以“智能云•芯世界“为主题,聚焦智能云和AI芯片的发展,重塑未来AI世界格局。


同时,新智元在峰会现场权威发布若干AI白皮书,聚焦产业链的创新活跃,评述AI独角兽影响力,助力中国在世界级的AI竞争中实现超越。


现场精彩回顾:

爱奇艺(全天):

https://live.iqiyi.com/s/19rsj6q75j.html

头条科技(上午):

m.365yg.com/i6672243313506044680/

头条科技(下午):

m.365yg.com/i6672570058826550030/

登录查看更多
6

相关内容

强化学习(RL)是机器学习的一个领域,与软件代理应如何在环境中采取行动以最大化累积奖励的概念有关。除了监督学习和非监督学习外,强化学习是三种基本的机器学习范式之一。 强化学习与监督学习的不同之处在于,不需要呈现带标签的输入/输出对,也不需要显式纠正次优动作。相反,重点是在探索(未知领域)和利用(当前知识)之间找到平衡。 该环境通常以马尔可夫决策过程(MDP)的形式陈述,因为针对这种情况的许多强化学习算法都使用动态编程技术。经典动态规划方法和强化学习算法之间的主要区别在于,后者不假设MDP的确切数学模型,并且针对无法采用精确方法的大型MDP。

知识荟萃

精品入门和进阶教程、论文和代码整理等

更多

查看相关VIP内容、论文、资讯等
【IJCAI2020-华为诺亚】面向深度强化学习的策略迁移框架
专知会员服务
27+阅读 · 2020年5月25日
【圣经书】《强化学习导论(2nd)》电子书与代码,548页pdf
专知会员服务
201+阅读 · 2020年5月22日
最新《经济学中的强化学习》2020大综述,42页pdf128篇文献
《强化学习—使用 Open AI、TensorFlow和Keras实现》174页pdf
专知会员服务
136+阅读 · 2020年3月1日
【综述】自动驾驶领域中的强化学习,附18页论文下载
专知会员服务
172+阅读 · 2020年2月8日
深度强化学习策略梯度教程,53页ppt
专知会员服务
178+阅读 · 2020年2月1日
【强化学习】深度强化学习初学者指南
专知会员服务
179+阅读 · 2019年12月14日
专知会员服务
208+阅读 · 2019年8月30日
从入门到精通-Tensorflow深度强化学习课程
深度学习与NLP
23+阅读 · 2019年3月7日
深度强化学习入门,这一篇就够了!
机器学习算法与Python学习
27+阅读 · 2018年8月17日
【强化学习】强化学习/增强学习/再励学习介绍
产业智能官
10+阅读 · 2018年2月23日
深度强化学习小白入门攻略篇
StuQ
5+阅读 · 2017年9月7日
【强化学习】强化学习入门以及代码实现
产业智能官
18+阅读 · 2017年9月4日
详解TensorForce: 基于TensorFlow建立强化学习API
机械鸡
5+阅读 · 2017年7月22日
Arxiv
6+阅读 · 2019年7月29日
Deep Reinforcement Learning: An Overview
Arxiv
17+阅读 · 2018年11月26日
Arxiv
3+阅读 · 2018年10月8日
Relational Deep Reinforcement Learning
Arxiv
10+阅读 · 2018年6月28日
Arxiv
6+阅读 · 2018年6月21日
VIP会员
相关VIP内容
【IJCAI2020-华为诺亚】面向深度强化学习的策略迁移框架
专知会员服务
27+阅读 · 2020年5月25日
【圣经书】《强化学习导论(2nd)》电子书与代码,548页pdf
专知会员服务
201+阅读 · 2020年5月22日
最新《经济学中的强化学习》2020大综述,42页pdf128篇文献
《强化学习—使用 Open AI、TensorFlow和Keras实现》174页pdf
专知会员服务
136+阅读 · 2020年3月1日
【综述】自动驾驶领域中的强化学习,附18页论文下载
专知会员服务
172+阅读 · 2020年2月8日
深度强化学习策略梯度教程,53页ppt
专知会员服务
178+阅读 · 2020年2月1日
【强化学习】深度强化学习初学者指南
专知会员服务
179+阅读 · 2019年12月14日
专知会员服务
208+阅读 · 2019年8月30日
相关资讯
从入门到精通-Tensorflow深度强化学习课程
深度学习与NLP
23+阅读 · 2019年3月7日
深度强化学习入门,这一篇就够了!
机器学习算法与Python学习
27+阅读 · 2018年8月17日
【强化学习】强化学习/增强学习/再励学习介绍
产业智能官
10+阅读 · 2018年2月23日
深度强化学习小白入门攻略篇
StuQ
5+阅读 · 2017年9月7日
【强化学习】强化学习入门以及代码实现
产业智能官
18+阅读 · 2017年9月4日
详解TensorForce: 基于TensorFlow建立强化学习API
机械鸡
5+阅读 · 2017年7月22日
相关论文
Arxiv
6+阅读 · 2019年7月29日
Deep Reinforcement Learning: An Overview
Arxiv
17+阅读 · 2018年11月26日
Arxiv
3+阅读 · 2018年10月8日
Relational Deep Reinforcement Learning
Arxiv
10+阅读 · 2018年6月28日
Arxiv
6+阅读 · 2018年6月21日
Top
微信扫码咨询专知VIP会员