小编mec*_*ner的帖子

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

我对如何应用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那样对行进行汇总?

machine-learning deep-learning keras tensorflow

5
推荐指数
1
解决办法
3929
查看次数