PPO、A2C 用于连续动作空间、数学和代码

数据挖掘 深度学习 强化学习 开放式健身房
2022-02-18 22:08:01

编辑:问题已经过编辑,以更好地反映我在询问原始问题后学到的内容。

我按照此处的说明实现了裁剪的目标 PPO 剪辑:https ://spinningup.openai.com/en/latest/algorithms/ppo.html

基本上,我使用了一个虚拟参与者网络来查找新的动作概率,而无需训练本地参与者网络。

"""use temp_actor to get new prob so we don't update the actual actor until
        we do the clip op"""
        curr_weights = self.actor.get_weights()
        self.temp_actor.set_weights(curr_weights)
        self.temp_actor.fit(state, advantages, epochs=1, verbose=0)
        new_policy = self.temp_actor.predict(state, batch_size=1).flatten()
        new_aprob = new_policy[action]

然后我计算出动作概率的比率,并实现了算法的 PPO 裁剪部分:

ratio = new_aprob / old_aprob
        # scale = min(ratio * advantages, K.clip(ratio, 1 - self.epsilon, 1 + self.epsilon) * advantages)
        no_clip = ratio * advantages
        clipped = np.clip(ratio, 1 - self.epsilon, 1 + self.epsilon) * advantages

        self.actor.fit(state, np.minimum(no_clip, clipped), epochs=1, verbose=0)

完整代码在这里(请原谅评论中的一些粗俗语言): https ://github.com/nyck33/openai_my_implements/blob/master/cartpole/my_ppo_cartpole.py

我怎样才能使它适应一个连续的动作空间问题,比如 Pendulum v0。
更新:我刚刚读到这里的动作分布是正态分布或高斯分布: Reddit 正态分布

这看起来很奇怪,因为我想象动作曲线会以某种方式倾斜,具体取决于特定状态是否会在某些动作倾向下获得更好的结果。

更新:我在 PPO 的稳定基线网站上找到了这个:

返回概率分布

从这个 URI: ppo 解释

我还看到 Sutton 的 RL 书中的第 13.7 节似乎是解决此类问题的必读内容,因为该节的标题是:连续动作的策略参数化。

此外,在搜索可读实现的过程中,我还了解到 GAE(优势)是标准化的,因此可能会使实现对剧烈波动更加稳健。我也认为我的实现是不完整的,即。与我在答案中链接到的 Pytorch“解决方案”相比,缺少其他组件。

1个回答

Packt Publishing 的“Deep Reinforcement Learning Hands-On”有一整章是关于连续动作空间的。这是书中的数学:

连续动作空间的数学

以及本书随附的代码:本书的 代码仓库

上面的数学代码在:

完整的源代码在 Chapter14/02_train_a2c.py 、 Chapter14/lib/model.py 和 Chapter14/lib/common.py 。大多数代码您已经熟悉,因此以下仅包括不同的部分。让我们从第 14 章/lib/model.py 中定义的模型类开始。