返回介绍

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

发布于 2025-01-21 00:48:37 字数 5038 浏览 0 评论 0 收藏 0

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 的方式去稳定网络的变化,算法如下:

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

总体的细节都介绍完了,希望大家有所收获。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文