{"id":9628,"date":"2023-01-13T17:02:20","date_gmt":"2023-01-13T16:02:20","guid":{"rendered":"https:\/\/scienceetonnante.com\/?p=9628"},"modified":"2023-01-13T17:02:23","modified_gmt":"2023-01-13T16:02:23","slug":"stable-diffusion","status":"publish","type":"post","link":"https:\/\/scienceetonnante.com\/blog\/2023\/01\/13\/stable-diffusion\/","title":{"rendered":"IA g\u00e9n\u00e9ratives et m\u00e9thodes de diffusion"},"content":{"rendered":"<p>La vid\u00e9o du jour explique quelques principes derri\u00e8re les algorithmes d&rsquo;IA g\u00e9n\u00e9rative qui fonctionnent selon les m\u00e9thodes de diffusion.<\/p>\n<p><iframe title=\"Comment ces IA inventent-elles des images ?\" width=\"770\" height=\"433\" data-src=\"https:\/\/www.youtube.com\/embed\/tdelUss-5hY?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" allowfullscreen src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" class=\"lazyload\" data-load-mode=\"1\"><\/iframe><\/p>\n<p>Pour commencer, quelques r\u00e9f\u00e9rences importantes sur le sujet. Tout d&rsquo;abord l&rsquo;article qui pour la premi\u00e8re fois a propos\u00e9 les m\u00e9thodes de diffusion<\/p>\n<p><em>Sohl-Dickstein, J., Weiss, E., Maheswaranathan, N., &amp; Ganguli, S. (2015, June). <a href=\"http:\/\/proceedings.mlr.press\/v37\/sohl-dickstein15.pdf\" target=\"_blank\" rel=\"noopener\">Deep unsupervised learning using nonequilibrium thermodynamics<\/a>. In International Conference on Machine Learning (pp. 2256-2265). PMLR.<\/em><\/p>\n<p>Le papier qui a d\u00e9mocratis\u00e9 leur usage pour la g\u00e9n\u00e9ration d&rsquo;image<\/p>\n<p><em>Ho, J., Jain, A., &amp; Abbeel, P. (2020). <a href=\"https:\/\/proceedings.neurips.cc\/paper\/2020\/file\/4c5bcfec8584af0d967f1ab10179ca4b-Paper.pdf\" target=\"_blank\" rel=\"noopener\">Denoising diffusion probabilistic models<\/a>. Advances in Neural Information Processing Systems, 33, 6840-6851.<\/em><\/p>\n<p>Et enfin plus r\u00e9cent, le papier derri\u00e8re Stable Diffusion<\/p>\n<p><em>Rombach, R., Blattmann, A., Lorenz, D., Esser, P., &amp; Ommer, B. (2022). <a href=\"https:\/\/openaccess.thecvf.com\/content\/CVPR2022\/papers\/Rombach_High-Resolution_Image_Synthesis_With_Latent_Diffusion_Models_CVPR_2022_paper.pdf\" target=\"_blank\" rel=\"noopener\">High-resolution image synthesis with latent diffusion models<\/a>. In Proceedings of the IEEE\/CVF Conference on Computer Vision and Pattern Recognition (pp. 10684-10695).<\/em><\/p>\n<p>avec en particulier le conditionnement par une classe ou l&#8217;embedding d&rsquo;un texte.<\/p>\n<p>Sur la fa\u00e7on dont les m\u00e9thodes de diffusion se comparent \u00e0 d&rsquo;autres, <a href=\"https:\/\/nvlabs.github.io\/denoising-diffusion-gan\/\" target=\"_blank\" rel=\"noopener\">ce papier de NVIDIA<\/a>\u00a0pr\u00e9sente un graphique sous forme de \u00ab\u00a0trilemme\u00a0\u00bb<\/p>\n<p><img decoding=\"async\" class=\"aligncenter wp-image-9629 lazyload\" data-src=\"https:\/\/scienceetonnante.com\/blog\/wp-content\/uploads\/2023\/01\/Capture-decran-2023-01-08-a-09.55.08.png\" alt=\"\" width=\"450\" height=\"453\" data-srcset=\"https:\/\/scienceetonnante.com\/blog\/wp-content\/uploads\/2023\/01\/Capture-decran-2023-01-08-a-09.55.08.png 936w, https:\/\/scienceetonnante.com\/blog\/wp-content\/uploads\/2023\/01\/Capture-decran-2023-01-08-a-09.55.08-298x300.png 298w, https:\/\/scienceetonnante.com\/blog\/wp-content\/uploads\/2023\/01\/Capture-decran-2023-01-08-a-09.55.08-150x150.png 150w\" data-sizes=\"(max-width: 450px) 100vw, 450px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 450px; --smush-placeholder-aspect-ratio: 450\/453;\" \/>Une des force de Stable Diffusion est d&rsquo;avoir r\u00e9ussi \u00e0 obtenir la rapidit\u00e9 d&rsquo;\u00e9chantillonage qui manquait aux mod\u00e8les de diffusion, notamment gr\u00e2ce \u00e0 une astuce : <strong>r\u00e9aliser le d\u00e9bruitage dans un \u00ab\u00a0espace latent\u00a0\u00bb<\/strong>.<\/p>\n<h3>Diffusion dans l&rsquo;espace latent<\/h3>\n<p>Voici en gros l&rsquo;id\u00e9e : si on veut des images de r\u00e9solution raisonnable (disons 512&#215;512), le processus d&rsquo;\u00e9chantillonage d&rsquo;un mod\u00e8le de diffusion classique prend du temps. La solution qu&rsquo;ils ont imagin\u00e9 est de faire \u00e7a sur une version \u00ab\u00a0compress\u00e9e\u00a0\u00bb de l&rsquo;image. On prend un bruit de 64&#215;64, on r\u00e9alise le d\u00e9bruitage, puis on \u00ab\u00a0upscale\u00a0\u00bb l&rsquo;image d&rsquo;un facteur 8 dans chaque dimension pour arriver sur 512&#215;512. Evidemment pour que \u00e7a marche, il faut avoir entrain\u00e9 l&rsquo;algorithme de d\u00e9bruitage sur des version compress\u00e9es des images de la base de donn\u00e9es.<\/p>\n<p>A ce stade, on pourrait penser que ce que j&rsquo;appelle \u00ab\u00a0compression\u00a0\u00bb ou \u00ab\u00a0upscaling\u00a0\u00bb sont juste des redimensionnements simples des images. Mais non, l&rsquo;id\u00e9e est de les compresser dans un \u00ab\u00a0espace latent\u00a0\u00bb en utilisant un auto-encodeur variationnel (VAE). Il s&rsquo;agit d&rsquo;une famille d&rsquo;algorithmes qui (en gros) compressent intelligemment des donn\u00e9es en apprenant une repr\u00e9sentation dans espace latent de plus faible dimension : je vous recommande <a href=\"https:\/\/towardsdatascience.com\/understanding-variational-autoencoders-vaes-f70510919f73\" target=\"_blank\" rel=\"noopener\">cet excellent billet de Joseph Rocca<\/a> sur le sujet).<\/p>\n<p>Donc si on dispose d&rsquo;un tel VAE entrain\u00e9 sur les images de la base, on proc\u00e8de de la fa\u00e7on suivante : on encode les images, on entraine l&rsquo;algorithme de d\u00e9bruitage sur les repr\u00e9sentations encod\u00e9es. Et quand on produit une image par d\u00e9bruitage, on la produit \u00ab\u00a0dans l&rsquo;espace latent\u00a0\u00bb, et \u00e0 la fin on n&rsquo;a plus qu&rsquo;\u00e0 la d\u00e9coder.<\/p>\n<p>C&rsquo;est notamment cette \u00e9tape de d\u00e9codage qui explique que quand on utilise Stable Diffusion et qu&rsquo;on s&rsquo;amuse \u00e0 regarder les \u00e9tapes interm\u00e9diaires (quand tout le bruit n&rsquo;a pas \u00e9t\u00e9 encore retir\u00e9), on voit des images dont le \u00ab\u00a0bruitage\u00a0\u00bb ne ressemble pas \u00e0 celui que j&rsquo;ai repr\u00e9sent\u00e9 dans ma vid\u00e9o, mais plut\u00f4t \u00e0 \u00e7a :<\/p>\n<p><img decoding=\"async\" class=\"aligncenter size-full wp-image-9630 lazyload\" data-src=\"https:\/\/scienceetonnante.com\/blog\/wp-content\/uploads\/2023\/01\/Capture-decran-2023-01-13-a-12.02.40.png\" alt=\"\" width=\"464\" height=\"437\" data-srcset=\"https:\/\/scienceetonnante.com\/blog\/wp-content\/uploads\/2023\/01\/Capture-decran-2023-01-13-a-12.02.40.png 464w, https:\/\/scienceetonnante.com\/blog\/wp-content\/uploads\/2023\/01\/Capture-decran-2023-01-13-a-12.02.40-300x283.png 300w\" data-sizes=\"(max-width: 464px) 100vw, 464px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 464px; --smush-placeholder-aspect-ratio: 464\/437;\" \/>qui est en gros un bruit gaussien de l&rsquo;espace latent (64&#215;64) qui a \u00e9t\u00e9 upscal\u00e9 par le decodeur du VAE pour produire une image 512&#215;512.<\/p>\n<p>Concernant DALL\u00b7E, je crois comprendre que la premi\u00e8re version n&rsquo;utilisait pas les algorithmes de diffusion (et marchait moyennement d&rsquo;ailleurs), tandis que <a href=\"https:\/\/arxiv.org\/abs\/2204.06125\" target=\"_blank\" rel=\"noopener\">DALL\u00b7E 2 est pass\u00e9 aux algos de diffusion<\/a>, mais (si je comprends bien) sans le trick de faire la diffusion dans un espace latent obtenu par VAE.<\/p>\n<p>D&rsquo;ailleurs Stable Diffusion comme DALL\u00b7E 2 utilisent tous les deux le mod\u00e8le CLIP d&rsquo;OpenAi pour r\u00e9aliser l&#8217;embedding dont je parlais dans la vid\u00e9o.<\/p>\n<h3>D\u00e9bruitage et UNet<\/h3>\n<p>Je n&rsquo;ai pas pr\u00e9cis\u00e9 dans ma vid\u00e9o quelle type d&rsquo;architecture de r\u00e9seau on utilise pour r\u00e9aliser le d\u00e9bruitage. Vous savez peut-\u00eatre qu&rsquo;en <em>computer vision<\/em> on utilise les fameux r\u00e9seaux de convolution, notamment popularis\u00e9s par Yann LeCun. Mais pour r\u00e9aliser \u00e7a, on a un r\u00e9seau qui prend plein de pixels en entr\u00e9e et donne en sortie une quantit\u00e9 limit\u00e9e de nombres (par exemple la probabilit\u00e9 estim\u00e9e pour chacune des 1000 classes pr\u00e9d\u00e9finies). Les filtres de convolution permettent notamment de synth\u00e9tiser les informations spatiales afin d&rsquo;en extraire des informations s\u00e9mantiques.<\/p>\n<p>Pour faire du d\u00e9bruitage, on prend en entr\u00e9e une image, et on doit avoir en sortie une image de la m\u00eame r\u00e9solution. Pour cela, on utilise une architecture qui a notamment \u00e9t\u00e9 invent\u00e9e pour les questions de traitement et segmentation des images m\u00e9dicales : l&rsquo;architecture \u00ab\u00a0U-Net\u00a0\u00bb.<\/p>\n<p><img decoding=\"async\" class=\"aligncenter size-large wp-image-9631 lazyload\" data-src=\"https:\/\/scienceetonnante.com\/blog\/wp-content\/uploads\/2023\/01\/u-net-architecture-1024x682.png\" alt=\"\" width=\"770\" height=\"513\" data-srcset=\"https:\/\/scienceetonnante.com\/blog\/wp-content\/uploads\/2023\/01\/u-net-architecture-1024x682.png 1024w, https:\/\/scienceetonnante.com\/blog\/wp-content\/uploads\/2023\/01\/u-net-architecture-300x200.png 300w, https:\/\/scienceetonnante.com\/blog\/wp-content\/uploads\/2023\/01\/u-net-architecture-1536x1023.png 1536w, https:\/\/scienceetonnante.com\/blog\/wp-content\/uploads\/2023\/01\/u-net-architecture-270x180.png 270w, https:\/\/scienceetonnante.com\/blog\/wp-content\/uploads\/2023\/01\/u-net-architecture.png 1555w\" data-sizes=\"(max-width: 770px) 100vw, 770px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 770px; --smush-placeholder-aspect-ratio: 770\/513;\" \/>L&rsquo;id\u00e9e est de commencer classiquement par enchainer des filtres de convolution et de pooling pour r\u00e9duire la dimension en augmentant le nombre de canaux, puis de refaire ensuite le chemin dans l&rsquo;autre sens pour remonter \u00e0 une image de m\u00eame dimensions initiales. La subtilit\u00e9 \u00e9tant que dans cette \u00e9tape de remont\u00e9e, on fournit au r\u00e9seau les \u00e9tapes interm\u00e9diaires qu&rsquo;on avait dans la descente (ce sont les fl\u00e8ches grises horizontales qui repr\u00e9sentent \u00e7a sur le sch\u00e9ma).<\/p>\n<h3>Samplers et scheduling<\/h3>\n<p>Si vous avez un peu jou\u00e9 avec Stable Diffusion ou certaines des API qui sont propos\u00e9es, vous aurez not\u00e9 que les algorithmes proposent plusieurs samplers\/scheduler. Il s&rsquo;agit de diff\u00e9rente mani\u00e8re de r\u00e9aliser le d\u00e9bruitage \u00e0 partir d&rsquo;un m\u00eame r\u00e9seau de d\u00e9bruitage. Notamment on peut d\u00e9cider du rythme de d\u00e9bruitage. Dans la vid\u00e9o j&rsquo;ai fait comme si on retirait 5% de bruit \u00e0 chaque fois pour faire le d\u00e9bruitage en 20 \u00e9tapes. Mais d&rsquo;une part on peut choisir le nombre d&rsquo;\u00e9tapes, d&rsquo;autre part on est pas oblig\u00e9 d&rsquo;adopter un rythme lin\u00e9aire. \u00a0Donc le \u00ab\u00a0scheduling\u00a0\u00bb du d\u00e9bruitage peut varier, et apparemment certains fonctionnent mieux que d&rsquo;autres, que ce soit en qualit\u00e9 ou en rapidit\u00e9.<\/p>\n<h3>Inpainting, super-resolution<\/h3>\n<p>Parmis les usages possibles des mod\u00e8les de diffusion entrain\u00e9s, il y a la possibilit\u00e9 de faire de l&rsquo;inpainting, donc de laisser l&rsquo;algorithme remplir certaines parties de l&rsquo;image, par exemple apr\u00e8s avoir effac\u00e9 quelque chose<\/p>\n<p><img decoding=\"async\" class=\"aligncenter size-large wp-image-9634 lazyload\" data-src=\"https:\/\/scienceetonnante.com\/blog\/wp-content\/uploads\/2023\/01\/Capture-decran-2023-01-13-a-12.26.28-1024x498.png\" alt=\"\" width=\"770\" height=\"374\" data-srcset=\"https:\/\/scienceetonnante.com\/blog\/wp-content\/uploads\/2023\/01\/Capture-decran-2023-01-13-a-12.26.28-1024x498.png 1024w, https:\/\/scienceetonnante.com\/blog\/wp-content\/uploads\/2023\/01\/Capture-decran-2023-01-13-a-12.26.28-300x146.png 300w, https:\/\/scienceetonnante.com\/blog\/wp-content\/uploads\/2023\/01\/Capture-decran-2023-01-13-a-12.26.28.png 1040w\" data-sizes=\"(max-width: 770px) 100vw, 770px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 770px; --smush-placeholder-aspect-ratio: 770\/374;\" \/><\/p>\n<p>ou encore de fournir une sorte d&rsquo;esquisse et de demander \u00e0 l&rsquo;algorithme de la remplir, ci-desous un exemple pour de la g\u00e9n\u00e9ration de paysages.<\/p>\n<p><img decoding=\"async\" class=\"aligncenter size-large wp-image-9635 lazyload\" data-src=\"https:\/\/scienceetonnante.com\/blog\/wp-content\/uploads\/2023\/01\/Capture-decran-2023-01-13-a-12.26.47-1024x571.png\" alt=\"\" width=\"770\" height=\"429\" data-srcset=\"https:\/\/scienceetonnante.com\/blog\/wp-content\/uploads\/2023\/01\/Capture-decran-2023-01-13-a-12.26.47-1024x571.png 1024w, https:\/\/scienceetonnante.com\/blog\/wp-content\/uploads\/2023\/01\/Capture-decran-2023-01-13-a-12.26.47-300x167.png 300w, https:\/\/scienceetonnante.com\/blog\/wp-content\/uploads\/2023\/01\/Capture-decran-2023-01-13-a-12.26.47.png 1112w\" data-sizes=\"(max-width: 770px) 100vw, 770px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 770px; --smush-placeholder-aspect-ratio: 770\/429;\" \/><\/p>\n<p>Dans les deux cas, cela fonctionne toujours selon le principe du d\u00e9bruitage avec conditionnement. On part d&rsquo;un bruit, et on va le d\u00e9bruiter on conditionnant avec une image qui sert de r\u00e9f\u00e9rence.<\/p>\n<p>A noter qu&rsquo;on peut aussi utiliser les mod\u00e8les de diffusion pour faire de l&rsquo;interpolation entre deux images dans leur repr\u00e9sentation \u00ab\u00a0diffus\u00e9e\u00a0\u00bb, qu&rsquo;on ram\u00e8ne ensuite dans leur repr\u00e9sentation d&rsquo;origine.<img decoding=\"async\" class=\"aligncenter size-large wp-image-9638 lazyload\" data-src=\"https:\/\/scienceetonnante.com\/blog\/wp-content\/uploads\/2023\/01\/Capture-decran-2023-01-12-a-09.45.45-1024x269.png\" alt=\"\" width=\"770\" height=\"202\" data-srcset=\"https:\/\/scienceetonnante.com\/blog\/wp-content\/uploads\/2023\/01\/Capture-decran-2023-01-12-a-09.45.45-1024x269.png 1024w, https:\/\/scienceetonnante.com\/blog\/wp-content\/uploads\/2023\/01\/Capture-decran-2023-01-12-a-09.45.45-300x79.png 300w, https:\/\/scienceetonnante.com\/blog\/wp-content\/uploads\/2023\/01\/Capture-decran-2023-01-12-a-09.45.45-1536x403.png 1536w\" data-sizes=\"(max-width: 770px) 100vw, 770px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 770px; --smush-placeholder-aspect-ratio: 770\/202;\" \/><\/p>\n","protected":false},"excerpt":{"rendered":"<p>La vid\u00e9o du jour explique quelques principes derri\u00e8re les algorithmes d&rsquo;IA g\u00e9n\u00e9rative qui fonctionnent selon les m\u00e9thodes de diffusion. Pour commencer, quelques r\u00e9f\u00e9rences importantes sur le sujet. Tout d&rsquo;abord l&rsquo;article qui pour la premi\u00e8re fois a propos\u00e9 les m\u00e9thodes de diffusion Sohl-Dickstein, J., Weiss, E., Maheswaranathan, N., &amp; Ganguli, S. (2015, June). Deep unsupervised learning<\/p>\n","protected":false},"author":1,"featured_media":9639,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[45,4],"tags":[113],"class_list":{"0":"post-9628","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","7":"category-informatique","8":"category-mathematiques","9":"tag-intelligence-artificielle"},"jetpack_featured_media_url":"https:\/\/scienceetonnante.com\/blog\/wp-content\/uploads\/2023\/01\/07-hallucination-7.png","jetpack_sharing_enabled":true,"post_mailing_queue_ids":[],"_links":{"self":[{"href":"https:\/\/scienceetonnante.com\/blog\/wp-json\/wp\/v2\/posts\/9628","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/scienceetonnante.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/scienceetonnante.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/scienceetonnante.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/scienceetonnante.com\/blog\/wp-json\/wp\/v2\/comments?post=9628"}],"version-history":[{"count":6,"href":"https:\/\/scienceetonnante.com\/blog\/wp-json\/wp\/v2\/posts\/9628\/revisions"}],"predecessor-version":[{"id":9641,"href":"https:\/\/scienceetonnante.com\/blog\/wp-json\/wp\/v2\/posts\/9628\/revisions\/9641"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/scienceetonnante.com\/blog\/wp-json\/wp\/v2\/media\/9639"}],"wp:attachment":[{"href":"https:\/\/scienceetonnante.com\/blog\/wp-json\/wp\/v2\/media?parent=9628"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/scienceetonnante.com\/blog\/wp-json\/wp\/v2\/categories?post=9628"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/scienceetonnante.com\/blog\/wp-json\/wp\/v2\/tags?post=9628"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}