python - tf.agent 策略可以为所有 Action 返回概率向量吗?

标签 python tensorflow2.0 reinforcement-learning tensorflow-agents

我正在尝试使用 TF-Agent TF-Agent DQN Tutorial 训练强化学习代理.在我的应用程序中,我有 1 个 Action ,其中包含 9 个可能的离散值(标记为 0 到 8)。以下是 env.action_spec() 的输出

BoundedTensorSpec(shape=(), dtype=tf.int64, name='action', minimum=array(0, dtype=int64), maximum=array(8, dtype=int64))
我想得到概率向量包含所有由训练策略计算的 Action ,并在其他应用环境中做进一步处理。但是,该策略仅返回 log_probability使用单个值而不是所有 Action 的向量。反正有没有得到概率向量?
from tf_agents.networks import q_network
from tf_agents.agents.dqn import dqn_agent

q_net = q_network.QNetwork(
            env.observation_spec(),
            env.action_spec(),
            fc_layer_params=(32,)
        )

optimizer = tf.compat.v1.train.AdamOptimizer(learning_rate=0.001)

my_agent = dqn_agent.DqnAgent(
    env.time_step_spec(),
    env.action_spec(),
    q_network=q_net,
    epsilon_greedy=epsilon,
    optimizer=optimizer,
    emit_log_probability=True,
    td_errors_loss_fn=common.element_wise_squared_loss,
    train_step_counter=global_step)

my_agent.initialize()

...  # training

tf_policy_saver = policy_saver.PolicySaver(my_agent.policy)
tf_policy_saver.save('./policy_dir/')

# making decision using the trained policy
action_step = my_agent.policy.action(time_step)
dqn_agent.DqnAgent() DQNAgent , 我设置 emit_log_probability=True , 应该定义 Whether policies emit log probabilities or not.但是,当我运行 action_step = my_agent.policy.action(time_step) 时,它返回
PolicyStep(action=<tf.Tensor: shape=(1,), dtype=int64, numpy=array([1], dtype=int64)>, state=(), info=PolicyInfo(log_probability=<tf.Tensor: shape=(1,), dtype=float32, numpy=array([0.], dtype=float32)>))
我也尝试运行 action_distribution = saved_policy.distribution(time_step) , 它返回
PolicyStep(action=<tfp.distributions.DeterministicWithLogProbCT 'Deterministic' batch_shape=[1] event_shape=[] dtype=int64>, state=(), info=PolicyInfo(log_probability=<tf.Tensor: shape=(), dtype=float32, numpy=0.0>))
如果TF.Agent中没有这样的API,有没有办法得到这样的概率向量?谢谢。

后续问题:
如果我理解正确,深度 Q 网络应该获得 state 的输入并输出状态中每个 Action 的 Q 值。我可以将这个 Q 值向量传递给 softmax 函数并计算相应的概率向量。实际上我已经用我自己定制的 DQN 脚本(没有 TF-Agent)完成了这样的计算。那么问题就变成了:如何从 TF-Agent 返回 Q 值向量?

最佳答案

在 TF-Agents 框架中执行此操作的唯一方法是调用 Policy.distribution()方法而不是 Action 方法。这将返回从网络的 Q 值计算出来的原始分布。 emit_log_probability=True仅影响 info PolicyStep 的属性命名元组Policy.action()返回。请注意,此分布可能会受到您通过的操作约束(如果您这样做)的影响;非法行为将被标记为概率为 0(即使原始 Q 值可能很高)。
此外,如果您想查看实际的 Q 值而不是它们生成的分布,那么如果不直接对您的代理随附的 Q 网络采取行动,恐怕就没有办法做到这一点(这也是附加到代理生成的 Policy 对象)。如果您想了解如何正确调用 Q-network,我建议您查看 QPolicy._distribution()方法做here .
请注意,使用预先实现的驱动程序无法完成这些操作。您必须显式构建自己的集合循环或实现自己的 Driver 对象(这基本上是等效的)。

关于python - tf.agent 策略可以为所有 Action 返回概率向量吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63555940/

相关文章:

python - 替换 tensorflow v2 的占位符

Pytorch-运行时错误 : invalid multinomial distribution (encountering probability entry < 0)

python - 如何在列表中找到最大值的所有位置?

python - 从 Python 中的字典中提取彼此不相等的随机键

tensorflow - 我在将tensorflow导入为tf时出错?

python - 如何将两个 Keras 模型的摘要数据写入各自的文件/文件夹?

python - TypeError : len is not well defined for symbolic Tensors. (activation_3/Identity:0) 请调用 `x.shape` 而不是 `len(x)` 获取形状信息

reinforcement-learning - 理解pytorch中正态分布的log_prob

python - 基于yield的相当于Python3 'yield from'委托(delegate)而不丢失发送

python - 通过 Python 电子邮件库发送电子邮件会引发错误 "expected string or bytes-like object"