首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >tensorflow:为什么gather_nd是可区分的?

tensorflow:为什么gather_nd是可区分的?
EN

Stack Overflow用户
提问于 2017-08-16 05:19:28
回答 3查看 2.6K关注 0票数 10

我正在研究一个为CartPole open-ai环境实现强化学习的tensorflow网络。

网络实现用于策略梯度代理的likelihood ratio approach

问题是,保单损失是使用gather_nd op定义的!这里,看:

代码语言:javascript
复制
    ....
    self.y = tf.nn.softmax(tf.matmul(self.W3,self.h2) + self.b3,dim=0)
    self.curr_reward = tf.placeholder(shape=[None],dtype=tf.float32)
    self.actions_array = tf.placeholder(shape=[None,2],dtype=tf.int32)
    self.pai_array = tf.gather_nd(self.y,self.actions_array)
    self.L = -tf.reduce_mean(tf.log(self.pai_array)*self.curr_reward)

然后他们取这个损失相对于网络的所有参数的导数:

代码语言:javascript
复制
    self.gradients = tf.gradients(self.L,tf.trainable_variables())

怎么会这样呢??我认为神经网络的全部要点总是与可微的操作一起工作,比如cross-entropy,而不是做一些奇怪的事情,比如根据随机选择的、明显不可微的self.actions_array来选择self.y的索引。

这里我漏掉了什么?谢谢!

EN

回答 3

Stack Overflow用户

发布于 2017-08-16 05:25:28

如果收集了参数,则梯度为1;如果未收集参数,则梯度为0。聚集运算符的一个用例是充当稀疏的单热矩阵乘法。第二个参数是稀疏矩阵的密集表示,您只需选择正确的行,就可以将其与第一个参数“相乘”。

票数 7
EN

Stack Overflow用户

发布于 2018-05-15 07:56:17

它是唯一可微的w.r.t。self.y,而不是self.actions_array的整数/离散元素。

票数 1
EN

Stack Overflow用户

发布于 2019-01-03 20:13:58

没有关于这个问题的官方文档,但根据这个问题: tensorflow实现中tf.gather的https://github.com/tensorflow/models/issues/295梯度是1 w.r.t to self.y和0 w.r.t to index。因此,它不会通过索引来推进梯度。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45701722

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档