MorvanZhou / Reinforcement-learning-with-tensorflow

Simple Reinforcement learning tutorials, 莫烦Python 中文AI教学

Home Page:https://mofanpy.com/tutorials/machine-learning/reinforcement-learning/

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

DPPO完全写错了,worker推送的是梯度而不是样本

GIS-PuppetMaster opened this issue · comments

论文地址
https://arxiv.org/pdf/1707.02286.pdf
Scalable reinforcement learning with Distributed PPO 这部分说了,还说同步更新梯度比异步的效果要好。

@zkx741481546
Please refer to here https://morvanzhou.github.io/tutorials/machine-learning/reinforcement-learning/6-4-DPPO/#Distributed-PPO

Google DeepMind 提出来了一套和 A3C (A3C 教程见这里) 类似的并行 PPO 算法. 看了他们 paper 中的这个 DPPO 算法后, 我觉得….不好编! 取而代之, 我觉得如果采用 OpenAI 的思路, 用他那个 “简陋” 伪代码, 但是弄成并行计算倒是好弄点. 所以我就结合了 DeepMind 和 OpenAI, 取他们的精华, 写下了这份 DPPO 的代码.

总结一下我是怎么写的.

  • 用 OpenAI 提出的 Clipped Surrogate Objective
  • 使用多个线程 (workers) 平行在不同的环境中收集数据
  • workers 共享一个 Global PPO
  • workers 不会自己算 PPO 的 gradients, 不会像 A3C 那样推送 Gradients 给 Global net
  • workers 只推送自己采集的数据给 Global PPO
  • Global PPO 拿到多个 workers 一定批量的数据后进行更新 (更新时 worker 停止采集)
  • 更新完后, workers 用最新的 Policy 采集数据

我使用的代码框架和自己的 A3C 框架有点像. 这个 DPPO 具体的代码我不会在这边描述了, 请直接看到我写的代码吧.

不过有些细节我想提前提一下, 方便你们看代码:

  • 我用到了 python threading 当中的 Event 功能, 用来控制 PPO 的更新时间和 worker 停止工作的时间
  • 使用了 threading 中的 Queue 来存放 worker 收集的数据, 发现用 python 的列表也可以达到一样效果, 计算时间上没太多差别.
  • 更新 PPO 的时候, 我采用的是 DeepMind 的 for loop 形式.