Module 5 — Effondrement des modes et stabilisation
Le module précédent a formulé le jeu à deux joueurs et a laissé le générateur libre de ne couvrir qu'une petite partie de la distribution des vraies données. Ce module identifie précisément ce qui rate, et présente les trois interventions modernes qui rendent l'entraînement d'un GAN à peu près routinier : Wasserstein, pénalité de gradient et normalisation spectrale. Le tout se termine par un aperçu de StyleGAN, qui pousse cette stabilité à son extrême.
Diagnostiquer un effondrement des modes
L'effondrement des modes est la pathologie caractéristique des GAN. Le générateur, au lieu de couvrir la diversité des vraies données, se concentre sur un nombre restreint de sorties qui trompent particulièrement bien le discriminateur. Sur MNIST, on passe des dix classes de chiffres à trois, puis à un seul, décliné en variations minces.
Trois signaux le trahissent avant même une évaluation quantitative :
- Une grille fixe de vecteurs produit des images de plus en plus similaires au fil des itérations ; les 64 tuiles qui montraient dix chiffres différents n'en montrent bientôt plus qu'un ou deux.
- La perte de baisse régulièrement après une phase d'équilibre, parce que le générateur est devenu prévisible et facile à démasquer.
- Un histogramme des classes prédites sur 10 000 échantillons générés s'écarte franchement de l'uniforme.
Deux mécanismes internes en sont responsables. D'abord, la formulation minimax ne contient aucun terme de couverture : minimise l'erreur du discriminateur sans être puni pour l'oubli de modes. Ensuite, un déséquilibre entre et produit des gradients presque nuls sur des zones entières de l'espace de sortie : le générateur ne reçoit plus d'information pour explorer.
Wasserstein : mesurer autrement la distance entre distributions
L'idée du WGAN (Arjovsky, 2017) est de remplacer la divergence de Jensen-Shannon implicite dans la BCE par la distance de Wasserstein (aussi appelée Earth Mover's Distance). Intuitivement, elle mesure le coût minimal pour transporter la masse d'une distribution vers l'autre, et reste informative même quand les supports ne se chevauchent pas — ce qui est presque toujours le cas au début de l'entraînement.
En pratique, le discriminateur devient un critique qui renvoie un score scalaire (pas une probabilité) et l'objectif se récrit :
Le critique cherche à écarter au maximum les scores des vraies images de ceux des fausses ; le générateur cherche à rapprocher les deux. La sortie de étant un logit non borné, on n'utilise ni sigmoïde ni BCE : c'est une simple différence de moyennes.
La contrainte cachée est , où est l'ensemble des fonctions 1-Lipschitziennes. Sans cette contrainte, le critique peut multiplier tous ses poids par 10 et faire diverger la perte artificiellement. La WGAN originale imposait cette contrainte par clipping des poids de dans , une méthode qui marche mais dégrade la capacité du réseau.
La pénalité de gradient : rendre la contrainte de Lipschitz utilisable
Le WGAN-GP (Gulrajani, 2017) remplace le clipping par une pénalité qui pousse la norme du gradient de à valoir 1 sur des points interpolés entre vraies et fausses données :
def penalite_gradient(critique, x_reel, x_faux, appareil):
alpha = torch.rand(x_reel.size(0), 1, 1, 1, device=appareil)
x_hat = alpha * x_reel + (1 - alpha) * x_faux
x_hat.requires_grad_(True)
scores = critique(x_hat)
grads = torch.autograd.grad(
scores, x_hat,
grad_outputs=torch.ones_like(scores),
create_graph=True,
)[0]
grads = grads.view(grads.size(0), -1)
return ((grads.norm(2, dim=1) - 1) ** 2).mean()
La perte totale du critique devient , avec dans le papier original. C'est aujourd'hui l'objectif de référence pour un GAN, avec des propriétés très différentes de la BCE :
- La perte du critique descend proprement au fil des itérations et corrèle raisonnablement avec la qualité — inversion majeure par rapport au GAN vanilla.
- Le mode collapse recule sans disparaître : la fonction de coût pousse à couvrir la distribution parce qu'une masse ignorée reste transportable et donc mesurable.
- L'entraînement supporte des taux d'apprentissage plus élevés et des architectures plus grosses sans exploser.
La BatchNorm normalise chaque canal sur le lot. Quand le critique voit un lot mixte de vraies et de fausses images, ses statistiques changent avec la proportion, et la contrainte de gradient devient bruitée. Utiliser LayerNorm ou InstanceNorm dans le critique WGAN-GP, ou pas de normalisation du tout — jamais BatchNorm. Le symptôme d'une confusion ici : la perte du critique oscille sans descendre, et la pénalité reste anormalement grande.
Normalisation spectrale : la Lipschitz sans pénalité
La normalisation spectrale (Miyato, 2018) impose la contrainte de Lipschitz différemment : elle divise chaque matrice de poids de par sa plus grande valeur singulière, estimée par une itération de puissance à chaque passe avant. Chaque couche devient 1-Lipschitzienne par construction, sans terme de pénalité ni interpolation.
from torch.nn.utils.parametrizations import spectral_norm
class DiscriminateurSN(nn.Module):
def __init__(self):
super().__init__()
self.conv1 = spectral_norm(nn.Conv2d(3, 64, 4, 2, 1))
self.conv2 = spectral_norm(nn.Conv2d(64, 128, 4, 2, 1))
# ...
Les avantages sont nets : aucun hyperparamètre supplémentaire, coût de calcul négligeable, compatibilité avec toutes les architectures. Le SN-GAN et sa variante SAGAN ont dominé la génération d'images entre 2018 et 2020, et l'astuce reste largement utilisée. On peut d'ailleurs la combiner avec WGAN-GP ou avec une BCE classique.
Autres astuces pratiques qui comptent
Un GAN moderne ne repose jamais sur une seule technique. Quatre réglages sont routiniers :
- Lissage des étiquettes : remplacer les 1 par 0.9 dans la BCE pour empêcher de devenir trop confiant.
- Nombre de pas de par pas de : dans le WGAN-GP, est standard.
- Moyenne exponentielle des poids de pour la génération finale (EMA), très utile pour StyleGAN.
- Augmentation adaptative (ADA, StyleGAN2-ADA) : mêmes augmentations sur vrai et faux, force adaptée au sur-apprentissage du discriminateur, précieuse sur les jeux à moins de 10 000 images.
Un aperçu de StyleGAN
StyleGAN (Karras, 2019 puis 2020, 2021) est l'aboutissement de cette lignée sur les visages. Son innovation principale est de séparer la source de variation en deux : un réseau de correspondance transforme en un vecteur de style dans un espace intermédiaire mieux structuré, et ce style est injecté à chaque résolution du générateur via une normalisation adaptative.
L'espace obtenu est remarquable : on peut éditer des attributs sémantiques (âge, sourire, orientation du visage) en trouvant des directions linéaires, et le contrôle est plus fin que dans un brut. C'est ce même espace qui permet des applications comme le vieillissement de visages, la modification de l'expression, ou l'inversion (retrouver le qui a produit une image donnée). StyleGAN2 corrige des artefacts caractéristiques (gouttelettes), StyleGAN3 corrige la dépendance aux positions.
En résumé
- L'effondrement des modes se diagnostique par une grille fixe qui se ressemble, une perte de qui baisse, et un histogramme de classes générées non uniforme.
- Le WGAN remplace la BCE par la distance de Wasserstein, informative même sans chevauchement de supports ; il exige un critique 1-Lipschitzien.
- La pénalité de gradient (WGAN-GP, ) impose cette contrainte sans clipping ; utiliser
LayerNormou aucune normalisation, jamaisBatchNormdans le critique. - La normalisation spectrale garantit la Lipschitz couche par couche sans hyperparamètre, et se combine avec toute perte ; StyleGAN en est l'héritier direct sur les visages.
Module suivant : une famille génératrice sans jeu à deux joueurs, qui a détrôné les GAN sur la plupart des benchmarks — les modèles de diffusion.