在 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)))
除了通常的 advantages
和 ch_action_p_values
,您还需要用 old_log_probs
来补充损失,计算为当前策略对采样操作的对数概率。
我读到了这篇关于近端策略优化算法的好文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)))
除了通常的 advantages
和 ch_action_p_values
,您还需要用 old_log_probs
来补充损失,计算为当前策略对采样操作的对数概率。