如何在TensorFlow中实现Kullback-Leibler损失?

6
我需要在tensorflow中最小化KL损失
我尝试了这个函数tf.contrib.distributions.kl(dist_a, dist_b, allow_nan=False, name=None),但失败了。
我尝试手动实现它:
def kl_divergence(p,q):
    return p* tf.log(p/q)+(1-p)*tf.log((1-p)/(1-q))

这是正确的吗?


1
可能是KL 散度在 TensorFlow 中的重复问题 - Transcendental
1个回答

10

您手头的是交叉熵,KL散度应该是这样的:

def kl_divergence(p, q): 
    return tf.reduce_sum(p * tf.log(p/q))

假设p和q都是形状相同的浮点1-D张量,并且它们的值之和都为1。

如果p和q是遵守上述约束条件的相同大小的1-D张量小批量,则它也应该有效。


非常感谢,如果p和q是多维的呢? - Alberto Merciai
你的意思是p和q是要优化的分布的小批量吗?我认为我现在的方法对于这种情况也应该是可以的。如果不是这种情况,那么我需要更多的上下文信息。 - Daniel Slater
当我尝试计算0/0时,我得到了NaN。 - Alberto Merciai
我在每个p和q中添加一个常量= 0.00001以避免出现nan,这样做正确吗? - Alberto Merciai
@srabb 这是一个选项,你也可以使用 tf.max,这样它就不会修改其他结果,不过我想知道是否有更好的方法。 - Daniel Slater
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接