我正在研究一个tensorflow网络,该网络为CartPole open-ai env实现了强化学习。
网络为策略梯度代理实现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.y
选择self.actions_array
索引这样的奇怪事情。我在这里想念什么?谢谢!
最佳答案
如果参数已收集,则渐变为1,否则为0。收集运算符的一个用例是像稀疏的一热点矩阵乘法一样工作。第二个参数是稀疏矩阵的密集表示,您只需选择正确的行即可将其与第一个参数“相乘”。
关于tensorflow:为什么collect_nd是可区分的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45701722/