ML Learning Hub
Deep Learningavancé

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).

80 min
10 diagrammes
7 Concepts Couverts

Prérequis

Neural Networks
CNN Architectures
Information Theory

Concepts Couverts

AutoencoderELBOReparameterizationLatent SpaceGANDCGANMode Collapse

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

Loading visualization…
Loading visualization…

Architecture du Modèle

Loading visualization…
Loading visualization…
🎯

De la Discrimination à la Génération

motivation

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

intuition

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

math

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.

ELBO — l'objectif maximisé dans l'entraînement VAE
🔬

Entraînement GAN : Le Jeu Adversarial

deepdive

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

code
python31 lines
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.