我正在研究深度强化学习问题,我想在最后一层使用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)
谢谢
答案 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,表示操作为是或否。