【问题标题】:Multiclass Sigmoid for DRL action picking用于 DRL 动作挑选的多类 Sigmoid
【发布时间】:2019-02-02 04:04:46
【问题描述】:

我正在研究深度强化学习问题,我想在最后一层使用 Sigmoid 而不是 softmax。我被困在用于动作选择的内容上。

具体来说,我应该如何替换这段代码的最后两行以及用什么替换:

logits = tf.layers.dense(hidden, n_outputs)
outputs = tf.nn.sigmoid(logits) 

action = tf.squeeze(tf.multinomial(logits, num_samples=1), axis=-1)
y = tf.one_hot(action, n_outputs)

谢谢

【问题讨论】:

  • 当你说这段代码的最后两层时,我只看到你的神经网络的输出层。你是说最后两行吗?就像在代码中的 action 和 y?
  • 是的,我是这个意思

标签: tensorflow deep-learning reinforcement-learning policy-gradient-descent


【解决方案1】:

如果您要从 softmax 转换为 sigmoid 函数,这通常意味着您正在从多分类问题转换为二分类问题。

示例多分类:吃面条、吃鱼、吃肉、不吃 二进制分类示例:吃,不吃

在多分类情况下,您的代码使用 tf.multinomial 函数来选择 1 个动作,根据您的 logits 给出日志概率。当您将其转换为二进制大小写时,它极大地简化了问题。但它也彻底改变了你的问题的结构。

您可以简单地用于 sigmoid 输出:

if outputs < 0.5:
    action = 0
else:
    action = 1

如果输出不是 0.5,则操作为 no,如果输出大于 0.5,则操作为 yes。

您的代码之前所做的是,对于二进制分类,它会输出一个包含 2 个元素的向量,而不是单个标量。并且向量将具有这样的是和否动作的概率:

输出 = [P(否), P(是)]

您的 tf.one_hot 将使用 tf.multinomial 选择的动作转换为一个热向量。因此,如果选择了是,它将如下所示:

y = [0, 1]

当您将其更改为 sigmoid 时,您会得到一个 0 或 1 的标量,表示该操作是“是”或“否”。

【讨论】:

  • 我想找到的不仅仅是得到一个答案,而是得到多个答案。不仅仅是从食物列表中选择一种,而是选择一对或全部。这也是一个策略梯度算法,我不能只使用 if else 并将其反馈给优化算法。
  • 您好 Ahmet,要获得多个答案,您只需在所有输出中循环上述函数即可。因此,您将有一组 0 和 1 用于选择或不选择。让我感到困惑的是,在您的代码中,您为 tf.multinomial 设置了 num_samples=1,并指定您只需要一个输出。另外,我真的不明白你的意思是你不能将此解决方案反馈给优化算法。策略梯度所需要的只是 [States, Actions, Rewards, States (t + 1)) 的缓存。在这种情况下,您正在定义您的操作,因此它是一个由 0 和 1 组成的一维数组。
猜你喜欢
  • 2018-10-04
  • 1970-01-01
  • 1970-01-01
  • 2020-07-07
  • 1970-01-01
  • 1970-01-01
  • 2018-06-27
  • 1970-01-01
  • 2018-11-13
相关资源
最近更新 更多