首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >tf.agent策略能返回所有动作的概率向量吗?

tf.agent策略能返回所有动作的概率向量吗?
EN

Stack Overflow用户
提问于 2020-08-24 06:43:10
回答 1查看 693关注 0票数 7

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

代码语言:javascript
复制
BoundedTensorSpec(shape=(), dtype=tf.int64, name='action', minimum=array(0, dtype=int64), maximum=array(8, dtype=int64))

我希望得到概率向量包含所有由经过训练的策略计算的动作,并在其他应用环境中进行进一步的处理。但是,策略只返回具有单个值的log_probability,而不返回所有操作的向量。有可能得到概率向量吗?

代码语言:javascript
复制
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)时,它会返回

代码语言:javascript
复制
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),它会返回

代码语言:javascript
复制
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的输入,并从状态输出每个动作的Q值。我可以把这个Q值向量传递给一个softmax函数,并计算出相应的概率向量。实际上,我已经用我自己定制的DQN脚本(没有TF)做了这样的计算。那么问题就变成了:如何从Then返回Q值向量?

EN

回答 1

Stack Overflow用户

发布于 2020-12-21 10:26:19

在TF框架中这样做的唯一方法是调用Policy.distribution()方法而不是action方法。这将返回从网络的q值中计算出来的原始分布。emit_log_probability=True只影响Policy.action()返回的PolicyStep名称元组的info属性。请注意,此分布可能受到您传递的操作约束的影响(如果您这样做的话);因此,非法操作将被标记为具有0概率(即使原来的Q值可能很高)。

此外,如果您希望看到实际的q值,而不是它们生成的分布,那么恐怕如果不直接对代理附带的q-网络(并且也附加到代理生成的Policy对象)进行操作,就无法做到这一点。如果您想了解如何正确地调用q-网络,我建议您看看QPolicy._distribution()方法是如何实现这里的。

请注意,所有这些都不能使用预实现的驱动程序来完成。您必须显式地构造您自己的集合循环,或者实现您自己的驱动程序对象(这基本上是等价的)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63555940

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档