Quatre façons de générer

Le chapitre « Générer : imiter une distribution » a posé le problème. Un modèle génératif doit apprendre la distribution de données très complexes, comme des photos de visages, puis y tirer de nouveaux exemples. Pour des images, cette distribution occupe une portion infime d’un espace immense, et on ne peut pas la décrire en additionnant des cloches.

Depuis le début des années 2010, quatre familles de méthodes ont été proposées pour résoudre ce problème. Chacune repose sur une idée différente, et chacune a produit des systèmes marquants. Ce chapitre les présente l’une après l’autre, avec leurs forces et leurs limites. Les quatre utilisent des réseaux de neurones, et toutes s’entraînent par rétropropagation, comme les réseaux du Module 3.

Le faussaire et l’expert : les réseaux antagonistes génératifs

En 2014, Ian Goodfellow, alors doctorant à l’Université de Montréal dans le laboratoire de Yoshua Bengio, propose une idée nouvelle avec ses collègues, les réseaux antagonistes génératifs (generative adversarial networks, GAN). Elle est issue de l’école canadienne de l’apprentissage profond présentée au Module 3.

Un GAN fait travailler deux réseaux l’un contre l’autre.

  • Le générateur joue le rôle d’un faussaire. Il reçoit quelques nombres tirés au hasard, et il en fait une image.
  • Le discriminateur joue le rôle d’un expert. Il reçoit une image, tantôt une vraie, tantôt une fausse produite par le générateur, et il doit dire laquelle c’est.

Les deux réseaux s’entraînent ensemble. Chaque fois que l’expert se trompe, il ajuste ses poids pour mieux distinguer les vraies images des fausses. Chaque fois que l’expert démasque une fausse image, le faussaire ajuste ses poids pour que ses prochaines images trompent mieux l’expert. Au fil de l’entraînement, l’expert devient plus exigeant, et le faussaire doit produire des images de plus en plus réalistes pour le tromper. À la fin, on garde le faussaire.

Cette mise en scène vient de la théorie des jeux (game theory), fondée par John von Neumann entre la fin des années 1920 et les années 1940, qui étudie les situations où des joueurs ont des intérêts opposés. L’article de 2014 décrit l’entraînement d’un GAN comme un jeu à deux joueurs à somme nulle (zero-sum game) : ce que l’un gagne, l’autre le perd. L’expert cherche à maximiser ses bonnes réponses, et le faussaire cherche à les minimiser. C’est le principe du minimax des programmes d’échecs du Module 1, appliqué à des poids qu’on ajuste plutôt qu’à des coups qu’on explore. La formule qui signe le Portrait d’Edmond de Belamy, à l’accueil de ce module, est celle de ce jeu : on y lit « min » sous G, le générateur, et « max » sous D, le discriminateur.

Ce jeu a une issue idéale, un équilibre de Nash (Nash equilibrium), du nom du mathématicien John Nash. C’est une situation où aucun joueur ne peut améliorer son sort en changeant seul de stratégie. Pour un GAN, l’équilibre est atteint quand le faussaire imite parfaitement la distribution des vraies images. L’expert ne peut alors faire mieux que répondre au hasard, et il se trompe une fois sur deux.

Le discriminateur est un classificateur discriminatif, au sens du chapitre « Classer » du Module 2. Il trace une frontière entre les vraies images et les fausses. Un GAN utilise donc un modèle discriminatif pour entraîner un modèle génératif.

Les GAN ont dominé la génération d’images pendant plusieurs années, des visages flous de 2014 aux visages photoréalistes de StyleGAN en 2019, une progression que retrace le chapitre « Des images, des voix, des vidéos ». Ils ont cependant deux défauts.

  • Leur entraînement est instable. Les deux réseaux doivent progresser au même rythme. Si l’expert devient trop fort trop vite, le faussaire ne reçoit plus d’indication utile et cesse de progresser. Chercher l’équilibre d’un jeu est plus délicat que descendre une pente : chaque pas de l’un des joueurs change le relief sur lequel l’autre avance.
  • Le faussaire peut se contenter de produire quelques images qui trompent bien l’expert, plutôt que toute la diversité des données. Un GAN entraîné sur des chiffres peut ainsi ne produire que des 1 et des 7. Ce défaut s’appelle l’effondrement des modes (mode collapse).

Remplir l’espace latent : les autoencodeurs variationnels

L’applet du chapitre précédent utilise un autoencodeur variationnel (variational autoencoder, VAE), proposé en 2013 par Diederik Kingma et Max Welling, à l’Université d’Amsterdam. Comme l’autoencodeur du Module 3, c’est un réseau en sablier, avec un encodeur et un décodeur.

À quoi sert l’espace latent. Le chapitre « Générer : imiter une distribution » a présenté l’espace latent : l’encodeur réduit une image, 784 nombres pour un chiffre manuscrit, à un point d’une carte de quelques dimensions, deux dans l’applet, et le décodeur fait l’inverse, d’un point de la carte à une image. Pour générer, on se passe de l’encodeur, on choisit un point au hasard sur la carte, et le décodeur en fait une image nouvelle. Toute la question est de savoir où tirer ce point.

Le problème de l’autoencodeur ordinaire. Un autoencodeur ordinaire n’a appris qu’une chose : reconstruire les images qu’on lui a montrées. Son encodeur calcule pour chaque image des coordonnées qui permettent de la reconstruire, et rien de plus. Aucune règle ne fixe l’étendue de la carte ni la façon d’en occuper l’espace. Deux défauts en résultent.

  • On ne sait pas où est la carte. Les points peuvent occuper n’importe quelle étendue, par exemple des coordonnées allant de −3 à 2 sur un axe et de 10 à 250 sur l’autre. Pour tirer un point au hasard, il faudrait d’abord connaître ces limites.
  • La carte a des trous. Entre les points des images d’entraînement, il reste des zones où le décodeur n’a jamais été exercé. Un point tiré dans un tel trou donne une image qui ne ressemble à rien.

Tirer un point au hasard dans cette carte, c’est un peu comme lancer une fléchette les yeux bandés sur une carte du monde dont on ignore les bords, couverte d’océans : on tombe rarement sur une ville.

Les deux remèdes du VAE. Le VAE ajoute deux règles à l’entraînement, une contre chaque défaut.

  1. Contre les trous : des zones plutôt que des points. L’encodeur ne place plus chaque image en un point précis, mais dans une petite zone floue autour de ce point. Pendant l’entraînement, le décodeur reçoit un point tiré au hasard dans cette zone, et doit quand même reconstruire l’image. Il apprend ainsi à produire une image correcte dans tout le voisinage de chaque point. Les zones voisines se chevauchent et bouchent les trous.
  2. Contre l’étendue inconnue : une pénalité. Une pénalité ajoutée à l’erreur augmente quand une zone s’éloigne du centre de la carte, le point (0, 0), ou devient trop petite. Toutes les zones sont donc ramenées dans un même disque autour du centre, de taille connue à l’avance. Le centre n’a rien de particulier en lui-même : c’est un rendez-vous convenu. Ce qui compte, c’est qu’on sache d’avance où se trouvent les images.

Les deux forces s’équilibrent. L’erreur de reconstruction pousse les zones à rester distinctes, pour que chaque image soit bien reconstruite. La pénalité les rassemble autour du centre. Le résultat est une carte serrée, sans trous, dont on connaît la forme : une cloche centrée sur l’origine. Pour générer, il suffit de tirer un point dans cette cloche, comme on lancerait la fléchette sur une carte où chaque endroit est une ville.

La figure ci-dessous compare deux réseaux entraînés sur les mêmes chiffres de MNIST, un autoencodeur ordinaire et le VAE de l’applet du chapitre précédent. Dans chaque carte, dix points ont été tirés selon la même règle, puis décodés en chiffres.

Cette règle de tirage est la suivante. Chacun des deux nombres du code est tiré au hasard selon une courbe en cloche centrée sur zéro, la gaussienne du Module 2. Les valeurs proches de zéro sont les plus fréquentes, et les valeurs qui dépassent 2 ou −2 sont rares. Sur la carte, qui a deux dimensions, cette cloche devient une colline ronde, la plus haute au centre, le point (0, 0). Les points tirés s’y entassent près du centre, et se raréfient à mesure qu’on s’en éloigne. Le cercle noir de la figure entoure la zone où tombent 95 % des tirages : c’est là que le décodeur ira chercher ses points. C’est aussi la région que la pénalité du VAE pousse ses chiffres à occuper.

L’autoencodeur ordinaire a rangé ses chiffres n’importe où, sur une très grande surface. Le cercle de tirage n’en couvre qu’un petit coin, et les chiffres produits se ressemblent tous. Il faudrait connaître la forme exacte de sa carte pour savoir où tirer. Le VAE, lui, a rangé ses chiffres là où l’on tire.

Les VAE s’entraînent de façon stable, et leur espace latent est bien organisé. Leur défaut principal se voit dans l’applet du chapitre précédent : leurs images sont floues. Quand le décodeur hésite entre plusieurs images possibles, il produit une moyenne de ces images, et une moyenne d’images est floue.

Retirer le bruit pas à pas : la diffusion

La troisième famille part d’une observation simple. Il est facile de détruire une image : il suffit de lui ajouter un peu de bruit, puis encore un peu, des centaines de fois, jusqu’à ce qu’il ne reste qu’une neige où l’image d’origine a disparu. Cette destruction ne demande aucun apprentissage. Un modèle de diffusion (diffusion model) apprend l’opération inverse, c’est-à-dire retirer un peu de bruit à la fois.

L’entraînement se fait ainsi. On prend une image du jeu de données, on la brouille jusqu’à une étape choisie au hasard, et on demande au réseau d’estimer le bruit qui a été ajouté. Comme on a soi-même ajouté ce bruit, on connaît la bonne réponse : c’est un cas d’auto-supervision, comme l’autoencodeur. Le réseau qui estime le bruit est le plus souvent un U-Net, le réseau convolutif présenté au Module 3, et plus récemment un Transformer.

Pour générer une image, on part d’une neige nouvelle, tirée au hasard. Le réseau estime le bruit qu’elle contient, et on en retire une petite partie. On recommence avec l’image obtenue, des dizaines ou des centaines de fois. À chaque étape, une forme se précise, et à la fin il reste une image nette, que personne n’a jamais vue.

L’applet ci-dessous montre un modèle de diffusion entraîné sur des données beaucoup plus simples que des images. Chaque exemple n’est qu’un point du plan, et les exemples d’entraînement sont des milliers de points tirés dans la feuille d’érable du drapeau du Canada. Le principe est exactement le même que pour des images de millions de pixels.

Quelques manipulations à faire :

  1. Cliquez sur « Brouiller la feuille ». Les points s’écartent de la feuille, étape par étape, jusqu’à former un nuage informe. Les six points suivis font chacun une marche au hasard.
  2. Cliquez sur « Générer de nouveaux points ». Un nouveau nuage est tiré au hasard, puis le réseau le ramène, étape par étape, vers la forme qu’il a apprise.
  3. Une fois la génération terminée, déplacez le curseur de l’étape 100 à l’étape 0. La forme n’apparaît pas d’un coup : elle se dessine d’abord dans ses grandes lignes, puis dans ses détails, comme les pointes de la feuille.
  4. Décochez « Afficher le contour de la feuille ». Le réseau n’a jamais vu ce contour, seulement des points. Les points générés sont nouveaux : aucun n’est la copie d’un point d’entraînement.

L’idée de la diffusion a été publiée en 2015 par Jascha Sohl-Dickstein et ses collègues, à l’Université Stanford, qui s’inspiraient de la thermodynamique. Elle est devenue efficace en 2020, avec les travaux de Jonathan Ho, Ajay Jain et Pieter Abbeel, à l’Université de Californie à Berkeley. À partir de 2021, les modèles de diffusion ont dépassé les GAN, comme l’ont montré cette année-là Prafulla Dhariwal et Alex Nichol, d’OpenAI. En 2022, ils s’imposent avec DALL·E 2 (OpenAI) et Stable Diffusion (Stability AI et l’Université de Munich), qui produisent des images à partir d’une phrase. Midjourney, très populaire auprès du public, reposerait sur le même principe, bien que l’entreprise n’ait jamais publié les détails de son modèle. Ils s’entraînent de façon stable, et ils couvrent toute la diversité des données, sans effondrement des modes. Leur défaut est la lenteur, puisqu’une image demande de nombreux passages dans le réseau, là où un GAN n’en demande qu’un. Une grande partie de la recherche récente vise à réduire ce nombre d’étapes.

Un élément après l’autre : les modèles autorégressifs

La quatrième famille découpe une donnée en éléments, et les génère un par un, dans un ordre fixé. Chaque élément est tiré au hasard dans une distribution qui dépend de tous les éléments déjà produits. On appelle ces modèles autorégressifs (autoregressive models), parce que chaque élément est prédit à partir des éléments précédents de la même donnée.

  • Pour une image, on peut générer les pixels un par un, ligne par ligne. Chaque pixel est tiré en tenant compte de tous les pixels déjà placés au-dessus et à gauche. C’est ce que fait PixelCNN, publié par DeepMind en 2016.
  • Pour un son, on peut générer les échantillons sonores un par un, à raison de plusieurs milliers par seconde. C’est ce que fait WaveNet, publié par DeepMind la même année, qui a nettement amélioré la voix des assistants vocaux.
  • Pour un texte, on peut générer les mots un par un. Chaque mot est tiré dans une distribution qui dépend de tous les mots déjà écrits.

Cette dernière application est la plus importante. Le texte se prête naturellement à cette méthode, puisqu’il se lit et s’écrit déjà dans un ordre, un mot après l’autre. Les grands modèles de langage comme ceux de ChatGPT sont des modèles autorégressifs. Ils tirent chaque mot dans une distribution, avec la température présentée au chapitre précédent. Le reste du module leur est consacré, à partir du chapitre « Des règles aux probabilités ».

Les modèles autorégressifs s’entraînent de façon stable, et la probabilité qu’ils attribuent à chaque élément est calculée explicitement, ce qui permet de mesurer précisément leur qualité. Leur défaut est le même que celui de la diffusion, en plus marqué : générer élément par élément est lent, et une image de quelques millions de pixels demanderait autant de passages dans le réseau. C’est pourquoi la génération pixel par pixel a été abandonnée. La méthode est cependant revenue pour les images sous une autre forme. L’image est d’abord compressée en une courte suite de codes, des jetons visuels, et un modèle autorégressif génère ces jetons un par un, comme les mots d’un texte. C’est ce que fait DALL·E, d’OpenAI, en 2021, avec environ un millier de jetons par image, et c’est ainsi que des modèles multimodaux récents produisent des images, comme le montre le chapitre « Des modèles qui voient, entendent et parlent ».

Générer sur demande

Les modèles présentés jusqu’ici génèrent un exemple quelconque de la distribution : un visage, un chiffre, une feuille. On veut souvent davantage, et préciser ce qu’on veut obtenir, comme « un 7 », « un visage souriant » ou « un chat sur la lune ».

Les quatre familles le permettent. On donne au réseau, en plus du hasard, une information supplémentaire qu’il prend en compte à chaque étape : une étiquette, une image de départ, ou une phrase. On parle de génération conditionnelle (conditional generation). Un générateur d’images à partir de texte, comme DALL·E 2 ou Stable Diffusion, est un modèle de diffusion conditionné par une phrase. Pour cela, il faut traduire la phrase en nombres que le réseau comprend, ce qui demande de savoir représenter le sens d’un texte. Le chapitre « Relier les mots et les images » y reviendra, une fois présentés les modèles de langage.

Le rôle du hasard. Un réseau de neurones est une fonction : pour une même entrée, il donne toujours la même sortie. Sans hasard, la consigne « 7 » donnerait donc toujours exactement le même 7. Or il existe une infinité de façons d’écrire un 7, plus ou moins penché, épais ou large. Générer, c’est tirer au hasard l’une de ces façons. Le hasard est ce tirage : quelques nombres choisis au hasard, que le générateur reçoit en même temps que la consigne, et qui désignent l’une des façons possibles. La consigne restreint les possibilités (que des 7), le hasard choisit parmi celles qui restent. Dans un VAE, ces nombres sont un point de l’espace latent. Dans un modèle de diffusion, c’est le bruit de départ. Dans un modèle de langage, c’est le tirage de chaque mot.

Les générateurs d’images appellent ce tirage la graine (seed). Avec la même consigne et la même graine, on obtient exactement la même image. Si l’on change seulement la graine, on obtient une autre image qui respecte la même consigne.

La figure suivante montre de près un vrai générateur conditionnel, un VAE entraîné sur les chiffres de MNIST. Son hasard est un tirage de quatre nombres, et sa consigne l’étiquette du chiffre à produire. Chaque colonne de la grille reçoit son propre tirage, et chaque rangée sa propre consigne. La consigne décide quel chiffre est produit. Le hasard décide comment il est écrit : la colonne encadrée reçoit le tirage 2, et ses dix chiffres sont tous droits et d’un trait épais, alors que ceux de la colonne 3 sont penchés et fins.

Quatre familles, et leurs combinaisons

GANVAEDiffusionAutorégressif
Idéeun faussaire contre un expertun espace latent rempliretirer le bruit pas à pasun élément après l’autre
Première publication201420132015 (efficace en 2020)bien plus ancienne pour le texte ; 2016 pour les images et les sons
Points fortsimages nettes, génération rapideentraînement stable, espace latent organiséqualité et diversitéentraînement stable, probabilités explicites
Limitesentraînement instable, effondrement des modesimages flouesgénération lentegénération très lente pixel par pixel
ExemplesStyleGANl’autoencodeur de Stable DiffusionDALL·E 2, Stable DiffusionWaveNet, GPT, DALL·E (2021)

Les systèmes actuels combinent souvent plusieurs de ces idées. Stable Diffusion, par exemple, ne débruite pas directement les pixels. Un autoencodeur réduit d’abord chaque image à une représentation latente beaucoup plus petite, et la diffusion se fait dans cet espace latent, ce qui la rend bien plus rapide. Le décodeur transforme ensuite le résultat en image.

Le chapitre suivant montre ce que ces méthodes ont permis de produire depuis 2014 : des images, des voix, de la musique et des vidéos.