在Keras中实现KL散度的含义是什么?

7

我对KL散度的具体应用有些困惑,尤其是在Keras中,但我认为这个问题是适用于深度学习应用的。在Keras中,KL损失函数的定义如下:

def kullback_leibler_divergence(y_true, y_pred):
    y_true = K.clip(y_true, K.epsilon(), 1)
    y_pred = K.clip(y_pred, K.epsilon(), 1)
    return K.sum(y_true * K.log(y_true / y_pred), axis=-1)

在我的模型中,y_truey_pred是矩阵;每一行的y_true是一个训练样本的one-hot编码,而每一行的y_pred是该样本的模型输出(概率分布)。
我可以在y_truey_pred的任何一对行上运行KL散度计算,并得到期望的结果。这些KL散度结果的平均值与Keras在训练历史中报告的损失相匹配。但是,这种聚合-对每一行运行KL散度并取平均值-没有发生在损失函数内。相反,我了解到MAE或MSE会在示例之间进行聚合:
def mean_squared_error(y_true, y_pred):
    return K.mean(K.square(y_pred - y_true), axis=-1)

对于KL散度,我不完全清楚在示例中取平均值是否正确。我猜想,这个想法是示例是来自真实分布的随机样本,因此它们应该按其概率比例出现。但这似乎对训练数据收集方式做了一个相当强的假设。在在线KL散度处理中,我还没有看到这个方面(从数据集中聚合样本)得到处理; 我只看到了基本公式的重新定义。
所以我的问题是:
1.Keras用KL散度损失来进行平均(即对行的KL散度求平均)的这种解释是否正确?
2.为什么这是正确的?
3.从实现角度来看,为什么Keras中损失函数的定义没有像MAE或MSE那样对行进行聚合?
1个回答

2
Kullback-Leibler散度是衡量两个概率分布相似性的指标。在Keras中实现的KL散度假设有两个离散概率分布(因此需要求和)。
您的KL损失函数的确切格式取决于底层概率分布。常见的用例是神经网络模拟概率分布P(例如高斯分布)的参数,然后使用KL散度在损失函数中确定模拟分布与其他已知分布(可能也是高斯分布)之间的相似性。例如,一个网络输出两个向量mu和sigma^2。Mu形成了高斯分布P的均值,而sigma^2是协方差矩阵Sigma的对角线。然后,可能的损失函数是介于由mu和Sigma描述的高斯P和单位高斯N(0,I)之间的KL散度。在这种情况下,KL散度的确切格式可以通过解析推导得出,从而得到一个“自定义”的Keras损失函数,它与Keras中实现的KL散度完全不同。
在介绍变分自编码器的原始论文中,损失函数是对小批量样本求和,然后乘以因子(N/M),其中N是整个数据集的大小,M是小批量的大小。请参见https://arxiv.org/abs/1312.6114中的第8和第10个方程式。

"以及单位高斯。我认为你应该解释一下为什么是单位高斯。" - nbro
这取决于您的数据和图形模型,有许多原因可以使建模的概率分布类似于单位高斯分布。 - datwelk
如果有多种原因,那么你可以轻松地提供一个原因/例子! - nbro

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