关于具有TensorFlow概率的ELBO损失中的KL项的多个问题



我一直在尝试使用张量流概率(TFP)进行一些实验,但我遇到了一些问题。

  1. KL损失系数的适当值是多少?

    1. 在Blundell(2015)的论文中,系数设置为1/M(其中M是小批量的数量)。在TFP给出的例子中,系数被给出为1/mnist_data.train.num_examples。为什么?

    2. 当我从2d输入到3d图像体积时,即使除以mnist_data.train.num_examples,KL损失仍然显著大于交叉熵(~1)。为什么?

    3. 为这个系数取一个合适值的准则是什么?也许这两个损失项应该是相同的数量级?

    4. 当前系数只考虑训练样本的数量,而不考虑网络复杂性或网络中参数的数量,我假设KL损失随着模型的复杂性而增加。

  2. 我试图在不使用keras.model.losses的情况下实现一个具有KL损失的神经网络,这是由于软件生产和硬件支持的限制。我正试图用TF 1.10和TFP 0.3.0训练我的模型,问题是对于tf<=1.14tf.keras.model在Keras模型中不支持tf.layers,所以我不能立即使用我的原始模型。有没有一种方法可以获得KL损失,不是来自model.losses,而是来自TF结构中网络的层或权重?

  3. 批规范化或组规范化在贝叶斯深度学习中仍然有用吗?

  1. 在Blundell(2015)的论文中,系数设置为1/M(其中M是小批量的数量)。在TFP给出的例子中,系数为1/mnist_data.train.num_examples。为什么

在BBB论文方程8中,它们指的是M是小批量的数量。为了与非随机梯度学习保持一致,它应该按照Graves所做的小批量数量进行缩放。另一个替代方案是在等式9中完成的,其中他们将其缩放为pi_i,其中集合{pi}中所有值的总和为1。

在TFP示例中,看起来num_examples是训练集中独立样本的总数,远远大于批次数。这有几个名字,比如安全贝叶斯或回火。看看本文的第8节,了解更多关于贝叶斯推理中回火的使用及其适用性的讨论。

当我从2d输入到3d图像体积时,即使除以mnist_data.train.num_examples,KL损失仍然显著大于交叉熵(~1k)。为什么?

ELBO将始终大于您的交叉熵(定义您的可能性)。看看ELBO中的KL发散项是如何找到的。(以及全平均场方法,其中假设每个权重/参数是独立的)。

由于假设的后验是因子分解的(假设每个参数是独立的),可以将联合分布写成乘积。这意味着,当你在计算近似后验和先验之间的KL时,你可以把它写为每个参数之间KL项的总和。由于KL>=0,对于您添加到模型中的每个参数,您将向ELBO添加另一个正项。这可能就是为什么你的3D模型损失如此之大,可能是因为有更多的参数。

发生这种情况的另一个原因是,如果你的数据较少(你的M较小,而KL项的权重较小)。

获得该系数的正确值的指导原则是什么?也许这两个损失项应该是相同的数量级?

我不确定任何具体的训练指导方针,你主要对梯度感兴趣。损失大并不意味着梯度大。看看ELBO中负对数似然和KL项所产生的梯度。如果KL术语太大,你可能需要一个更具信息性的先验或更多的数据(你可以简单地缩放KL术语,但这对我的贝叶斯来说有点恶心)。

当前系数只考虑训练样本的数量,而不考虑网络复杂性或网络中参数的数量,我假设KL损失随着模型的复杂性而增加。

是的,如上所述,通常情况下,更多的参数==更大的ELBO(对于Backdrop在Bayes中使用的平均场方法)。

我正在尝试实现一个具有KL损失的神经网络,而不使用keras.model.loss,因为一些软件生产和硬件支持限制。我试图用TF1.10和TFP 0.3.0训练我的模型,问题是对于TF<1.14,tf.keras.model不支持keras模型中的tf.layers,所以我不能直接使用我的原始模型。有没有一种方法可以获得KL损失,不是来自模型损失,而是来自TF结构中网络的层或权重?

我不确定解决这部分问题的最佳方法。我会谨慎对待没有明确支持它的旧版本。他们提出这些警告/例外是有原因的。

批规范化或组规范化在贝叶斯深度学习中仍然有用吗?

对于变分推理(如Backdrop在Bayes中所做的),Batchnorm是好的。对于MCMC等采样方法,批量归一化不再适用。看看https://arxiv.org/pdf/1908.03491v1.pdf有关近似贝叶斯推断的抽样方法的批量范数适用性的信息。

最新更新