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

iha*_*nny 9 gradient reinforcement-learning tensorflow

我正在研究一个Tensorflow网络,该网络为CartPole开放式环境实现了强化学习。

网络为策略梯度代理实施似然比方法

事实是,使用gather_ndop 定义保单丢失!在这里,看看:

    ....
    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)
Run Code Online (Sandbox Code Playgroud)

然后,他们针对网络的所有参数采用这种损耗的导数:

    self.gradients = tf.gradients(self.L,tf.trainable_variables())
Run Code Online (Sandbox Code Playgroud)

怎么会这样??我认为神经网络的整个观点总是与可区分的操作一起工作,就像cross-entropy从来没有做过奇怪的事情一样,例如self.y根据self.actions_array随机选择且显然不可区分的索引选择索引。

我在这里想念什么?谢谢!

Aar*_*ron 6

如果参数已收集,则渐变为1,否则为0。收集运算符的一个用例是像稀疏的一热点矩阵乘法一样工作。第二个参数是稀疏矩阵的密集表示,您只需选择正确的行即可将其与第一个参数“相乘”。