zo maakt AI alles wat je wilt

Inmiddels hebben veel mensen wel iets meegekregen van 'generatieve' AI, waarbij je beelden kunt maken door een tekst in te tikken. De resultaten zijn vaak verbazingwekkend goed. Maar hoe werkt het precies? Tegenlicht legt het uit.

Lotte Schuengel, 26 juni 2023

dit artikel hoort bij het thema de prijs van ai

Levensechte gezichten, taferelen, steden en natuurfoto’s: generatieve AI software kan tegenwoordig echt alles maken wat je maar vraagt. Binnen korte tijd is er een technologie ontstaan die beelden genereert die niet van echt te onderscheiden zijn, maar nooit hebben bestaan. Van Dall-E tot Midjourney tot Stable Diffusion: de bedrijven die deze generatieve AI aanbieden zijn in een space race verwikkeld om steeds betere, hoogwaardige kwaliteit te leveren. Het lijkt wel magie.

Computerwetenschappers slaan misschien wat minder steil in hun stoel achterover. Maar dat is ook meteen het probleem: de mensen die het meest te maken gaan krijgen met generatieve AI, zijn niet per se de mensen die het goed begrijpen. En dat kan nog eens ingewikkeld worden. Want als een technologie bijna niet meer te doorgronden is, hoe kunnen we ervoor zorgen dat we kritisch kunnen blijven en niet bezwijken aan de betovering van het ongrijpbare?

Daarom willen we graag uitleggen hoe die tekst-naar-beeld AI nou precies werkt - tot op de bodem en in klare taal. Om de betovering een beetje te verbreken. Maar ook om te laten zien hoe wonderlijk het is dat we het voor elkaar hebben gekregen een machine te bouwen die creatief is. 

latent space: alles, overal, en alles ertussenin

Iedere vorm van kunstmatige intelligentie is het resultaat van intensieve training. Dat wordt gedaan met datasets. Zo is Dall-E getraind met de LAION-5B dataset. Dat is een verzameling van bijna zes miljard ‘tekst-beeld paren’. Iedere afbeelding is namelijk gelabeld met een passende beschrijving. Op die manier kan de AI beelden categoriseren en van elkaar onderscheiden, en zichzelf trainen op overeenkomende elementen.

Het is logisch dat je in deze database de oorspronkelijke beelden kunt terugvinden, zodra je een zoekopdracht invult. Maar generatieve AI doet meer dan dat. Als je bijvoorbeeld het woord ‘eend’ zoekt, krijg je niet één van de zoveel bestaande plaatjes van eenden uit de dataset. Je krijgt een nieuw plaatje, dat een statistisch gemiddelde is van alle plaatjes van eenden.

Dat lijkt nog makkelijk, want plaatjes van eenden zijn er genoeg om uit te putten. Maar we hebben AI ook de meest bizarre, specifieke dingen zien maken. Dingen die helemaal nooit in de dataset zijn voorgekomen. Waar komen die beelden dan vandaan?

Al die miljarden gelabelde plaatjes die de AI heeft gezien, komen via een encoder - een compressiealgoritme - terecht in de zogeheten ‘latent space’. Daar smelten ze samen tot een ‘brei’ van concepten, beelden en betekenissen. Die zijn gesorteerd op basis van parameters die het algoritme zelf heeft ontwikkeld om dingen van elkaar te onderscheiden. Bijvoorbeeld: 'roodheid', ‘rondheid’, ‘lichtgevendheid’, ‘harigheid’, ‘doorzichtigheid.’ Iedere parameter is eigenlijk een nieuwe as in een enorme, multidimensionale grafiek. 

Zo wordt de data geordend op een manier waarbij de meest vergelijkbare informatie zo dicht mogelijk bij elkaar staat. Dit plaatje hieronder, van David McClure, geeft aan hoe je dat ongeveer voor je moet zien. Zoals je ziet, staan ‘families’ en ‘historische foto’s’ vrij dicht bij elkaar, terwijl ‘celebrities’ en ‘voedsel’ erg ver weg van elkaar staan.

Computerblogger Martin Anderson noemt de latent space in dit stuk het ‘onderbewustzijn’ van een machine learning systeem. Het is de plek waar de AI verbanden legt tussen de aangeleerde datapunten, die hij afleidt uit de informatie die hem wordt gevoerd. Je zou kunnen zeggen dat dit de plek is waar iets gebeurt, dat in de buurt komt van de menselijke processen van ‘begrip’ en ‘associatie’.

Goed, hij heeft dus alle datapunten netjes georganiseerd. Maar het bizarre van de latent space, en waarom ik het een ‘brei’ noem, is dat alle punten tussen de datapunten in, er ook bestaan. Het is namelijk een statistisch model. En waar je binnen een tweedimensionale grafiek ook ieder punt tussen de x- en y- as kunt bedenken, is dat hier niet anders. 

Dat ziet er ongeveer zo uit:

Van één celebrity naar de andere celebrity overvloeien, is nog voorstelbaar. Maar in de latent space is niets te gek. Er bestaat een statistisch datapunt precies in het midden tussen Johnny Depp en een bord pasta. Er bestaat een punt tussen een berggeit en een basketbal. Er bestaat een punt tussen de Rocky Mountains en de Venus van Milo. En tussen die punten in, bestaan ook alle mogelijke combinaties van dingen die je kunt bedenken.

‘Wandelingen’ maken door de latent space, is de nieuwste hobby van AI-fanatici. In dit blog bijvoorbeeld, legt de auteur uit hoe hij in StableDiffusion wandelt van een hond op het strand, via een fruitmand naar de Eiffeltoren in de stijl van Starry Night, en vervolgens een architectonische schets van een wolkenkrabber.

Essentieel om te begrijpen, is dat het de dataset is die uiteindelijk bepaalt hoe die latent space eruitziet, en dus welke beelden hij produceert. De ene dataset leidt tot een ander statistisch gemiddelde dan de andere. Dat hangt niet alleen af van de afbeeldingen en hun kwaliteit, maar ook van de manier waarop ze gelabeld zijn en hoe uitgebreid en correct dat is gedaan. En dus is de wandeling die je door de latent space maakt ook voor iedere dataset anders. MidJourney, bijvoorbeeld, heeft een vrij selectieve dataset die ervoor zorgt dat de afbeeldingen die eruit voortkomen vrij kunstzinnig en soortgelijk eruitzien. Terwijl Dall-E een veel bredere bibliotheek heeft, en haar latent space waarschijnlijk ook meer dimensies.

grote dingen klein maken

Eigenlijk is hierboven nog een veel te visuele weergave van die latent space. Het is goed om het je op deze manier voor te stellen als je wilt snappen waar de AI de beelden ‘bedenkt’ (of eigenlijk afleidt) die je met je prompt oproept. Maar in werkelijkheid bestaat het uit niets anders dan code, die hij vervolgens 'synthetiseert' naar beeld. Hoe werkt dat?

Herinner je je nog hoe de dataset in de latent space terechtkomt? Dat gaat via een encoder, die de afbeeldingen een stuk kleiner maakt. Daarbij gaat geen informatie verloren. Dat komt doordat de AI zo goed is getraind, dat hij bepaalde consequente eigenschappen kan voorspellen. Hij hoeft niet van ieder gezicht individueel te onthouden dat het twee ogen, een neus en een mond heeft. Omdat hij weet dat dit voor (bijna) alle gezichten geldt, kan hij data efficiënt clusteren en accuraat decoderen. 

Zonder die encoder zou de latent space enorm veel energie en geheugen slurpen. In de latent space zweven dus niet daadwerkelijk foto’s van eenden rond, maar een soort pixelige referenties aan foto’s van eenden. De capaciteit om die referenties terug te vertalen naar hoge resolutie, is de drijvende functie achter generatieve AI. En dat is te danken aan het volgende trainingsproces:

voorwaartse en achterwaartse diffusie

We moeten praten over Denoising Diffusion Probabilistic Models. Afgekort: DDPM. Het komt erop neer dat als je een algoritme maar lang genoeg traint om van iets niets te maken, dat hij op een gegeven moment in staat is om het tegenovergestelde te doen.

Zo werkt dat: je neemt trainingsdata, zoals een foto van een kat, en voegt daar stapsgewijs steeds meer willekeurige ruis (noise) aan toe, totdat er alleen nog maar ruis overblijft. De afbeelding 'lost op', als een druppel inkt in een glas water. Dat heet het Fixed Forward Diffusion Process.

Vervolgens leg je iedere stap in het proces voor aan een computermodel, waarbij je vraagt of hij weet hoeveel ruis er is toegevoegd. Zodra het model een antwoord heeft gegeven, laat je hem het juiste antwoord zien. Op basis daarvan leert het model steeds beter inschatten hoeveel ruis er bij iedere stap is toegevoegd, en heb je uiteindelijk een noise predictor getraind die de precieze hoeveelheid ruis kan inschatten die aan een afbeelding is toegevoegd. Zoals je hieronder kunt zien, is dat niet zo’n hele uitdagende taak.

Maar de computer kan het diffusieproces ook andersom uitvoeren: reverse denoising. En daar begint het generatieve proces. Je legt een plaatje van willekeurige ruis voor aan de computer. De noise predictor doet wat hij goed kan: de hoeveelheid ruis inschatten. Vervolgens trek je die ruis af van het oorspronkelijke plaatje, waardoor je een iets minder ruizig plaatje overhoudt. Deze stap herhaal je, keer op keer, totdat je een afbeelding overhoudt zonder ruis. 

Hoewel bovenstaand voorbeeld een kat van hoogwaardige kwaliteit toont, vinden diffusieprocessen in werkelijkheid plaats in de latent space. Dus wanneer het model de 'ontruising' uitvoert, gebeurt dat in pure code. 

En hetzelfde geldt voor de tekst die je invoert. Die ‘begrijpt’ AI niet meteen. Hij moet het eerst vertalen naar zijn eigen taal: code. Dat doet hij via een tokenizer. Daarmee zet de computer ieder woord eerst om in een waarde. Dus 'kat' is bijvoorbeeld 41, en 'eend' is 28.

De betekenis van een los woord is soms afhankelijk van de context. Maar we weten inmiddels dat de latent space zo is geordend, dat soortgelijke en gerelateerde concepten dicht bij elkaar staan. Daarom moet de AI een embedding vector aan elke token hangen. Dat is een reeks getallen die wijst in een bepaalde richting binnen de latent space. Hiermee kan de computer een waarde toekennen aan de hele prompt die groter is dan de som van zijn delen. 

Het is die waarde - of interpretatie - die de noise predictor in de juiste richting stuurt om willekeurige ruis op zo’n manier te reduceren, dat iedere stap in het ontruisingsproces dichter bij een afbeelding komt die overeenkomt met de prompt.

Dat de uiteindelijke afbeelding wel van hoge kwaliteit is, komt door een decoder. Die kan de mini-afbeeldingen uit de latent space weer ontvouwen in hoge resolutie.

Het is belangrijk om te beseffen dat de decoder niet zozeer de fijne details herwint uit de gecomprimeerde data, maar dat hij deze details zelf intekent, op basis van de verbanden die hij heeft gelegd in de latent space.

uit verschillend hout gesneden

Als je een beetje speelt met de beschikbare generatieve tools op het internet, zie je dat je vaak verschillende outputs tegelijk krijgt voor dezelfde prompt. Dat komt doordat het ruisplaatje die de AI als uitgangspunt neemt steeds varieert.

Wat bepaalt hoe die ruis er in eerste instantie uitziet, is de noise seed. Ieder ruisplaatje heeft een bijbehorende waarde. Dat kan 1 zijn, maar ook 4294967295. Dit getal bepaalt hoe de decoder de prompt uitvoert. Oftewel: als je de noise seed vastzet, en dan weer precies dezelfde prompt invoert, krijg je exact hetzelfde plaatje.

Je kunt iedere unieke noise seed dus zien als een apart materiaal, met eigenschappen die de AI forceren een prompt op een bepaalde manier uit te voeren. Denk aan houtbewerking. Zoals de vorm van een stuk hout de kunstenaar dwingt om zijn idee op een bepaalde manier uit te voeren, zo is noise seed 3478099456 op een manier dwingend voor hoe de afbeelding gesynthetiseerd wordt, waardoor de prompt er anders uit komt te zien dan wanneer je de seed instelt op 0000000003. De variëteit in noise seeds is in theorie eindig, maar het zijn er zoveel dat het genoeg is om de schijn van creativiteit te wekken.

En andersom geldt: als je de noise seed vast instelt op 45, en je verandert je prompt, zal die nieuwe afbeelding veel meer lijken op de vorige dan als je een compleet andere noise seed neemt. De noise seed vastzetten kan dus helpen bij het genereren van soortgelijke afbeeldingen, en het maken van kleine aanpassingen binnen een afbeelding.

wat wij hebben gedaan

Voor de Tegenlicht aflevering De prijs van AI, heeft researcher Arnout Arens samen met MidJourney de beelden gegenereerd van mijnwerkers, mijnen, computerchips en bomen die uiteindelijk in de aflevering zijn gebruikt.

We deden dit niet alleen om te laten zien hoe ver AI is in het genereren van levensechte mensen. Dat weten we inmiddels wel. We wilden ook laten zien hoe we ermee kunnen samenwerken in het vertellen van het verhaal over AI. Want hoewel de wereld van AI samenhangt van schimmige datasets, onderbetaald klikwerk, vervuilende aardmetalen en enorm energieverbruik, kan het tegelijkertijd bijdragen aan dit verhaal - door het onzichtbare zichtbaar te maken.