我正在研究深度强化学习问题,我想在最后一层使用 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)
谢谢
如果要从softmax转换为sigmoid函数,这通常意味着您正在从多分类问题转换为二元分类问题。
多分类示例:吃面、吃鱼、吃肉、不吃 二元分类示例:吃,不吃
在多分类情况下,您的代码使用 tf.multinomial 函数来选择 1 个操作,给定 logit 的对数概率。 当您将其转换为二进制大小写时,它极大地简化了问题。 但它也完全改变了问题的结构。
您可以简单地用于 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 的标量,表示操作是或否。