小编Pro*_*ook的帖子

Tensorflow,负 KL 散度

我正在使用变分自动编码器类型模型,我的损失函数的一部分是均值为 0 和方差为 1 的正态分布与另一个均值和方差由我的模型预测的正态分布之间的 KL 散度。

我用以下方式定义了损失:

def kl_loss(mean, log_sigma):
    normal=tf.contrib.distributions.MultivariateNormalDiag(tf.zeros(mean.get_shape()),
                                                           tf.ones(log_sigma.get_shape()))
    enc_normal = tf.contrib.distributions.MultivariateNormalDiag(mean,
                                                                     tf.exp(log_sigma),
                                                                     validate_args=True,
                                                                     allow_nan_stats=False,
                                                                     name="encoder_normal")
    kl_div = tf.contrib.distributions.kl_divergence(normal,
                                                    enc_normal,
                                                    allow_nan_stats=False,
                                                    name="kl_divergence")
return kl_div
Run Code Online (Sandbox Code Playgroud)

输入是长度为 N 的无约束向量

log_sigma.get_shape() == mean.get_shape()
Run Code Online (Sandbox Code Playgroud)

现在,在训练过程中,经过几千次迭代后,我观察到负的 KL 散度,达到 -10 的值。您可以在下方看到 Tensorboard 训练曲线:

KL散度曲线

KL散度曲线的放大

现在这对我来说似乎很奇怪,因为在某些条件下 KL 散度应该是正的。我知道我们需要“KL 散度仅在 P 和 Q 总和为 1 并且对于任何 i 使得 P(i) > 0 时 Q(i) > 0 才被定义。” (参见https://mathoverflow.net/questions/43849/how-to-ensure-the-non-negativity-of-kullback-leibler-divergence-kld-metric-rela)但我不明白这是怎么回事在我的情况下违反了。任何帮助表示高度赞赏!

python statistics distribution machine-learning tensorflow

5
推荐指数
1
解决办法
1884
查看次数