无法理解张量流概率双射器 'RealNVP' 'log_prob 的工作原理

Having trouble understanding how tensorflow probability Bijectors 'RealNVP' 'log_prob works

这是代码

tfd = tfp.distributions
tfb = tfp.bijectors

# A common choice for a normalizing flow is to use a Gaussian for the base
# distribution. (However, any continuous distribution would work.) E.g.,
nvp = tfd.TransformedDistribution(
    distribution=tfd.MultivariateNormalDiag(loc=[0., 0., 0.]),
    bijector=tfb.RealNVP(
        num_masked=2,
        shift_and_log_scale_fn=tfb.real_nvp_default_template(
            hidden_layers=[512, 512])))

x = nvp.sample((32,32))

x = nvp.sample((32,32)) 给我一个 32x32x3shape 的张量。但是,当将 x 放入 nvp.log_prob(x) 时,我得到一个 32x32shape 张量。因为我想得到这个 32,32,3 张量的 log_prob,所以我期待一个 (1,) 样的张量。

所以问题是,如何修改上面的代码来计算 32x32x3 形张量的 log_prob

RNVP 转换向量值分布(即上述情况中的 MVNDiag)。您可以尝试 nvp.distribution.log_prob(x)(应用基础分布的 log_prob),并注意它具有相同的形状。 log_prob函数"consumes"事件形态x.

变换分布的 log_prob 类似于

nvp.distribution.log_prob(nvp.bijector.inverse(x)) - nvp.bijector.inverse_log_det_jacobian(x)(我可能换了符号。)

即,它是应用于通过双射变换拉回的样本的基础分布 log_prob 的总和,加上一个校正项以说明(局部,在 x)变化双射变换引起的体积。