在tensorflow中,计算tensor y 关于tensor x的梯度是
dy_dx = tf.gradients(y, x)[0]
这里其实是计算的d(sum(y))/dx, 但等价于y的每一个分量关于x的导数。
假定有M个batch, 每个样本是N维,即输入x是一个M*N的矩阵,输出y是M*1的向量,如果想要计算每一个y的每一个分量关于x的Hessian矩阵,结果应该是M*N*N的 tensor。采用如下方式
# Hessian matrix batch_size * n_dim * n_dim
grads = tf.gradients(y, [x])[0]
hess = tf.stack([tf.gradients(tmp, [x])[0] for tmp in tf.unstack(grads, axis=1)], axis=2)
网友评论