繁体   English   中英

Tensorflow:针对每个样本计算Hessian

[英]Tensorflow: compute Hessian with respect to each sample

我有一个张量X ,大小为M x D。 我们可以将X每一行解释为训练样本,将每一列解释为特征。

X用于计算大小为M x 1的张量u (换句话说, u取决于计算图中的X )。 我们可以将其解释为预测的载体; 每个样品一个。 特别地,仅使用X的第m行来计算u第m行。

现在,如果我运行tensor.gradients(u, X)[0] ,我将获得一个M x D张量,该张量对应于u相对于Xu的“每个样本”梯度。

我如何才能类似地计算“每个样本”的黑森州张量? (即M x D x D数量)


附录 :以下彼得的答案是正确的。 我还发现了使用堆栈和堆栈的另一种方法(使用彼得的表示法):

hess2 = tf.stack([
    tf.gradients( tmp, a )[ 0 ]
    for tmp in tf.unstack( grad, num=5, axis=1 )
], axis = 2)

在彼得的示例中, D = 5是要素数量。 我怀疑(但我没有检查过)对于M大来说,上述速度更快,因为它跳过了彼得答案中提到的零条目。

tf.hessians()是计算的尺寸的设置YSxs reagardless Hessian矩阵。 由于您得到的结果尺寸为M x D,xs的尺寸为M x D,因此结果将为尺寸M x D x M x D。 但是,由于每个示例的输出彼此独立,因此大多数Hessian将为零,即,三维中只有一个分片将具有任何值。 因此,要获得所需的结果,您应该在两个M维中采用对角线,或者更容易,您应该像这样简单地求和并消除第三个维:

hess2 = tf.reduce_sum( hess, axis = 2 )

示例代码(经过测试):

import tensorflow as tf

a = tf.constant( [ [ 1.0, 1, 1, 1, 1 ], [ 2, 2, 2, 2, 2 ], [ 3, 3, 3, 3, 3 ] ] )
b = tf.constant( [ [ 1.0 ], [ 2 ], [ 3 ], [ 4 ], [ 5 ] ] )
c = tf.matmul( a, b )
c_sq = tf.square( c )

grad = tf.gradients( c_sq, a )[ 0 ]

hess = tf.hessians( c_sq, a )[ 0 ]
hess2 = tf.reduce_sum( hess, axis = 2 )


with tf.Session() as sess:
    res = sess.run( [ c_sq, grad, hess2 ] )

    for v in res:
        print( v.shape )
        print( v )
        print( "=======================")

将输出:

(3,1)
[[225.]
[900.]
[2025.]
=======================
(3、5)
[[30. 60. 90. 120. 150.]
[60. 120. 180. 240. 300.]
[90. 180. 270. 360. 450.]]
=======================
(3、5、5)
[[[2. 4. 6. 8. 8. 10.]
[4. 8. 12. 16. 20.]
[6. 12. 18. 24. 30.]
[8. 16. 24. 32. 40.]
[10。 20. 30. 40. 50.]]

[[2. 4. 6. 8. 8. 10.]
[4. 8. 12. 16. 20.]
[6. 12. 18. 24. 30.]
[8. 16. 24. 32. 40.]
[10。 20. 30. 40. 50.]]

[[2. 4. 6. 8. 8. 10.]
[4. 8. 12. 16. 20.]
[6. 12. 18. 24. 30.]
[8. 16. 24. 32. 40.]
[10。 20. 30. 40. 50.]]]
=======================

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM