我正在使用变分自编码器(Variational Autoencoder)类型的模型进行工作,我的损失函数的一部分是 KL 散度,它衡量了一个均值为0、方差为1的正态分布与另一个正态分布之间的差异程度。后者的均值和方差由我的模型预测。
我按如下方式定义了损失:
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散度曲线 KL散度曲线放大图 现在这对我来说似乎很奇怪,因为在某些条件下KL散度应该是正的。 我知道我们需要“仅当P和Q都总和为1并且如果存在P(i)> 0,则Q(i)> 0时才定义K-L散度。”(参见https://mathoverflow.net/questions/43849/how-to-ensure-the-non-negativity-of-kullback-leibler-divergence-kld-metric-rela),但我不知道在我的情况下如何违反它。非常感谢您的任何帮助!