- 在 Blundell (2015) 的论文中,系数设置为 1/M(其中 M 是小批量的数量)。在 TFP 给出的示例中,系数为 1/mnist_data.train.num_examples。为什么?
在 BBB 论文中。在图 8 中,它们指的是 M 是 mini-batch 的数量。为了与非随机梯度学习保持一致,它应该按Graves所做的 mini-batch 的数量进行缩放。另一种选择是在 eq 中完成的。9,他们将其缩放\pi_i
,其中集合中所有值的{\pi}
总和为 1。
在 TFP 示例中,看起来确实num_examples
是训练集中独立样本的总数,远大于批次数。这有几个名字,例如Safe Bayes或Tempering。看看秒。关于在贝叶斯推理中使用回火及其适用性的更多讨论。
当我从 2d 输入到 3d 图像体积时,即使除以 mnist_data.train.num_examples 之后,KL 损失 (~1k) 仍然比交叉熵 (~1) 大得多。为什么?
ELBO 将永远大于您的交叉熵(它定义了您的可能性)。看看如何找到 ELBO 中的 KL 散度项。(以及假设每个权重/参数是独立的全平均场方法)。
由于假设的后验被分解(假设每个参数是独立的),可以将联合分布写成乘积。这意味着当您在计算大约之间的 KL 时记录日志。后验和先验,您可以将其写为每个参数之间的 KL 项的总和。由于 KL >= 0,对于您添加到模型中的每个参数,您将为您的 ELBO 添加另一个正项。这可能就是您的 3D 模型损失如此之多的原因,可能是因为参数更多。
发生这种情况的另一个原因是如果您的数据较少(您的 M 较小,比 KL 项的权重较小)。
获得该系数的适当值的指导方针是什么?也许像两个损失项应该是相同的数量级?
我不确定任何具体的指导方针,因为您主要对梯度感兴趣。大的损失并不意味着大的梯度。查看 ELBO 中负对数似然和 KL 项贡献的梯度。如果 KL 项太大,您可能需要更多信息或更多数据(您可以简单地缩放 KL 项,但这对我的贝叶斯来说感觉有点恶心)。
当前系数只考虑训练样本的数量,而不是网络复杂度或网络中的参数数量,我假设 KL 损失随着模型的复杂度而增加。
是的,如前所述,一般来说,更多参数 == 更大 ELBO(对于 Backprop 在贝叶斯中使用的平均场方法)。
我正在尝试使用 KL 损失实现神经网络,而不使用 keras.model.losses,因为某些软件生产和硬件支持限制。我正在尝试使用 TF 1.10 和 TFP 0.3.0 训练我的模型,问题是对于 tf<=1.14,tf.keras.model 不支持 Keras 模型中的 tf.layers,所以我不能使用我的原始模型直接。有没有办法获得 KL 损失,不是来自 model.losses,而是来自 TF 构造中网络的层或权重?
我不确定解决这部分问题的最佳方法。对于没有明确支持的旧版本,我会持谨慎态度。他们将这些警告/异常放入其中是有原因的。
批归一化或组归一化在贝叶斯深度学习中仍然有用吗?
对于变分推理(正如 Backprop 在 Bayes 中所做的那样),Batchnorm 很好。对于 MCMC 等采样方法,Batch normalization 不再适用。看看https://arxiv.org/pdf/1908.03491v1.pdf以了解有关批量规范的适用性信息,采样方法约为 贝叶斯推理。