PPO2:动作采样、Gumbel 分布和可推导性

问题描述

我正在尝试了解 PPO2 算法的工作原理。我在研究期间遇到了行动抽样。我下面的所有代码片段都来自 OpenAI PPO2 Baseline 实现。

我目前的理解: 通过从离散动作的分类概率分布中采样来为我们的代理生成动作通常是不可微的。但这是必需的,因为我们使用反向传播训练我们的 RL 代理。 Gumbel 分布是一种连续分布,它从分类分布中逼近样本,因此支持反向传播。我已经完成了 this 教程。它显示了大约。通过将 gumble noise 添加logits 然后取 argmax 来计算概率。 gumble-noise 也可以通过从均匀分布中采样并取两次负对数来表示。这正是 PPO2 实现中动作采样的完成方式:

def sample(self):
    u = tf.random_uniform(tf.shape(self.logits),dtype=self.logits.dtype)
    return tf.argmax(self.logits - tf.log(-tf.log(u)),axis=-1)

到目前为止,我认为使用 np.random.choice 之类的东西没有任何优势,它也允许从分类值中进行采样。让我们回到实际的陈述,即我们需要一个可微的采样解决方案。我们在动作采样中仍然有 argmax 操作,这是不可微的。可以做的是通过 argmax 来近似 softmax 操作。那么,它应该是完全可微的。

到目前为止我失败的地方: 以我目前对 PPO2 实现的理解,我无法转移所描述的使用 Gumble-distribution 的想法,以便与源代码可区分。 根据上面的代码片段对操作进行采样。在训练期间,通过计算 negative log probability (neglogp) 来使用新旧策略之间的比率。

ratio = tf.exp(OLDNEGLOGPAC - neglogpac)

这是通过将 logits 和标签向量传递给 softmax_cross_entropy_with_logits_v2 函数来完成的。标签向量是在采样动作的帮助下构建的,因此操作可以分解为将 softmax 应用于 logits,然后在采样动作的索引:

negative log

一个问题:为什么PPO2中的整个过程是可微的,虽然有tf.argmax操作?我的假设是,因为在训练期间我们从动作中构造了一个标签,所以对动作进行采样的过程不会影响梯度计算?这可能是正确的吗?

第二个问题:如果我的假设是正确的,那么使用 def neglogp(self,x): # return tf.nn.sparse_softmax_cross_entropy_with_logits(logits=self.logits,labels=x) # Note: we can't use sparse_softmax_cross_entropy_with_logits because # the implementation does not allow second-order derivatives... if x.dtype in {tf.uint8,tf.int32,tf.int64}: # one-hot encoding # construct one-hot-vector ... else: # already encoded assert x.shape.as_list() == self.logits.shape.as_list() return tf.nn.softmax_cross_entropy_with_logits_v2( logits=self.logits,labels=x) 而不是 gumbel noise 来对动作进行采样有什么好处?

谢谢!

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)