变分自动编码器损失函数(keras)

Posted

技术标签:

【中文标题】变分自动编码器损失函数(keras)【英文标题】:Variational Auto-Encoder Loss function (keras) 【发布时间】:2018-03-04 02:07:13 【问题描述】:

我正在使用 Keras 构建一个变分自动编码器。我很大程度上受到@Fchollet 示例的启发:https://github.com/fchollet/keras/blob/master/examples/variational_autoencoder.py

但我正在处理连续数据。我的输出是一个持续时间,而不是像在 MNIST 中那样对数字进行排名。在这方面,我将损失函数从 binary_crossentropy 更改为 mean_squared_error。我主要想知道第二个术语,KL 散度。它应该适用于连续数据吗?我无法绕过它。对我来说,它应该将相似的数据紧密地放在潜在空间中。例如,在 MNIST 数据的 CAS 中,将每个“1”放在潜在空间中,将每个“2”放在一起等等......因为我正在处理连续数据,它是如何工作的?在我的情况下是否有更好的丢失功能?

这是丢失的功能:

def vae_loss(x, x_decoded_mean):
    xent_loss = original_dim *metrics.mean_squared_error(x, x_decoded_mean)
    kl_loss = - 0.5 * K.mean(1 + z_log_sigma - K.square(z_mean) - K.exp(z_log_sigma), axis=-1)
    return K.mean(xent_loss + kl_loss)
vae.compile(optimizer='Adam', loss=vae_loss)

这是 3D 潜在空间中的表示。

如您所见,一些类似的数据按需要放在一起。当我将 kl_loss 函数的系数增加到 "-100000" 而不是 "-0.5" 时,会发生以下情况:

我以为我会以几乎线性的方式从蓝色变为红色。相反,我以混乱的方式获得了所有数据的集群。

你们能帮帮我吗?谢谢!

【问题讨论】:

【参考方案1】:

在我看来,这是因为您通过增加系数来增加 KL 损失的重要性。换句话说,损失函数对 KL 项的“照顾”要多得多。请记住,KL 损失用于“获取”具有先验 N(0,1) 的后验分布。所以,如果你“扩展”这个行为很多(系数很大),每个数据的分布都会收敛到这个分布==>所有数据的后验均值为0,数据一起推向0==>你的潜在表示:)

【讨论】:

以上是关于变分自动编码器损失函数(keras)的主要内容,如果未能解决你的问题,请参考以下文章

变分自动编码器:Keras 中的实现预热

在 TF2/Keras 中正确实现 Autoencoder MSE 损失函数

使用预训练 vgg19 tensorflow,Keras 在 CNN 自动编码器中定义自定义损失(感知损失)

变分自动编码器:MSE 与 BCE

keras中的加权mse自定义损失函数 - 自定义权重

忽略 keras 中 R 的缺失目标值的损失函数