确切地说,每维的位数(位/暗)是多少(在像素 CNN 论文中)?

机器算法验证 可能性
2022-01-28 23:52:31

如果是因为我没有努力搜索,我提前道歉,但我找不到每维位数(bits/dim)的明确定义。

我发现第一次提到它的定义来自“像素递归神经网络”。但是对我来说仍然很不清楚,所以让我问一下。

的 256-softmax 输出定义\boldsymbol{y} \in \mathbb{R}^{32 \times 32 \times 256},负对数似然,据我所知,是 - \mathbb{E}_{\boldsymbol{x}} \ln p(\boldsymbol{y}|\boldsymbol{x})。 (请注意,我们在这里假设图像是单通道的,其大小为32 \times 32 \times 1。)xyR32×32×256

Exlnp(y|x).
32×32×1

根据上述论文(可能还有其他材料),在我看来,位/暗的定义是

bit/dim=Exlog2p(y|x)32321
因为它说“总离散对数似然由图像的维数归一化”。

问题。

1)上述定义正确吗?

2)或者我应该\sum_{\boldsymbol{x}}替换Ex {x}} ?x

2个回答

此处在第 12 页进行了详细说明。

并且在这里 进行了讨论,尽管没有那么详细。

计算以 e 为底的负对数似然,应用底数的变化将对数以 e 为底数转换为以 2 为底的对数,然后除以像素数(例如 32x32 rgb 图像的 3072 像素)。

要更改日志的基数,只需将日志基 e 值除以log(2) -- 例如在 python 中,它就像:(nll_val / num_pixels) / numpy.log(2)

正如 DWF 所指出的,连续对数似然不能与离散对数似然直接比较。NICE 的比特/像素的 PixelRNN 论文中的值是在正确考虑相关数据集中像素值的离散性质后计算的。对于 NICE 论文中的数字,您必须log(128)从每个像素的对数似然中减去(这是为了考虑数据缩放)。

IE-((5371.78 / 3072.) - 4.852) / np.log(2.) = 4.477

为了补充上面的答案,对数似然是您的重建损失。在 256 路 softmax 的情况下,它是分类交叉熵。

如果您使用的是张量流,例如:tf.nn.sparse_softmax_cross_entropy_with_logits对数似然是自然对数,因此您需要除以np.log(2.)

如果您的重建损失报告为平均值,例如tf.reduce_mean您不需要除以图像尺寸和/或批量大小。另一方面,如果是,tf.reduce_sum您将需要除以图像的批量大小和尺寸。

如果您的模型为重建输出连续值(例如 L2 损失),则您正在直接建模高斯分布。为此,您需要进行一些转换,我不是 100% 确定有效,但在Masked Autoregressive Flow for Density Estimation中报告