我对如何应用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_true,y_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散度的在线处理中,我还没有真正看到过这一方面(从数据集中的样本中汇总)。我只是看到了许多基本公式的重新定义。
所以我的问题是:
对Keras为得出KL散度损失(即对各行的KL散度求平均)所做的解释是否正确?
为什么这样做是正确的?
从实现的角度来看,为什么Keras中的损失函数的定义不像MAE或MSE那样对行进行汇总?