在Keras中实施KL分歧的含义是什么?

mec*_*ner 5 machine-learning deep-learning keras tensorflow

我对如何应用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)
Run Code Online (Sandbox Code Playgroud)

在我的模型,y_true并且y_pred是矩阵; 的每行y_true一个训练示例的一个热编码,并且每行y_pred的模型的输出(一个概率分布),选择那些例子。

我可以在任意一对给定的行上运行KL散度计算y_truey_pred并获得预期的结果。这些KL散度结果在各行中的平均值与Keras在训练历史中报告的损失相匹配。但是这种损失(在每一行上运行KL散度并取平均值)不会在损失函数内发生。相比之下,我理解MAE或MSE汇总了以下示例:

def mean_squared_error(y_true, y_pred):
    return K.mean(K.square(y_pred - y_true), axis=-1)
Run Code Online (Sandbox Code Playgroud)

对于KL差异,对我来说并不完全清楚,在示例中取平均值是正确的做法。我想这个想法是,这些示例是来自真实分布的随机样本,因此它们应该与它们的概率成比例出现。但这似乎对如何收集训练数据做出了很强的假设。在KL散度的在线处理中,我还没有真正看到过这一方面(从数据集中的样本中汇总)。我只是看到了许多基本公式的重新定义。

所以我的问题是:

  1. 对Keras为得出KL散度损失(即对各行的KL散度求平均)所做的解释是否正确?

  2. 为什么这样做是正确的?

  3. 从实现的角度来看,为什么Keras中的损失函数的定义不像MAE或MSE那样对行进行汇总?

小智 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 。