VAE的重建损失函数

发布于 2025-02-11 18:52:30 字数 2140 浏览 3 评论 0 原文

我正在从TensorFlow文档给出的一个示例中学习,

vaes训练通过最大化证据下限(ELBO) 边缘模可能性。

实际上,优化了单个样本蒙特卡洛估计值 期望:logp(x | z) + logp(z) - logq(z | x)。

损失函数的实现为:

def log_normal_pdf(sample, mean, logvar, raxis=1):
  log2pi = tf.math.log(2. * np.pi)
  return tf.reduce_sum(
      -.5 * ((sample - mean) ** 2. * tf.exp(-logvar) + logvar + log2pi),
      axis=raxis)


def compute_loss(model, x):
  mean, logvar = model.encode(x)
  z = model.reparameterize(mean, logvar)
  x_logit = model.decode(z)
  cross_ent = tf.nn.sigmoid_cross_entropy_with_logits(logits=x_logit, labels=x)
  logpx_z = -tf.reduce_sum(cross_ent, axis=[1, 2, 3])
  logpz = log_normal_pdf(z, 0., 0.)
  logqz_x = log_normal_pdf(z, mean, logvar)
  return -tf.reduce_mean(logpx_z + logpz - logqz_x)

由于此示例使用了算机数据集,因此 x 可以标准化为[0,1], sigmoid_cross_entropy_with_logits 在此处使用。

我的问题是:

  1. 如果 x> 1 ,可以使用什么样的损失?
  2. 我们可以将其他损失函数用作VAE的重建损失,例如Huber损失( https:// en。 wikipedia.org/wiki/huber_loss )?
  3. 使用MSE损失的另一个示例(如下),MSE损失是否有效 Elbo 对p(x | z)的损失?

https:> putting_it_all_together_an_end-to-end_example

    # Iterate over the batches of the dataset.
    for step, x_batch_train in enumerate(train_dataset):
        with tf.GradientTape() as tape:
            reconstructed = vae(x_batch_train)
            # Compute reconstruction loss
            loss = mse_loss_fn(x_batch_train, reconstructed)
            loss += sum(vae.losses)  # Add KLD regularization loss

I am learning from an example given by TensorFlow document, https://www.tensorflow.org/tutorials/generative/cvae#define_the_loss_function_and_the_optimizer:

VAEs train by maximizing the evidence lower bound (ELBO) on the
marginal log-likelihood.

In practice, optimize the single sample Monte Carlo estimate of this
expectation: logp(x|z) + logp(z) - logq(z|x).

The loss function was implemented as:

def log_normal_pdf(sample, mean, logvar, raxis=1):
  log2pi = tf.math.log(2. * np.pi)
  return tf.reduce_sum(
      -.5 * ((sample - mean) ** 2. * tf.exp(-logvar) + logvar + log2pi),
      axis=raxis)


def compute_loss(model, x):
  mean, logvar = model.encode(x)
  z = model.reparameterize(mean, logvar)
  x_logit = model.decode(z)
  cross_ent = tf.nn.sigmoid_cross_entropy_with_logits(logits=x_logit, labels=x)
  logpx_z = -tf.reduce_sum(cross_ent, axis=[1, 2, 3])
  logpz = log_normal_pdf(z, 0., 0.)
  logqz_x = log_normal_pdf(z, mean, logvar)
  return -tf.reduce_mean(logpx_z + logpz - logqz_x)

Since this example used MINIST dataset, x can be normalized to [0, 1] and sigmoid_cross_entropy_with_logits was used here.

My questions are:

  1. What if x > 1, what kind of loss could be used?
  2. Can we use other loss functions as a reconstruction loss in VAE, such as Huber loss (https://en.wikipedia.org/wiki/Huber_loss)?
  3. Another example used MSE loss (as follow), is MSE loss a valid ELBO loss to measure p(x|z)?

https://www.tensorflow.org/guide/keras/custom_layers_and_models#putting_it_all_together_an_end-to-end_example

    # Iterate over the batches of the dataset.
    for step, x_batch_train in enumerate(train_dataset):
        with tf.GradientTape() as tape:
            reconstructed = vae(x_batch_train)
            # Compute reconstruction loss
            loss = mse_loss_fn(x_batch_train, reconstructed)
            loss += sum(vae.losses)  # Add KLD regularization loss

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

如果没结果 2025-02-18 18:52:30

在变量自动编码器的损耗函数中,您可以共同优化两个术语:

  1. 预测和标签之间的重建损失,例如在正常自动编码器中,
  2. 参数化概率分布与假定的真实概率分布之间的距离。实际上,通常认为真实分布是高斯,并且距离是根据

重建损失部分的kullback-leibler差异来衡量的,您可以选择适合您数据的任何损耗函数,包括MSE和Huber。不过,通常将输入功能归一化仍然是一个好主意。

In the loss function of a variational autoencoder, you jointly optimize two terms:

  1. The reconstruction loss between prediction and label, like in a normal autoencoder
  2. The distance between the parametrized probability distribution and the assumed true probability distribution. In practice, the true distribution is usually assumed to be Gaussian and distance is measured in terms of Kullback-Leibler divergence

For the reconstruction loss part, you can pick any loss function that fits your data, including MSE and Huber. It is generally still a good idea to normalize your input features though.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文