在TensorFlow中实现简单的PPO代理

时间:2018-05-31 15:27:52

标签: python tensorflow reinforcement-learning

我读了关于近端策略优化算法的这个好article,现在我想将我的VanillaPG代理更新到PPO代理以了解更多信息。但是,我仍然不确定如何在实际代码中实现它,特别是因为我使用的是一个简单的离散动作空间。

所以我对我的VPG代理做的是,如果有3个动作,网络输出3个值(out),我使用softmax(p)并使用结果作为分布来选择其中一个动作。对于培训,我采取了状态,行动和优势,并使用这个损失函数:

loss = -tf.reduce_sum(advantages * tf.log(ch_action_p_values))

如何扩展此算法以将PPO用于离散操作?我发现的所有实现都使用连续动作空间。我不确定是否必须将损失功能更改为文章中使用的第一个。我甚至不确定我有哪些计算KLD的概率。 prob_s_a_ *和D_KL是整个批次的单个值,还是每个样本的一个值?如何在我的代理人的TF中计算它们?

1 个答案:

答案 0 :(得分:3)

你应该能够在没有任何问题的情况下使用离散状态(尽管我从未尝试过)。您所谈论的概率prob_s_a_*是使用当前策略绘制采样操作的概率(每个样本一个值)。 PPO不使用D_KL(KL分歧),因为它的实验表现更差(它们只是削减了概率比)。

因此,您只需为旧日志概要添加占位符,并剪切新日志概率(tf.log(ch_action_p_values))与旧日志概率之间的比率。

这是一个例子(e_clip是裁剪值,在他们使用的论文中使用0.2)

    vanilla_loss = -tf.reduce_sum(advantages * tf.log(ch_action_p_values))

    old_log_probs = tf.placeholder(...)
    log_probs = tf.log(ch_action_p_values)
    prob_ratio = tf.exp(log_prob - old_log_probs)
    clip_prob = tf.clip_by_value(prob_ratio, 1.-e_clip, 1.+e_clip)
    ppo_loss = -tf.reduce_mean(tf.minimum(tf.multiply(prob_ratio, advantages), tf.multiply(clip_prob, advantages)))

除了通常的advantagesch_action_p_values之外,您还需要使用old_log_probs来提供损失,计算为当前政策对采样操作的对数概率。