我正在研究为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
的索引,显然不是微的。
我在这里缺少什么?谢谢!
答案 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的整数/离散元素。