Modèles de diffusion : comment une image naît du bruit pur
Le processus direct qui ajoute du bruit, un réseau qui estime le bruit, DDPM et DDIM écrits de zéro, huit amas sans effondrement des modes, combien de pas d’échantillonnage il faut, une comparaison avec le VAE et le GAN sur des chiffres et le chemin vers les images à partir d’un texte.
Série Bases de l’IA Partie 46 sur 52
- Carte de l’intelligence artificielle : qu’est-ce qui est quoi et comment tout s’emboîte
- Brève histoire de l’intelligence artificielle : de Turing aux modèles de langage
- Données, modèle, entraînement, inférence : les notions de base sur un seul exemple
- Lire la notation mathématique : symboles, indices, sommes et quantificateurs
- Ensembles et relations : les briques dont sont faites les définitions en IA
- Fonctions et applications : pourquoi tout modèle d’IA est une fonction
- Logique et démonstrations : les règles selon lesquelles on raisonne en IA
- Graphes et arbres : la structure sur laquelle reposent la recherche et les réseaux de neurones
- Algèbre linéaire pour l’apprentissage automatique : vecteurs, matrices et pourquoi l’IA multiplie surtout
- Dérivées, gradient et règle de dérivation en chaîne : comment un modèle sait dans quelle direction apprendre
- Descente de gradient : comment un modèle apprend
- Qu’est-ce que la probabilité : du lancer de dé aux axiomes de Kolmogorov
- Probabilité conditionnelle et théorème de Bayes : comment réviser une estimation quand on apprend du nouveau
- Variable aléatoire et fonction de répartition : une seule fonction qui dit tout de la loi
- Fonction de densité et fonction de masse : pourquoi une variable continue a une probabilité nulle en chaque point
- Espérance, variance et covariance : où se situe une loi, quelle est sa largeur et ce qui varie avec quoi
- Panorama des lois de probabilité : Bernoulli, binomiale, Poisson, uniforme, normale et exponentielle
- Loi des grands nombres et théorème central limite : pourquoi les moyennes sont si prévisibles
- Statistique et estimation de paramètres : maximum de vraisemblance, MAP et intervalles de confiance
- Théorie de l’information : entropie, entropie croisée et divergence KL — d’où viennent les fonctions de perte
- Recherche dans l’espace d’états : BFS, DFS, UCS et A* en animations
- Jeux et adversaires : minimax, élagage alpha-bêta et Monte Carlo tree search
- Satisfaction de contraintes : backtracking, propagation de contraintes et AC-3 sur un sudoku et une carte des régions tchèques
- Logique et systèmes à base de connaissances : chaînage avant et arrière, résolution et systèmes experts
- Planification : STRIPS, monde des blocs, heuristiques par relaxation et planification dans les agents IA
- Recherche locale et recuit simulé : un voyageur de commerce à travers les chefs-lieux de région tchèques
- Algorithmes génétiques : population, croisement, mutation et sélection sur un sac à dos de randonnée
- Stratégies d’évolution et programmation génétique : de la règle du cinquième à la loi de Kepler
- Optimisation par colonies de fourmis : comment une piste de phéromone trouve un chemin court
- Optimisation par essaim de particules : inertie, expérience propre et expérience de l’essaim
- Neuroévolution : faire évoluer les poids et la forme des réseaux de neurones, et l’algorithme NEAT
- Ensembles flous et fonctions d’appartenance : comment écrire « un peu chaud »
- Logique floue et probabilité : pourquoi « un peu chaud » ne veut pas dire « probablement chaud »
- Logique floue : t-normes, implications et règles SI–ALORS
- Commande floue : Mamdani et Sugeno, du ventilateur au pendule inversé sur un chariot
- Clustering flou : l’algorithme fuzzy c-means et les points entre les clusters
- Systèmes neuro-flous (ANFIS) : des règles floues qui apprennent à partir des données
- Chaînes de Markov : matrice de transition, distribution stationnaire et PageRank
- Modèles de Markov cachés : l’algorithme de Viterbi et le casino malhonnête
- Réseaux bayésiens : pourquoi l’herbe est mouillée et ce que cela implique pour l’arroseur
- Le filtre de Kalman : comment estimer, à partir de mesures imprécises, où se trouve une voiture et à quelle vitesse elle roule
- Types d’apprentissage automatique : supervisé, non supervisé, semi-supervisé et plus
- Prompts, contexte et RAG : comment donner au modèle les bonnes informations
- Autoencodeurs variationnels (VAE) : de nouvelles images à partir d’un espace latent continu
- Réseaux antagonistes génératifs (GAN) : le faussaire contre le détective
- Modèles de diffusion : comment une image naît du bruit pur
- Processus de décision markoviens : états, actions, récompenses et équations de Bellman
- Q-learning et DQN : apprendre la valeur des actions, du tableau au réseau de neurones
- Policy gradient et PPO : apprendre directement la politique
- Comment fonctionne un agent IA : un modèle de langage en boucle avec des outils
- Programmer avec des agents IA : consigne, tests et vérification
- Évaluation et sécurité des systèmes d’IA : comment mesurer et comment surveiller
Programme complet de la série 52 sur 83 sujets publiés
- Comment fonctionnent les processus direct et inverse de la diffusion.
- Pourquoi la diffusion s’entraîne de façon plus stable qu’un GAN et ce que coûte le nombre de pas.
- Comment la diffusion devient un générateur d’images à partir d’un texte.
Utile à connaître avant : Réseaux antagonistes génératifs (GAN) : le faussaire contre le détective, Autoencodeurs variationnels (VAE) : de nouvelles images à partir d’un espace latent continu
Stable Diffusion, Midjourney, DALL·E 3 et les modèles qui génèrent de la vidéo reposent tous sur la même idée, et elle est étonnamment simple. Détruire une image est facile — il suffit d’y ajouter progressivement du bruit jusqu’à ce qu’il ne reste que du bruit. Si nous apprenions à annuler chaque petit pas, nous pourrions partir du bruit pur et en faire sortir une image pas à pas. Dans cette partie, nous le programmons de zéro et le comparons au VAE et au GAN sur les mêmes données.
Elle fait suite aux parties Réseaux antagonistes génératifs et Autoencodeurs variationnels.
1. Processus direct : l’image se dissout dans le bruit
Définition — processus direct (de diffusion)
On choisit un nombre de pas T et un plan de petites variances β1, …, βT. À chaque pas, on ajoute un peu de bruit : xt = √(1 − βt) · xt−1 + √βt · ε, ε ~ N(0, I). En composant les pas, on obtient la forme close xt = √ᾱt · x0 + √(1 − ᾱt) · ε, où ᾱt = ∏s ≤ t (1 − βs). Pour t assez grand, ᾱt ≈ 0 et xt est du bruit pur.
Une goutte d’encre dans un verre d’eau : un instant, on voit la forme de la goutte, puis elle se diffuse, et à la fin l’eau est colorée uniformément et la forme d’origine n’est plus reconnaissable. La formule close dit qu’on peut sauter directement à n’importe quel instant — inutile de simuler tous les pas.
xt = √ᾱt · x0 + √(1 − ᾱt) · ε
- xt
- l’image bruitée au pas t — exactement ce que le réseau reçoit en entrée pendant l’apprentissage
- √ᾱt
- ce qui reste de l’image d’origine ; ᾱt est le produit de tous les (1 − βs) jusqu’au pas t, il diminue donc à chaque pas
- x0
- l’image d’origine, tirée des données
- √(1 − ᾱt)
- la quantité de bruit ; les racines carrées sont là parce que ce sont les variances qui s’additionnent : (√ᾱ)² + (√(1 − ᾱ))² = 1, donc des données de variance 1 ont une variance 1 à chaque pas et passent à la fin en douceur à N(0, I)
- ε
- un échantillon de bruit tiré de N(0, I) — c’est justement ce que le réseau devra deviner ; le fait de le connaître fait de l’apprentissage une simple régression
Théorème — pourquoi un seul saut suffit
Si xt−1 = √ᾱt−1 x0 + √(1 − ᾱt−1) ε′ avec ε′ ~ N(0, I), alors on a aussi xt = √ᾱt x0 + √(1 − ᾱt) ε avec un nouveau ε ~ N(0, I).
Démonstration. On substitue dans un pas : xt = √(1 − βt) √ᾱt−1 x0 + √(1 − βt) √(1 − ᾱt−1) ε′ + √βt ε″. Le premier terme vaut √ᾱt x0, car ᾱt = (1 − βt) ᾱt−1. Les deux autres sont des bruits normaux indépendants de moyenne 0 ; leur somme est de nouveau normale et les variances s’additionnent : (1 − βt)(1 − ᾱt−1) + βt = 1 − (1 − βt) ᾱt−1 = 1 − ᾱt. Pour t = 1, l’énoncé est vrai directement (ᾱ0 = 1), la suite s’obtient par récurrence. ∎
Exemple — notre plan de bruit en chiffres
β croît linéairement : βt = β1 + (βT − β1) · (t − 1)/(T − 1), soit de 0,00101 par pas.
| t | βt | ᾱt | √ᾱt (signal) | √(1 − ᾱt) (bruit) |
|---|---|---|---|---|
| 1 | 0,00010 | 0,9999 | 1,000 | 0,010 |
| 2 | 0,00111 | 0,9988 | 0,999 | 0,035 |
| 25 | 0,02432 | 0,7351 | 0,857 | 0,515 |
| 37 | 0,03643 | 0,5045 | 0,710 | 0,704 |
| 38 | 0,03744 | 0,4856 | 0,697 | 0,717 |
| 50 | 0,04955 | 0,2830 | 0,532 | 0,847 |
| 100 | 0,10000 | 0,0056 | 0,075 | 0,997 |
Vérifions la deuxième ligne à la main : ᾱ2 = (1 − β1)(1 − β2) = 0,9999 · 0,99889 = 0,99879. Le signal et le bruit s’équilibrent (ᾱ = 0,5) entre les pas 37 et 38 ; au pas 100, l’image d’origine n’a plus qu’un poids de 0,075 contre 0,997 pour le bruit.
Chez nous, T = 100 et β croît linéairement de 0,0001 à 0,1. La part du signal d’origine √ᾱt vaut 0,86 au pas 25, 0,53 au pas 50 et plus que 0,07 au pas 100.
2. Processus inverse : un réseau qui devine le bruit
Définition — DDPM (denoising diffusion probabilistic model)
DDPM (Jonathan Ho, Ajay Jain et Pieter Abbeel, 2020 ; idée de Jascha Sohl-Dickstein et al., 2015) entraîne un réseau εθ(xt, t) à estimer, à partir d’une image bruitée et du numéro du pas, quel bruit ε a été ajouté. La perte est une simple erreur quadratique moyenne E ‖ε − εθ(√ᾱt x0 + √(1 − ᾱt) ε, t)‖² avec un t aléatoire. L’échantillonnage remonte à partir de xT ~ N(0, I) : xt−1 = (xt − βt/√(1 − ᾱt) · εθ) / √(1 − βt) + √βt · z.
Le réseau reçoit une photo floue et bruitée et la question « combien de bruit contient-elle et à quoi ressemble-t-il ? ». S’il sait l’estimer, il sait aussi en retirer un peu. On recommence cent fois, chaque fois avec un peu de hasard frais — et une image émerge du bruit. L’apprentissage est une simple régression : pas d’adversaire comme dans un GAN, pas de compromis comme dans un VAE.
L(θ) = Ex0, t, ε ‖ε − εθ(√ᾱt x0 + √(1 − ᾱt) ε, t)‖²
- ε
- le bruit que nous avons nous-mêmes ajouté à l’image — la bonne réponse, c’est pourquoi nous la connaissons sans le moindre étiquetage des données
- εθ(…, t)
- l’estimation du bruit par le réseau ; il reçoit aussi le numéro du pas t, car à t = 2 il a peu de bruit à trouver et à t = 100 xt n’est presque que du bruit
- √ᾱt x0 + √(1 − ᾱt) ε
- l’image bruitée xt fabriquée en un seul saut — grâce à la formule close, il suffit de tirer t et ε pour chaque exemple, rien n’est simulé pas à pas
xt−1 = 1/√(1 − βt) · (xt − βt/√(1 − ᾱt) · εθ(xt, t)) + √βt · z
- xt
- l’état bruité actuel — on part du bruit pur xT ~ N(0, I)
- εθ(xt, t)
- l’estimation du bruit présent dans xt
- βt/√(1 − ᾱt)
- quelle part du bruit estimé retirer — seulement la part qui correspond à un pas (βt), rapportée au niveau total de bruit √(1 − ᾱt) ; chez nous 0,01 au pas 1 et 0,10 au pas 100
- 1/√(1 − βt)
- annule la réduction du pas direct (où l’on multipliait par √(1 − βt)) ; au pas 100, il vaut 1,054
- √βt · z
- du bruit frais z ~ N(0, I) (au dernier pas z = 0) — le processus inverse est aléatoire comme le processus direct ; sans lui, les échantillons seraient attirés vers des images moyennes. La taille √βt est l’un des deux choix testés par Ho et al.
# apprentissage (DDPM)
répéter 16 000× :
pour chacun des 64 exemples du lot :
x₀ = exemple aléatoire tiré des données
t = au hasard parmi 1 … 100
ε = vecteur de nombres aléatoires tirés de N(0, 1)
x_t = √ᾱ_t · x₀ + √(1 − ᾱ_t) · ε
erreur = ‖ε − ε_θ(x_t, code(t))‖² / dimension
pas d’Adam sur l’erreur moyenne
# échantillonnage (DDPM, 100 pas)
x = vecteur tiré de N(0, 1)
pour t = 100, 99, …, 1 :
ε̂ = ε_θ(x, code(t))
z = vecteur tiré de N(0, 1), nul au pas t = 1
x = (x − β_t / √(1 − ᾱ_t) · ε̂) / √(1 − β_t) + √β_t · z
renvoyer x
Définition — encodage sinusoïdal du temps
Le réseau ne reçoit pas directement le nombre t, mais huit nombres code(t) = (sin(fπt/T), cos(fπt/T)) pour f = 1, 2, 4, 8. Les fréquences lentes disent « à peu près où nous en sommes dans le processus », les rapides distinguent des pas voisins ; tous les nombres sont compris entre −1 et 1, si bien qu’aucune entrée ne l’emporte sur les autres.
Pour t = 25 (un quart du processus, angles π/4, π/2, π et 2π) : code(25) = (0,707 ; 0,707 ; 1,000 ; 0,000 ; 0,000 ; −1,000 ; 0,000 ; 1,000).
Notre réseau est le réseau multicouche ordinaire de la partie sur les GAN : en entrée xt et huit nombres de l’encodage sinusoïdal du temps t (comme l’encodage positionnel d’un transformer), en sortie l’estimation du bruit. Sur le cercle, il a deux couches cachées de 64 neurones, sur les chiffres de 128. Il est entraîné avec Adam pendant 16 000 pas.
3. Huit amas sans effondrement
Les mêmes données que dans la partie précédente : huit amas sur un cercle. Voici à quoi ressemblent 400 échantillons pendant le processus inverse :
Au pas 25, les points sont encore dispersés presque uniformément (qualité 3 %), au pas 10 le cercle se dessine et, dans les dix derniers pas, les points se rassemblent en amas. À la fin, les 8 amas sont tous couverts et chacun a reçu de 28 à 50 des 500 échantillons. La qualité (part à moins de 3σ d’un centre) est de 63 %.
La différence avec le GAN n’est pas dans la qualité, mais dans la fiabilité. Le GAN n’a couvert les huit amas que dans une exécution sur quatre ; la diffusion y est parvenue dans l’unique exécution que nous avons lancée (une exécution n’est pas une preuve, mais c’est cohérent avec ce que l’on sait de la diffusion). La perte de la diffusion n’est pas un jeu, mais une régression, et le réseau est pénalisé pour chaque échantillon des données — il ne peut « laisser tomber » aucun amas.
4. Combien de pas faut-il ?
Définition — DDIM
DDIM (Jiaming Song, Chenlin Meng et Stefano Ermon, 2020) utilise le même réseau entraîné, mais échantillonne de manière déterministe et par plus grands sauts : à partir de l’estimation du bruit, il calcule une estimation de l’image propre x̂0 = (xt − √(1 − ᾱt) εθ) / √ᾱt et, à partir d’elle, directement xs = √ᾱs x̂0 + √(1 − ᾱs) εθ pour n’importe quel temps antérieur s < t.
Au lieu de cent tout petits pas, on en fait vingt plus grands. À chacun, le réseau se demande « à quoi ressemblerait sans doute l’image terminée ? » et saute d’autant sur le chemin. Quand les sauts sont trop grands, le réseau vise à côté.
xs = √ᾱs · x̂0 + √(1 − ᾱs) · εθ(xt, t), x̂0 = (xt − √(1 − ᾱt) εθ) / √ᾱt
- xt
- l’état dans lequel nous nous trouvons
- εθ
- l’estimation du bruit — le même réseau que pour DDPM, rien n’est réentraîné
- x̂0
- l’estimation de l’image terminée : la formule close du processus direct résolue en x0 ; on divise par √ᾱt, qui est petit au début, c’est donc là que l’estimation est la moins précise
- √ᾱs
- la part d’image qu’il doit y avoir au temps cible s — le même facteur que dans le processus direct, simplement pour un autre temps
- √(1 − ᾱs)
- la quantité de bruit qui doit rester ; DDIM réutilise le même bruit estimé, sans en tirer de nouveau — c’est pourquoi il est déterministe
Exemple — pourquoi deux pas ne suffisent pas (en simplifiant)
DDIM à n pas parcourt des temps répartis uniformément : avec 5 pas 100 → 80 → 60 → 40 → 20 → 0, avec 2 pas 100 → 50 → 0. Le premier saut part toujours de t = 100, où √ᾱ100 = 0,075.
Si le réseau se trompe de δ dans l’estimation du bruit, l’estimation x̂0 se trompe de δ · √(1 − ᾱ100)/√ᾱ100 = 13,3 δ — l’erreur est amplifiée plus de dix fois. Après substitution dans le saut vers le temps s, le nouvel état diffère du bon de δ · (√(1 − ᾱs) − √ᾱs · 13,3) :
- 5 pas, saut 100 → 80 : facteur −1,59,
- 2 pas, saut 100 → 50 : facteur −6,23,
Avec un petit saut, la mauvaise estimation x̂0 est mélangée avec un faible poids √ᾱ80 = 0,19 et les pas suivants la corrigent. Avec un saut jusqu’au milieu du processus, elle entre avec le poids √ᾱ50 = 0,53 et il ne reste qu’un seul pas. Le raisonnement ne suit qu’une erreur à un seul pas et suppose que le réseau estime sinon parfaitement ; il montre pourtant pourquoi les premiers pas, les plus bruités, sont les plus sensibles.
DDIM à 50 pas atteint une qualité de 79 % — plus que DDPM à 100 pas (63 %), très probablement parce qu’il n’ajoute pas de bruit aléatoire que notre réseau imprécis n’arrive pas à éliminer dans les derniers pas. Avec 10 pas, on obtient encore 70 %, avec 5 pas 60 %. Avec 2 pas, l’échantillonnage s’effondre (0 %). Le nombre de pas est le principal coût de la diffusion : chaque pas est un passage dans le réseau, alors qu’un GAN génère une image en un seul passage.
5. Chiffres : comparaison de trois générateurs
Sur les chiffres 8 × 8 (pixels ramenés à l’intervalle de −1 à 1), le réseau est entraîné pendant 16 000 pas.
| modèle | distance au chiffre le plus proche | chiffre le moins représenté (sur 200) | chiffres avec moins de 10 échantillons |
|---|---|---|---|
| VAE (k = 8) | 0,054 | 10 | 0 |
| GAN, graine 1 | 0,049 | 3 | 3 |
| GAN, graine 2 | 0,042 | 0 | 6 |
| diffusion (100 pas) | 0,063 | 12 | 0 |
Il faut ici être honnête : notre diffusion a une distance de 0,063, moins bien que le VAE (0,054) et que le GAN (0,042). Sur les images, on voit un bruit résiduel. En revanche, les chiffres sont représentés de façon équilibrée — le chiffre le moins fréquent a 12 échantillons, alors qu’au GAN avec la graine 2 il manque complètement deux chiffres.
Pourquoi la netteté est-elle moins bonne ? Un petit réseau multicouche doit débruiter des images à tous les cent niveaux de bruit à la fois, et c’est une tâche plus difficile que l’unique correspondance bruit → image d’un GAN. En contrepartie, il s’améliore régulièrement avec le calcul : la distance des échantillons a diminué pendant l’apprentissage 0,096 (pas 4 000), 0,082 (pas 8 000), 0,068 (pas 12 000), 0,063 (pas 16 000) (estimation rapide sur 100 échantillons DDIM à 20 pas). Ni effondrement ni oscillations. Les vrais modèles de diffusion utilisent des réseaux convolutifs U-Net ou des transformers à des centaines de millions de paramètres et s’entraînent pendant des semaines — et là, ils gagnent aussi en netteté.
6. Des chiffres aux images à partir d’un texte
- Conditionnement. Le réseau εθ(xt, t, c) reçoit en plus une description c — un embedding du texte issu d’un modèle de langage, branché par l’attention (la partie sur l’attention). Il est entraîné sur des milliards de paires image–légende.
- Guidage sans classifieur (classifier-free guidance, Jonathan Ho et Tim Salimans, 2021). Le réseau est entraîné avec et sans description, et lors de l’échantillonnage l’estimation est décalée dans la direction « avec description moins sans description », amplifiée par un coefficient. L’image correspond alors mieux à la consigne, au prix d’une moindre variété.
- Diffusion latente. La diffusion se déroule dans le petit espace latent d’un autoencodeur, pas dans les pixels — voir la partie sur les VAE. Grâce à cela, Stable Diffusion (2022) tourne même sur une carte graphique de jeu.
- Moins de pas. De meilleurs échantillonneurs et la distillation (un réseau apprend à imiter de nombreux pas en un seul ou en quelques-uns) ont réduit la génération de centaines de pas à quelques unités.
ε̃ = εθ(xt, t, ∅) + w · (εθ(xt, t, c) − εθ(xt, t, ∅))
- εθ(…, ∅)
- l’estimation du bruit sans description (condition vide ∅) — « à quoi ressemble une image quelconque » ; le réseau l’apprend parce que, pendant l’apprentissage, la description est de temps en temps supprimée au hasard
- εθ(…, c) − εθ(…, ∅)
- de combien l’estimation change quand le réseau connaît la description — la direction dans laquelle la description tire l’image
- w
- force du guidage : w = 0 ignore la description, w = 1 est un modèle conditionnel ordinaire, w > 1 exagère l’influence de la description — l’image correspond mieux à la consigne, mais les échantillons se ressemblent davantage
7. Résumé
- Le processus direct ajoute progressivement du bruit ; on peut sauter à n’importe quel pas avec la formule √ᾱ x₀ + √(1 − ᾱ) ε.
- Le réseau apprend à estimer le bruit ajouté — une simple régression. La génération remonte à partir du bruit pur.
- Sur huit amas, la diffusion les a tous couverts en une seule exécution (DDIM à 50 pas 79 %) ; le GAN seulement dans une exécution sur quatre.
- Moins de pas (DDIM) accélère l’échantillonnage ; avec 10 pas la qualité est de 70 %, avec 2 pas elle s’effondre.
- Sur les chiffres, la diffusion couvre tous les chiffres et reste en retrait en netteté avec notre petit réseau ; mais elle s’améliore régulièrement avec le calcul.
Envie d’essayer par vous-même ? Demandez à un agent IA d’entraîner un petit DDPM sur des données en deux dimensions (par exemple des points dessinant vos initiales) et de tracer comment les points s’assemblent en lettres pendant le processus inverse.
Vous voyez les choses autrement ? Écrivez à support@coden-app.com.