我对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_true
和y_pred
是矩阵;每一行的y_true
是一个训练样本的one-hot编码,而每一行的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散度处理中,我还没有看到这个方面(从数据集中聚合样本)得到处理; 我只看到了基本公式的重新定义。
所以我的问题是:
1.Keras用KL散度损失来进行平均(即对行的KL散度求平均)的这种解释是否正确?
2.为什么这是正确的?
3.从实现角度来看,为什么Keras中损失函数的定义没有像MAE或MSE那样对行进行聚合?