深度强化学习实战:Tensorflow实现DDPG - PaperWeekly 第48期

2017 年 9 月 22 日 PaperWeekly 李国豪

作者丨李国豪

学校丨中国科学院大学&上海科技大学

研究方向丨无人驾驶,强化学习

指导老师丨林宝军教授


1. 前言


本文主要讲解 DeepMind 发布在 ICLR 2016 的文章 Continuous control with deep reinforcement learning,时间稍微有点久远,但因为算法经典,还是值得去实现。


2. 环境


这次实验环境是 Openai Gym 的 Pendulum-v0,state 是 3 维连续的表示杆的位置方向信息,action 是 1 维的连续动作,大小是 -2.0 到 2.0,表示对杆施加的力和方向。目标是让杆保持直立,所以 reward 在杆保持直立不动的时候最大。笔者所用的环境为: 


  • Tensorflow (1.2.1) 

  • gym (0.9.2) 


请先安装 Tensorflow 和 gym,Tensorflow 和 gym 的安装就不赘述了,下面是网络收敛后的结果。



3. 代码详解


先贴一张 DeepMind 文章中的伪代码,分析一下实现它,我们需要实现哪些东西:



4. 网络结构(model)


首先,我们需要实现一个 critic network 和一个 actor network,然后再实现一个 target critic network 和 target actor network,并且对应初始化为相同的 weights。下面来看看这部分代码怎么实现:


critic network & target critic network



上面是 critic network 的实现,critic network是一个用神经网络去近似的一个函数,输入是 s-state,a-action,输出是 Q 函数,网络参数是,在这里我的实现和原文类似,state 经过一个全连接层得到隐藏层特征 h1,action 经过另外一个全连接层得到隐藏层特征 h2,然后特征串联在一起得到 h_concat,之后 h_concat 再经过一层全连接层得到 h3,最后 h3 经过一个没有激活函数的全连接层得到 q_output。这就简单得实现了一个 critic network。



上面是target critic network的实现,target critic network网络结构和 critic network 一样,也参数初始化为一样的权重,思路是先把 critic network 的权重取出来初始化,再调用一遍 self.__create_critic_network() 创建 target network,最后把 critic network 初始化的权重赋值给 target critic network。 


这样我们就得到了 critic network 和 critic target network。 


actor network & actor target network 


actor network和 actor target network的实现与 critic 几乎一样,区别在于网络结构和激活函数。



这里用了 3 层全连接层,最后激活函数是 tanh,把输出限定在 -1 到 1 之间。这样大体的网络结构就实现完了。


5. Replay Buffer & Random Process(Mechanism)


接下来,伪代码提到 replay buffer 和 random process,这部分代码比较简单也很短,主要参考了 openai 的 rllab 的实现,大家可以直接看看源码。


6. 网络更新和损失函数(Model)


用梯度下降更新网络,先需要定义我们的 loss 函数。 


critic nework 更新



这里 critic 只是很简单的是一个 L2 loss。不过由于 transition 是 s, a, r, s'。要得到 y 需要一步处理,下面是预处理 transition 的代码。



训练模型是,从 Replay buffer 里取出一个 mini-batch,在经过预处理就可以更新我们的网络了,是不是很简单。y 经过下面这行代码处理得到。



actor nework更新



actor network 的更新也很简单,我们需要求的梯度如上图,首先我们需要critic network对动作 a 的导数,其中 a 是由 actor network 根据状态 s 估计出来的。代码如下:




先根据 actor network 估计出 action,再用 critic network 的输出 q 对估计出来的 action 求导。 


然后我们把得到的这部分梯度,和 actor network 的输出对 actor network 的权重求导的梯度,相乘就能得到最后的梯度,代码如下:



也就是说我们需要求的 policy gradient 主要由下面这一行代码求得,由于我们需要梯度下降去更新网络,所以需要加个负号:



之后就是更新我们的 target network,target network 采用 soft update 的方式去稳定网络的变化,算法如下:




就这样我们的整体网络更新需要的东西都实现了,下面是整体网络更新的代码:



总体的细节都介绍完了,希望大家有所收获。另外,完整代码已放出,大家可以点击“阅读原文”访问我的 Github。


关于PaperWeekly


PaperWeekly 是一个推荐、解读、讨论、报道人工智能前沿论文成果的学术平台。如果你研究或从事 AI 领域,欢迎在公众号后台点击「交流群」,小助手将把你带入 PaperWeekly 的交流群里。

▽ 点击 | 阅读原文 | 查看完整代码

登录查看更多
8

相关内容

【ICML2020】用于强化学习的对比无监督表示嵌入
专知会员服务
27+阅读 · 2020年7月6日
【综述】自动驾驶领域中的强化学习,附18页论文下载
专知会员服务
172+阅读 · 2020年2月8日
深度强化学习策略梯度教程,53页ppt
专知会员服务
178+阅读 · 2020年2月1日
强化学习扫盲贴:从Q-learning到DQN
夕小瑶的卖萌屋
52+阅读 · 2019年10月13日
初学者的 Keras:实现卷积神经网络
Python程序员
24+阅读 · 2019年9月8日
从入门到精通-Tensorflow深度强化学习课程
深度学习与NLP
23+阅读 · 2019年3月7日
TensorFlow 2.0深度强化学习指南
云栖社区
18+阅读 · 2019年2月1日
Seq2seq强化学习实战 (Pytorch, Tensorflow, Theano)
专知
15+阅读 · 2018年1月16日
深度学习CTPN算法的解读与tensorflow实现
数据挖掘入门与实战
5+阅读 · 2017年11月30日
TensorFlow seq2seq中的Attention机制(续)
深度学习每日摘要
15+阅读 · 2017年11月16日
强化学习 cartpole_a3c
CreateAMind
9+阅读 · 2017年7月21日
Knowledge Flow: Improve Upon Your Teachers
Arxiv
5+阅读 · 2019年4月11日
Arxiv
3+阅读 · 2018年10月8日
Arxiv
3+阅读 · 2018年1月31日
VIP会员
相关资讯
强化学习扫盲贴:从Q-learning到DQN
夕小瑶的卖萌屋
52+阅读 · 2019年10月13日
初学者的 Keras:实现卷积神经网络
Python程序员
24+阅读 · 2019年9月8日
从入门到精通-Tensorflow深度强化学习课程
深度学习与NLP
23+阅读 · 2019年3月7日
TensorFlow 2.0深度强化学习指南
云栖社区
18+阅读 · 2019年2月1日
Seq2seq强化学习实战 (Pytorch, Tensorflow, Theano)
专知
15+阅读 · 2018年1月16日
深度学习CTPN算法的解读与tensorflow实现
数据挖掘入门与实战
5+阅读 · 2017年11月30日
TensorFlow seq2seq中的Attention机制(续)
深度学习每日摘要
15+阅读 · 2017年11月16日
强化学习 cartpole_a3c
CreateAMind
9+阅读 · 2017年7月21日
Top
微信扫码咨询专知VIP会员