我正在使用GradientTape
来计算概率分布的导数。这是一个具有多元正态的简单示例:
import numpy as np
import tensorflow as tf
import tensorflow_probability as tfp
with tf.GradientTape() as g:
mu = tf.Variable(np.ones((2)))
sigma = tf.Variable(np.eye(2))
dist = tfp.distributions.MultivariateNormalFullCovariance(
loc=mu,
covariance_matrix=sigma)
num_samples = 10
samples = dist.sample((num_samples,))
logprobs = dist.log_prob(samples)
g.jacobian(logprobs, mu) # this does not work as expected
这无法正常工作。 g.jacobian
计算出的梯度为None
,这是不正确的。当然,概率取决于分布的平均值。
我怀疑向后传递可能会流入样本的生成,这也取决于μ。也许这无法正确计算。实际上,以下补充解决了该问题:
samples = dist.sample((num_samples,))
samples = tf.stop_gradient(samples) # this line is new
# ...
g.jacobian(logprobs, mu) # now works
是否可以使用GradientTape
设置某种错误报告?在更复杂的示例中,我正在检查渐变以查看变量是否相互依赖。如果None
不能可靠地表示None
,则可能是一个问题。