Tensorflow,负KL分歧

时间:2018-03-02 11:06:13

标签: python tensorflow machine-learning statistics distribution

我正在使用变分自动编码器类型模型,我的损失函数的一部分是正态分布与均值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训练曲线:

KL divergence curve

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)但我不知道在我的情况下如何违反这一点。任何帮助都非常感谢!

1 个答案:

答案 0 :(得分:0)

遇到同样的问题。 这是因为使用了浮点精度。 如果您注意到负值出现在接近于0的范围内,并且将其限制为一个小的负值。为损失增加一个小的正值是可以解决的。