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 散度仅在 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 的位置并且限制为一个小的负值。为损失添加一个小的正值是一种解决方法。
归档时间: |
|
查看次数: |
1884 次 |
最近记录: |