我对KLD的应用方式感到有些困惑 - 特别是在Keras,但我认为这个问题对于深度学习应用程序来说是一般性的。在keras中,损失函数定义如下:
s
在我的模型中,y_true和y_pred是矩阵; y_true的每一行是针对一个训练示例的单一编码,并且y_pred的每一行是该示例的模型的输出(概率分布)。
我可以在y_true和y_pred的任何给定行对上运行此KLD计算,并获得预期结果。行中这些KLD结果的平均值与训练历史记录中keras报告的损失相匹配。但是这种聚合 - 在每一行上运行kld并采用均值 - 并不会在损失函数内发生。相反,我理解MAE或MSE可以汇总各个例子:
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)
对于KLD来说,对我来说并不完全明白,在示例中采用均值是正确的。我猜想这个例子是来自真实分布的随机样本,所以它们应该与它们的概率成比例。但这似乎对如何收集培训数据做出了非常强烈的假设。我还没有真正看到在KLD在线治疗中解决的这方面(汇总来自数据集的样本);我只是看到了很多基本公式的重新定义。
所以我的问题是:
谢谢!
答案 0 :(得分:1)
Kullback-Leibler散度是两种概率分布之间相似性的度量。在Keras中实现的KL分歧假定两个离散的概率分布(因此总和)。
KL损失函数的确切格式取决于潜在的概率分布。常见的用例是神经网络对概率分布P(例如高斯分布)的参数进行建模,然后在损失函数中使用KL散度来确定建模分布与其他一些已知分布之间的相似性(可能是高斯分布)以及)。例如。网络输出两个向量mu和sigma ^ 2。 Mu形成高斯分布P的均值,而sigma ^ 2是协方差矩阵Sigma的对角线。然后,可能的损失函数是由μ和Sigma描述的高斯P与单位高斯N(0,I)之间的KL偏差。在这种情况下,KL分歧的确切格式可以通过分析得出,产生自定义 keras损失函数,该函数完全不等于在Keras中实现的KL分歧。
在引入变分自动编码器的原始论文中,损失函数在小批量中的样本上求和,然后乘以因子(N / M),其中N是整个数据集的大小,M是小批量的大小。参见https://arxiv.org/abs/1312.6114中的等式8和10。