我正在使用变分自动编码器类型模型,我的损失函数的一部分是正态分布与均值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()
现在在训练期间,我观察到在几千次迭代后达到-10的负KL分歧。您可以在下面看到Tensorboard训练曲线:
Zoom in of KL divergence curve
现在这对我来说似乎很奇怪,因为在某些条件下KL的分歧应该是正面的。据我所知,我们要求“只有当P和Q都加1时,才定义K-L散度,如果任何i,Q(i)> 0,P(i)> 0。” (见https://mathoverflow.net/questions/43849/how-to-ensure-the-non-negativity-of-kullback-leibler-divergence-kld-metric-rela)但我不知道在我的情况下如何违反这一点。任何帮助都非常感谢!
答案 0 :(得分:0)
遇到同样的问题。 这是因为使用了浮点精度。 如果您注意到负值出现在接近于0的范围内,并且将其限制为一个小的负值。为损失增加一个小的正值是可以解决的。