Tensorflow中的矢量化Hessian计算

时间:2019-01-06 09:07:45

标签: python tensorflow autodiff

问题

考虑问题的设置

x   : A (N, K) tensor that we want to differentiate with respect to.
f(x): A function sending x to a scalar i.e.
          f: R^(N x K) -> R

我想找到的是每次观察x[i,:](尺寸为N轴),坡度(N x K)和黑森州(N x K x K)。

渐变

现在,每个观测点的梯度很容易找到,因为您只需要找到f相对于所有x值的梯度,即

df/dx[0,0]  ...  df/dx[0,K]
  .                .
  .                .
  .                .
df/dx[N,0]  ...  df/dx[N,K]

这可以简单地通过

完成
tf.gradients(f(x), x)

黑森州

我现在遇到的问题是找到大小(N, K, K)的Hessian张量。如果我天真地使用tf.hessians函数,即

tf.hessians(f(x), x)

即使对于观察之间的(N, K, N, K)值,这也会(正确地)找到偏二阶导数的x张量。这些值始终为0(在我的情况下),因此对于N较大的值,效率可能非常低。

如何使Tensorflow仅找到具有N个条目(K x K)的{​​{1}} j, k黑森矩阵,以进行观察df/(dx[i,j]dx[i,k])

我认为可能对值i有一个循环的解决方案,但是静态图也不知道0, ..., N-1,它只是为新输入动态定义的。

虚拟代码

下面是一个说明问题的最小工作示例。

N

0 个答案:

没有答案