我正在研究一个为CartPole open-ai环境实现强化学习的tensorflow网络。
网络实现用于策略梯度代理的likelihood ratio approach。
问题是,保单损失是使用gather_nd op定义的!这里,看:
....
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.actions_array来选择self.y的索引。
这里我漏掉了什么?谢谢!
发布于 2017-08-16 05:25:28
如果收集了参数,则梯度为1;如果未收集参数,则梯度为0。聚集运算符的一个用例是充当稀疏的单热矩阵乘法。第二个参数是稀疏矩阵的密集表示,您只需选择正确的行,就可以将其与第一个参数“相乘”。
发布于 2018-05-15 07:56:17
它是唯一可微的w.r.t。self.y,而不是self.actions_array的整数/离散元素。
发布于 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。因此,它不会通过索引来推进梯度。
https://stackoverflow.com/questions/45701722
复制相似问题