为什么许多实现中变分自编码器的损失函数与论文中的符号相反?

我认为我理解了《自编码变分贝叶斯》的论文。我正在阅读一些实现该论文的TensorFlow代码。但是,我不理解这些代码中的损失函数。因为很多代码都是以相同的方式编写的,可能是我理解错了。

问题是这样的。下面的方程来自AEVB论文enter image description here损失函数如这个方程所示。这个方程可以分为两部分:正则化项和重构项。因此,它变为

Loss_function = Regularization_term + Reconstruction_term

然而,很多代码以负号实现这个正则化项,如下所示

Loss_function = -Regularization_term + Reconstruction_term 

例如,在这个代码中,第79行显示正则化项为

KLD = -.5 * tf.reduce_sum(1. + enc_logsd - tf.pow(enc_mu, 2) - tf.exp(enc_logsd), reduction_indices=1)

然后,它只是加到重构项上。

loss = tf.reduce_mean(KLD + BCE)

我不明白。KLD的符号与论文中的方程相反。有很多这样的代码。我认为我错了,但我不知道哪里错了。你能解释为什么应该是这样吗?

参考代码:code1code2code3


回答:

方程(10)是我们希望最大化的对数似然损失。它等同于最小化负对数似然(NLL)。这是优化函数在实践中所做的。请注意,Reconstruction_termtf.nn.sigmoid_cross_entropy_with_logits中已经被取负(见https://github.com/tegg89/VAE-Tensorflow/blob/master/model.py#L96)。我们也需要对Regularization_term取负。

因此,代码实现了Loss_function = -Regularization_term + -Reconstruction_term

Related Posts

Keras Dense层输入未被展平

这是我的测试代码: from keras import…

无法将分类变量输入随机森林

我有10个分类变量和3个数值变量。我在分割后直接将它们…

如何在Keras中对每个输出应用Sigmoid函数?

这是我代码的一部分。 model = Sequenti…

如何选择类概率的最佳阈值?

我的神经网络输出是一个用于多标签分类的预测类概率表: …

在Keras中使用深度学习得到不同的结果

我按照一个教程使用Keras中的深度神经网络进行文本分…

‘MatMul’操作的输入’b’类型为float32,与参数’a’的类型float64不匹配

我写了一个简单的TensorFlow代码,但不断遇到T…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注