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

时间:2017-08-15 21:19:28

标签: tensorflow gradient reinforcement-learning

我正在研究为CartPole open-ai env实施强化学习的张量流网络。

网络为策略渐变代理实现likelihood ratio approach

问题是,使用gather_nd操作定义了策略丢失!在这里,看:

    ....
    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)

然后他们根据网络的所有参数采取这种损失的衍生物:

    self.gradients = tf.gradients(self.L,tf.trainable_variables())

这怎么可能?我认为神经网络中的整个点总是使用可区分的操作,例如cross-entropy,并且从不做一些奇怪的事情,比如根据随机选择的某些self.y选择self.actions_array的索引,显然不是微的。

我在这里缺少什么?谢谢!

3 个答案:

答案 0 :(得分:5)

如果参数被收集,则梯度为1,如果不是,则为0。聚集算子的一个用例就是像稀疏的单热矩阵乘法一样。第二个参数是稀疏矩阵的密集表示,只需选择正确的行就可以将它与第一个参数“相乘”。

答案 1 :(得分:1)

关于此问题,尚无官方文档,但根据以下问题:https://github.com/tensorflow/models/issues/295在Tensorflow实现中,tf.gather的梯度相对于self.y为1 w.r.t,索引为0w.r.t。因此,它不会通过索引传播梯度

答案 2 :(得分:0)

这是唯一可以区别的w.r.t. self.y但不是self.actions_array的整数/离散元素。