多类Sigmoid用于DRL动作选择

时间:2018-08-27 15:15:56

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

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

谢谢

1 个答案:

答案 0 :(得分:0)

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

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

在多分类的情况下,您的代码正在使用tf.multinomial函数根据logit给出给定的日志概率选择1个动作。当您将其转换为二进制格式时,它极大地简化了问题。但这也完全改变了问题的结构。

您可以简单地将其用于S型输出:

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

其中,如果输出不是0.5,则动作为no;如果输出大于0.5,则动作为yes。

您的代码以前做的是二进制分类,它将输出2个元素的向量而不是单个标量。并且向量将具有是和否动作的概率,如下所示:

output = [P(no),P(yes)]

和您的tf.one_hot将使用tf.multinomial选择的动作转换为一个热向量。因此,如果选择“是”,它将看起来像这样:

y = [0,1]

将其更改为S形时,得到的标量为0或1,表示操作为是或否。