Tensorflow2.0 如何使用Tensorflow计算产品分布的KL散度

Tensorflow2.0 如何使用Tensorflow计算产品分布的KL散度,tensorflow2.0,tensorflow-probability,probability-distribution,Tensorflow2.0,Tensorflow Probability,Probability Distribution,我想计算KL散度DKL(∏张量流中的q(zk | x)‖p(z)) 其中∏q(zk | x)是N个分布的乘积(k=1到k=N),不是独立的,每个类型的tensorflow_概率层都是多变量的。p(z)是一个tfp.distributions.multivarianentormaldiag。 单个q(z | x)和p(z)之间的KL发散:DKL(q(z | x)‖p(z))起作用 我已经尝试子类tfp Distributions类来创建产品分布Q(z)=∏q(zk | x) 然后计算DKL(Q

我想计算KL散度DKL(∏张量流中的q(zk | x)‖p(z))


其中∏q(zk | x)是N个分布的乘积(k=1到k=N),不是独立的,每个类型的tensorflow_概率层都是多变量的。p(z)是一个tfp.distributions.multivarianentormaldiag。 单个q(z | x)和p(z)之间的KL发散:DKL(q(z | x)‖p(z))起作用


我已经尝试子类tfp Distributions类来创建产品分布Q(z)=∏q(zk | x) 然后计算DKL(Q(z)‖p(z)),但我必须实现_kl_散度函数,这需要我重新开始



我想用tensorflow概率或者至少是tensorflow来解决这个问题。

我不认为这个例子有解析KL。但由于KL[q | | p]是q(x)*log|q(x)-q(x)*log|p(x),所以可以使用蒙特卡罗近似法来计算KL。在全要素生产率中,这可能看起来像:

q=QDist(…)
p=MVNDiag(…)
x=q.sample()#x~q(x)
kl=q.log\u prob(x)-p.log\u prob(x)
或者,对于较低的方差

x=q.sample(10)#x~q(x)
kl=tf.math.reduce_mean(q.log_prob(x)-p.log_prob(x))