问题
考虑问题的设置
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