gpt4 book ai didi

python - Tensorflow,负 KL 散度

转载 作者:行者123 更新时间:2023-12-04 11:42:15 32 4
gpt4 key购买 nike

我正在使用变分自动编码器类型模型,我的损失函数的一部分是均值为 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

输入是长度为 N 的无约束向量
log_sigma.get_shape() == mean.get_shape()

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

KL divergence curve

Zoom in of KL divergence curve

现在这对我来说似乎很奇怪,因为在某些条件下 KL 散度应该是正的。我知道我们需要“K-L 散度仅在 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 )但我不知道在我的情况下如何违反这一点。任何帮助表示高度赞赏!

最佳答案

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

关于python - Tensorflow,负 KL 散度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49067869/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com