计算Hessians w.r.t更高级别的变量既不适用于tf.hessians()也不适用于tf.gradients()

时间:2017-08-24 15:39:42

标签: numpy machine-learning tensorflow

当我们需要计算双梯度或Hessian时,在tensorflow中,我们可以使用tf.hessians(F(x),x),或使用tf.gradient(tf.gradients(F(x),x)[0], x)[0]。但是,如果x不是排名第一,我在使用tf.hessians()时会被告知以下错误。

  

ValueError:无法计算Hessian,因为xs的元素0没有   排名第一。张量model_inputs / action:0必须排名1。   收到等级2,形状(?,1)

在以下代码中:

with tf.name_scope("1st scope"):
      self.states = tf.placeholder(tf.float32, (None, self.state_dim), name="states")
      self.action = tf.placeholder(tf.float32, (None, self.action_dim), name="action")

with tf.name_scope("2nd scope"):
  with tf.variable_scope("3rd scope"):
    self.policy_outputs = self.policy_network(self.states)
    # use tf.gradients twice
    self.actor_action_gradients = tf.gradients(self.policy_outputs, self.action)[0]
    self.actor_action_hessian = tf.gradients(self.actor_action_gradients, self.action)[0]
    # or use tf.hessians 
    self.actor_action_hessian = tf.hessian(self.policy_outputs, self.action)

使用tf.gradients()时,也会导致错误:

  

in create_variables self.actor_action_hessian =   tf.gradients(self.actor_action_gradients,self.action)[0]

     

AttributeError:'NoneType'对象没有属性'dtype'

如何解决这个问题,在这种情况下,tf.gradients()tf.hessians()是否都可以使用?

1 个答案:

答案 0 :(得分:1)

第二种方法很好,错误在其他地方,即你的图表没有连接。

self.actor_action_gradients = tf.gradients(self.policy_outputs, self.action)[0]
self.actor_action_hessian = tf.gradients(self.actor_action_gradients, self.action)[0]

错误在第二行引发,因为self.actor_action_gradients为None,因此您无法计算其渐变。您的代码中没有任何内容表明self.policy_outputs依赖于self.action(并且它不应该,因为它的操作取决于策略,而不是策略操作)。

一旦你解决了这个问题,你会注意到," hessian"不是真正的粗麻布,而是一个矢量,形成一个适当的粗糙的f wrt。 x你必须迭代tf.gradients返回的所有值,并独立计算每个值的tf.gradients。这是TF的一个已知限制,目前还没有更简单的方法。