我对如何应用KL散度(尤其是在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_true
和y_pred
是矩阵。 y_true
的每一行针对一个训练示例进行一次热编码,而y_pred
的每一行针对该示例进行模型的输出(概率分布)。我可以在
y_true
和y_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散度的在线处理中,我还没有真正看到过这一方面(从数据集中的样本中汇总)。我只是看到许多基本公式的重新定义。
所以我的问题是:
最佳答案
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。
关于tensorflow - 在Keras中实现KL分歧的含义是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44376691/