为什么在许多实现中变分自动编码器的损失与纸上的符号相反?

Min*_*hoi 3 python machine-learning autoencoder deep-learning tensorflow

我想我理解了自动编码变分贝叶斯论文。我正在阅读一些实现本文的张量流代码。但我不明白这些代码中的损失函数。由于很多代码都是以相同的方式编写的,因此我可能是错的。

问题是这样的。以下方程来自AEVB 论文在此输入图像描述 损失函数就像这个方程。该方程可以分为两个:正则化项和重构项。因此,就变成了

Loss_function = Regularization_term + Reconstruction_term
Run Code Online (Sandbox Code Playgroud)

然而,许多代码以负号实现此正则化项,例如

Loss_function = -Regularization_term + Reconstruction_term 
Run Code Online (Sandbox Code Playgroud)

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

KLD = -.5 * tf.reduce_sum(1. + enc_logsd - tf.pow(enc_mu, 2) - tf.exp(enc_logsd), reduction_indices=1)
Run Code Online (Sandbox Code Playgroud)

然后,它只是添加到重建术语。

loss = tf.reduce_mean(KLD + BCE)
Run Code Online (Sandbox Code Playgroud)

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

参考代码:代码1代码2代码3

小智 7

方程(10)是我们想要最大化的对数似然损失。它相当于最小化负对数似然(NLL)。这就是优化函数在实践中所做的事情。请注意,Reconstruction_term已被否定tf.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.