采用 Tensorflow 中的梯度,tf.gradient

taking the gradient in Tensorflow, tf.gradient

我正在使用 tensorflow 的这个函数来获取我的函数 jacobian。遇到两个问题:

  1. 如果我没有记错的话,tensorflow 文档中有以下两段是自相矛盾的:

gradients() adds ops to the graph to output the partial derivatives of ys with respect to xs. It returns a list of Tensor of length len(xs) where each tensor is the sum(dy/dx) for y in ys. Blockquote

Blockquote Returns: A list of sum(dy/dx) for each x in xs. Blockquote

根据我的测试,它实际上是 return 一个 len(ys) 的向量,它是 xs 中每个 x 的总和(dy/dx)。

  1. 我不明白为什么他们将其设计为 return 是列(或行,取决于您如何定义 Jacobian)的总和。

  2. 如何才能真正得到雅可比矩阵?

4.In 损失,我需要我的函数关于输入 (x) 的偏导数,但是当我针对网络权重进行优化时,我将 x 定义为一个占位符,其值为fed later, weights are variable, 在这种情况下,我仍然可以定义函数关于输入(x)的符号导数吗?并把它放在损失中? (稍后当我们针对权重进行优化时,将带来函数的二阶导数。)

  1. 我认为你是对的,那里有一个错字,它可能是 "of length len(ys)"。

  2. 为了效率。我无法准确解释其中的原因,但这似乎是 TensorFlow 如何处理自动微分的一个非常基本的特征。见 issue #675.

  3. 在 TensorFlow 中没有直接获取雅可比矩阵的方法。看看 并再次 issue #675。基本上,每个 column/row.

  4. 需要调用一次 tf.gradients
  5. 当然可以。你可以计算任何你想要的梯度,占位符和任何其他操作之间没有真正的区别。有一些操作没有梯度,因为它没有很好地定义或没有实现(在这种情况下它通常会 return 0),但仅此而已。