Deep Deterministic Policy Gradient (DDPG)
学习资料:
- 全部代码
- 修改版代码
- 什么是 Deep Deterministic Policy Gradient 短视频
- 什么是 Policy Gradient 短视频
- 论文 Continuous control with deep reinforcement learning
- 我的 DQN 教程
- 我的 Actor Critic 教程
- 强化学习实战
要点¶
一句话概括 DDPG: Google DeepMind 提出的一种使用 Actor Critic
结构, 但是输出的不是行为的概率, 而是具体的行为, 用于连续动作 (continuous action) 的预测. DDPG
结合了之前获得成功的 DQN
结构, 提高了 Actor Critic
的稳定性和收敛性.
因为 DDPG
和 DQN
还有 Actor Critic
很相关, 所以最好这两者都了解下, 对于学习 DDPG
很有帮助. 我的教程链接都能在上面的学习资料中找到.
下面是这节内容的效果提前看:
算法¶
DDPG
的算法实际上就是一种 Actor Critic
, 我在上一篇中简短地介绍了 Actor Critic
的算法. 不太清楚的同学先去看看上一篇吧.
关于 Actor
部分, 他的参数更新同样会涉及到 Critic
, 上面是关于 Actor
参数的更新, 它的前半部分 grad[Q]
是从 Critic
来的, 这是在说: 这次 Actor
的动作要怎么移动, 才能获得更大的 Q
, 而后半部分 grad[u]
是从 Actor
来的, 这是在说: Actor
要怎么样修改自身参数, 使得 Actor
更有可能做这个动作. 所以两者合起来就是在说: Actor
要朝着更有可能获取大 Q
的方向修改动作参数了.
上面这个是关于 Critic
的更新, 它借鉴了 DQN
和 Double Q learning
的方式, 有两个计算 Q
的神经网络, Q_target
中依据下一状态, 用 Actor
来选择动作, 而这时的 Actor
也是一个 Actor_target
(有着 Actor 很久之前的参数). 使用这种方法获得的 Q_target
能像 DQN
那样切断相关性, 提高收敛性.
主结构¶
注意, 录视频的时候代码有个地方有小错误, 以下部分和视频中有些地方不同, 特别是计算 Actor
更新的时候. 所以请以文字描述中的为准.
我们用 Tensorflow 搭建神经网络, 主结构可以见这个 tensorboard 的出来的图.
看起来很复杂吧, 没关系, 我们一步步来, 拆开来看就容易了. 首先看看 Actor
和 Critic
中各有什么结构.
其搭建的代码部分在这 (如果想一次性看全部, 请去我的Github):
Actor Critic¶
有了对 Actor Critic
每个里面各两个神经网络结构的了解, 我们再来具体看看他们是如何进行交流, 传递信息的. 我们从 Actor
的学习更新方式开始说起.
这张图我们就能一眼看穿 Actor
的更新到底基于了哪些东西. 可以看出, 它使用了两个 eval_net
, 所以 Actor
class 中用于 train 的代码我们这样写:
同时下面也提到的传送给 Actor
的 a_grad
应该用 Tensorflow 怎么计算. 这个 a_grad
是 Critic
class 里面的, 这个 a
是来自 Actor
根据 S
计算而来的:
而在 Critic
中, 我们用的东西简单一点.
下面就是 Critic
更新时的代码了.
最后我们建立并把 Actor
和 Critic
融合在一起的时候是这样写的.
同样, 如果你觉得只看部分代码不舒服, 这里有全部代码.
记忆库 Memory¶
以下是关于类似于 DQN
中的记忆库代码, 我们用一个 class
来建立. 关于 Memory
的详细算法, 请直接去我的 Github 中看, 这样更简单.
每回合算法¶
这里的回合算法只提到了最重要的部分, 省掉了一些没必要的, 有助理解. 如果想一次性看到全部代码, 请去我的 Github
我也用这套 DDPG 测试过自己写的机器手臂的环境, 发现效果也还行. 有兴趣的朋友可以看到这里.
有很多人留言说想要我做一个关于这个机器手臂的教程, 不负众望, 你可以在这里 看到我怎么从零开始, 手写环境, debug 测试, 来制作一个强化学习的机器手臂.
简化版代码(录完视频后发现了小错误, 重写了代码)¶
后来我在回过头来看代码, 结果发现计算 Actor
更新时有点小问题, 所以就修改了之前的代码. 但是修改后我觉得.. 代码变得累赘了, 所以我觉得再重写一个, 简化所有流程. 能看到这一个板块的朋友们有没有感到绝望(MD 看了那么久上面的代码, 结果有个更简单的). 哈哈,没关系. 学习代码和技术不要嫌多. 所以代码就直接看吧, 相信有了上面的了解, 看这份代码会比较容易.