dans presque tous les exemples de code que j'ai vus sur un VAE, les fonctions de perte sont définies comme suit (c'est du code tensorflow, mais j'ai vu des choses similaires pour theo, torch etc. C'est aussi pour un convnet, mais ce n'est pas trop pertinent non plus , affecte uniquement les axes sur lesquels les sommes sont reprises):
# 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)
Cependant, la plage numérique de kl_loss et rec_loss est très dépendante des gradations latentes de l'espace et de la taille de la caractéristique d'entrée (par exemple la résolution en pixels) respectivement. Serait-il judicieux de remplacer la réduction de la somme par la réduction de la moyenne pour obtenir par z-dim KLD et par pixel (ou fonctionnalité) LSE ou BCE? Plus important encore, comment pondérer la perte latente avec la perte de reconstruction lors de la sommation de la perte finale? S'agit-il seulement d'essais et d'erreurs? ou existe-t-il une théorie (ou du moins une règle empirique) pour cela? Je n'ai trouvé aucune information à ce sujet (y compris le document original).
Le problème que je rencontre est que si l'équilibre entre mes dimensions d'entité d'entrée (x) et les dimensions d'espace latent (z) n'est pas «optimal», soit mes reconstructions sont très bonnes mais l'espace latent appris n'est pas structuré (si x dimensions est très élevé et l'erreur de reconstruction domine sur KLD), ou vice versa (les reconstructions ne sont pas bonnes mais l'espace latent appris est bien structuré si KLD domine).
Je me retrouve à devoir normaliser la perte de reconstruction (division par la taille de l'entité en entrée) et KLD (division par les dimensions z), puis pondérer manuellement le terme KLD avec un facteur de pondération arbitraire (la normalisation est pour que je puisse utiliser la même chose ou poids similaire indépendant des dimensions de x ou z ). Empiriquement, j'ai trouvé environ 0,1 pour fournir un bon équilibre entre la reconstruction et l'espace latent structuré qui me semble être un «point idéal». Je recherche un travail préalable dans ce domaine.
Sur demande, notation mathématique ci-dessus (en se concentrant sur la perte de L2 pour l'erreur de reconstruction)