Skip to content

Calcul de la perte dans un Variational AutoEncoder (VAE)

Voici comment calculer la valeur de perte dans un Variational AutoEncoder (VAE) en utilisant le code TensorFlow/Keras.

Calcul Valeur de Perte

Pour calculer la valeur de perte dans un Variational AutoEncoder (VAE), nous devons combiner deux types de pertes :

  1. Perte de reconstruction : Elle mesure la différence entre l’image d’entrée et l’image reconstruite, ce qui assure que l’image générée est proche de l’image originale.
  2. Perte de divergence KL (Kullback-Leibler) : Elle impose à la distribution latente apprise de rester proche d’une distribution normale standard, ce qui aide à régulariser l’espace latent.

Voici les étapes détaillées pour utiliser une fonction de perte et calculer la valeur de perte dans un VAE :

1. Perte de reconstruction

La perte de reconstruction est généralement calculée avec l’entropie croisée binaire ou l’erreur quadratique moyenne (MSE), selon le type de données (images, données continues, etc.). Pour des images, l’entropie croisée binaire est souvent utilisée.

reconstruction_loss = tf.keras.losses.binary_crossentropy(input_img, output)
reconstruction_loss *= 28 * 28 # Multiplication par la taille de l'image pour obtenir une somme totale
reconstruction_loss = tf.reduce_mean(reconstruction_loss) # Moyenne sur l'ensemble des images

2. Perte de divergence KL

La divergence KL est calculée entre la distribution latente apprise ( \mathcal{N}(z_{\mu}, z_{\sigma}) ) et une distribution gaussienne standard ( \mathcal{N}(0, I) ). Elle est donnée par la formule suivante :

\text{KL divergence} = -0.5 \sum \left( 1 + \log(\sigma^2) - \mu^2 - \sigma^2 \right)

Dans le code :

kl_loss = 1 + z_log_var - tf.square(z_mean) - tf.exp(z_log_var)
kl_loss = tf.reduce_sum(kl_loss, axis=-1)
kl_loss *= -0.5 # Multiplication par -0.5 pour la divergence KL
kl_loss = tf.reduce_mean(kl_loss) # Moyenne sur l'ensemble des images

3. Perte totale

La perte totale est la somme de la perte de reconstruction et de la perte de divergence KL.

vae_loss = reconstruction_loss + kl_loss
vae.add_loss(vae_loss)

Exemple complet du calcul de la perte dans un VAE :

# Calcul de la perte de reconstruction (entropie croisée binaire)
reconstruction_loss = tf.keras.losses.binary_crossentropy(input_img, output)
reconstruction_loss *= 28 * 28 # Taille de l'image (28x28 pixels)
reconstruction_loss = tf.reduce_mean(reconstruction_loss) # Moyenne sur toutes les images
# Calcul de la perte KL divergence
kl_loss = 1 + z_log_var - tf.square(z_mean) - tf.exp(z_log_var)
kl_loss = tf.reduce_sum(kl_loss, axis=-1)
kl_loss *= -0.5
kl_loss = tf.reduce_mean(kl_loss) # Moyenne sur toutes les images
# Calcul de la perte totale
vae_loss = reconstruction_loss + kl_loss
vae.add_loss(vae_loss)

4. Compilation et entraînement du modèle

Une fois que la perte totale est définie, vous pouvez compiler et entraîner le modèle avec un optimiseur, comme Adam :

vae.compile(optimizer='adam')
vae.fit(x_train, x_train, epochs=50, batch_size=128, validation_data=(x_test, x_test))

Dans ce cas, la perte totale inclut à la fois l’aspect “génératif” (réduction de la divergence entre les distributions latentes) et “reconstructif” (reconstruction fidèle des images d’origine).