尽管存在梯度,但tensorflow GradientTape返回None

时间:2019-10-30 14:10:30

标签: python tensorflow tensorflow2.0

我正在使用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,则可能是一个问题。

0 个答案:

没有答案