在 TensorFlow 中实现简单的 PPO 代理

Implement simple PPO Agent in TensorFlow

我读到了这篇关于近端策略优化算法的好文article,现在我想将我的 VanillaPG 代理更新为 PPO 代理以了解更多相关信息。但是,我仍然不确定如何在实际代码中实现它,尤其是因为我使用的是简单的离散操作 space.

所以我用我的 VPG Agent 做的是,如果有 3 个动作,网络输出 3 个值 (out),我在这些值上使用 softmax (p) 并将结果作为分布来选择其中一个动作。对于训练,我采用状态、动作和优势并使用此损失函数:

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

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

你应该也可以在离散状态下做到这一点而没有任何问题(不过我从未尝试过)。你说的概率 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 来补充损失,计算为当前策略对采样操作的对数概率。