在我见过的VAE的几乎所有代码示例中,损失函数的定义如下(这是张量流代码,但是我看到theano,torch等类似。它也适用于卷积网络,但这也不太相关) ,仅影响轴的总和):
# latent space loss. KL divergence between latent space distribution and unit gaussian, for each batch.
# first half of eq 10. in https://arxiv.org/abs/1312.6114
kl_loss = -0.5 * tf.reduce_sum(1 + log_sigma_sq - tf.square(mu) - tf.exp(log_sigma_sq), axis=1)
# reconstruction error, using pixel-wise L2 loss, for each batch
rec_loss = tf.reduce_sum(tf.squared_difference(y, x), axis=[1,2,3])
# or binary cross entropy (assuming 0...1 values)
y = tf.clip_by_value(y, 1e-8, 1-1e-8) # prevent nan on log(0)
rec_loss = -tf.reduce_sum(x * tf.log(y) + (1-x) * tf.log(1-y), axis=[1,2,3])
# sum the two and average over batches
loss = tf.reduce_mean(kl_loss + rec_loss)
但是,kl_loss和rec_loss的数值范围分别非常取决于潜在空间的暗淡和输入特征的大小(例如,像素分辨率)。用reduce_mean替换reduce_sum以获得每个z-dim KLD和每个像素(或特征)LSE或BCE是否明智?更重要的是,在对最终损失进行求和时,我们如何权衡潜在损失和重建损失?只是反复试验吗?还是有一些理论(或至少是经验法则)?我在任何地方都找不到任何相关信息(包括原始论文)。
我遇到的问题是,如果我的输入特征(x)尺寸和潜在空间(z)尺寸之间的平衡不是“最佳”,那么我的重构都非常好,但是学习到的潜在空间是非结构化的(如果x尺寸)很大,重构误差在KLD上占主导地位,反之亦然(重构不好,但如果KLD占优势,则学习的潜伏空间结构良好)。
我发现自己必须归一化重构损失(除以输入特征尺寸)和KLD(除以z尺寸),然后用任意权重因子手动加权KLD项(归一化是为了使我可以使用相同或相似的重量,与x或z的尺寸无关)。根据经验,我发现大约0.1可以在重构和结构化的潜在空间之间找到良好的平衡,这对我来说就像一个“最佳位置”。我正在寻找这方面的先前工作。
根据要求,使用上述数学符号(着眼于因重建错误而导致的L2损失)
其中是潜矢量的维数(以及相应的均值和方差),是输入特征的维数,是最小批处理大小,上标表示第个数据点和是第个小批量的损失。