Tensorflow,负 KL 散度

Pro*_*ook 5 python statistics distribution machine-learning tensorflow

我正在使用变分自动编码器类型模型,我的损失函数的一部分是均值为 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)但我不明白这是怎么回事在我的情况下违反了。任何帮助表示高度赞赏!

小智 1

面临同样的问题。这是因为使用了浮点精度。如果您注意到负值出现在接近 0 的位置并且限制为一个小的负值。为损失添加一个小的正值是一种解决方法。

  • 你好!请更详细地回答并提供解决方案,或者您可以将此答案移至评论部分。 (2认同)