如何解决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 举报,一经查实,本站将立刻删除。