首页 > 解决方案 > 用于 DRL 动作挑选的多类 Sigmoid

问题描述

我正在研究深度强化学习问题,我想在最后一层使用 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)

谢谢

标签: tensorflowdeep-learningreinforcement-learningpolicy-gradient-descent

解决方案


如果您要从 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 选择的动作转换为一个热向量。因此,如果选择了 yes,它将如下所示:

y = [0, 1]

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


推荐阅读