tensorflow - 用于 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)
谢谢
解决方案
如果您要从 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 的标量,表示该操作是“是”或“否”。
推荐阅读
- javascript - 在 Ember 控制器生命周期中,我在哪里添加和删除事件侦听器?
- javascript - 当 PWA 启动或在 iOS Safari 中的应用程序之间切换时是否可以获取事件
- ruby-on-rails - 2 heroku 应用程序共享数据库并且不同步
- typescript - 静态引导构造函数
- java - Spring 的基于 Java 的 Config 项目显示 404
- excel - 在 VBA 中更改日期
- javascript - 如何在角度 4 的 excelsheet 中的特定列中提取 JSON 数据
- javascript - 计算两个不同 HTML 元素的总和并使用 Jquery/JavaScript 在第三个 div 中显示
- vue.js - SyntaxError:使用 Nuxt 2.0 build.transpile 时出现意外的令牌导入
- .net - 使用 https 使用 asmx Web 服务时出错