Modèles Génératifs : VAE & GAN
“Apprendre la forme des données — puis échantillonner une nouvelle réalité à partir de la distribution apprise”
Autoencoder → VAE (ELBO, astuce de reparamétrage) → GAN (entraînement adversarial, DCGAN, collapse de mode).
Prérequis
Concepts Couverts
∑Formules Clés
ELBO (VAE)
Terme de reconstruction − divergence KL (régularise l'espace latent) — l'objectif maximisé dans l'entraînement VAE
Reparamétrisation
Permet aux gradients de passer à travers l'opération d'échantillonnage — astuce nécessaire pour la rétropropagation dans les VAE
Objectif GAN
Le générateur trompe le discriminateur ; le discriminateur détecte les faux — jeu minimax adversariel
▶Simulation Interactive
⬡Architecture du Modèle
De la Discrimination à la Génération
Tous les modèles précédents sont discriminatifs : P(y|x). Les modèles génératifs apprennent P(x) — la distribution complète des données. Une fois la distribution apprise, vous pouvez échantillonner de nouveaux points, interpoler entre exemples, détecter des anomalies et faire de la génération conditionnelle. C'est ainsi que fonctionnent Stable Diffusion, GPT et DALL-E en leur cœur.
VAE : La Compression Probabiliste
Les autoencodeurs compriment les données en un code latent puis reconstruisent. Mais l'espace latent est déconnecté — les images similaires ne sont pas proches. Les VAE corrigent cela en encodant des distributions (μ, σ) au lieu de points, et en pénalisant la déviation de N(0,I) via la divergence KL. Cela force un espace latent lisse et continu où l'interpolation et l'échantillonnage ont un sens sémantique.
L'astuce de reparamétrisation z = μ + σ⊙ε est l'idée clé qui rend l'entraînement VAE possible. Sans elle, l'échantillonnage est une opération non différentiable — aucun gradient ne peut circuler.
L'ELBO : Borne Inférieure de l'Évidence
Nous voulons maximiser log p(x). C'est intraitable directement. À la place, nous maximisons l'ELBO : qualité de reconstruction (comment bien nous décodons) moins divergence KL du prior (combien l'encodeur s'écarte du gaussien standard). β-VAE ajoute un poids β au terme KL pour des représentations disentangled.
Entraînement GAN : Le Jeu Adversarial
Le générateur G prend du bruit z ~ N(0,I) et produit de faux échantillons G(z). Le discriminateur D essaie de distinguer les vrais échantillons des faux. Ils jouent un jeu minimax : D maximise log D(réel) + log(1 - D(G(z))) ; G minimise log(1 - D(G(z))). À l'équilibre de Nash, G produit des échantillons indiscernables des données réelles.
Effondrement de mode : le générateur trouve un seul point qui trompe toujours le discriminateur. Remède : Wasserstein GAN (WGAN-GP) avec pénalité de gradient, normalisation spectrale, ou minibatch discrimination.
Implémentation DCGAN
import torch import torch.nn as nn class Generateur(nn.Module): def __init__(self, dim_latente=class="tok-num">100, canaux_img=class="tok-num">3): super().__init__() self.reseau = nn.Sequential( class="tok-comment"># Projeter et remodeler le bruit nn.Linear(dim_latente, class="tok-num">512 * class="tok-num">4 * class="tok-num">4), nn.Unflatten(class="tok-num">1, (class="tok-num">512, class="tok-num">4, class="tok-num">4)), class="tok-comment"># Blocs de suréchantillonnage *self._bloc(class="tok-num">512, class="tok-num">256), *self._bloc(class="tok-num">256, class="tok-num">128), *self._bloc(class="tok-num">128, class="tok-num">64), *self._bloc(class="tok-num">64, class="tok-num">32), nn.ConvTranspose2d(class="tok-num">32, canaux_img, class="tok-num">4, class="tok-num">2, class="tok-num">1), nn.Tanh() ) def _bloc(self, entree_c, sortie_c): return [nn.ConvTranspose2d(entree_c, sortie_c, class="tok-num">4, class="tok-num">2, class="tok-num">1, bias=False), nn.BatchNorm2d(sortie_c), nn.ReLU(True)] def forward(self, z): return self.reseau(z) class="tok-comment"># Entraînement WGAN-GP (plus stable que GAN vanilla) def penalite_gradient(D, reel, faux, device): alpha = torch.rand(reel.size(class="tok-num">0), class="tok-num">1, class="tok-num">1, class="tok-num">1).to(device) interpole = alpha * reel + (class="tok-num">1 - alpha) * faux interpole.requires_grad_(True) d_interp = D(interpole) gradients = torch.autograd.grad(d_interp, interpole, grad_outputs=torch.ones_like(d_interp), create_graph=True)[class="tok-num">0] return ((gradients.norm(class="tok-num">2, dim=class="tok-num">1) - class="tok-num">1) ** class="tok-num">2).mean()
?Vérification des Connaissances
La progression est sauvegardée dans votre navigateur — aucun compte requis.
Besoin d'un ingénieur IA ou data scientist ?
Je conçois des modèles ML sur mesure, des agents IA, de la vision par ordinateur et de l'automatisation — de l'idée à la production.