Hvordan virker egentlig ChatGPT?


ChatGPT og andre LLM (Large Language Models) produserer ganske fantastiske biter tekst om dagen og noen av oss synes det er interessant å vite hvordan de får det til under panseret, delvis fordi:

If I can’t create it, I don’t understand it

Richard Feynman

Nå er det en del hemmeligheter knyttet til OpenAI og ChatGPT, men de er heldigvis stort sett begrenset til det som gjøres “etterpå” for å sørge for at produktet fra GPT er politisk korrekt og slikt. Selve prinsippet for hvordan teksten genereres er godt dokumentert og så lett tilgjengelig at det er gjort på noen få timer å skrive sin egen SLM (Small Language Model).

Men, la oss først se litt på hvordan vi kom dit vi er: Den første utbredte “AI” tekstgeneratoren var en Markovkjede på enkeltbokstaver. En slik kjede er en statistisk modell der sannsynligheten for neste ledd i kjeden kun avhenger av de tidligere ledd i kjeden. Så gir man et datagrunnlag som den kan lage sannsynligheter fra og lar den gjette seg til neste bokstav. Hvis man eksempelvis laster inn alfabetet noen ganger og gir:

ABCD?

Vil en slik kjede hevde at sannsynligheten for at neste bokstav er ‘E’ er ganske stor.

Hvis man eksempelvis laster inn Terje Vigen som datagrunnlag i en slik kjede kan man få ut noe som:

BODDE EN TAGET RAND DET OVER BAER OS NU GIK TERJES
UNDERLIG GRASPRAENGT EN VINTER I SUS TIL HANS OJNE VAR SMULT
GRASPRAENGT EN BON OG HOJ HANS MUND HAN BEDST BEVART HAN

Som riktig nok ikke gir mening, men allikevel er ganske imponerende når man tenker på at dette er en ren frekvensanalyse av bokstaver og hver enkelt bokstav er generert for seg selv uten tanke på at det skal være hele ord eller setninger eller noe slikt. Hvis man benytter en litt mer impresjonistisk diktsamling kan man få ut ganske plausible resultater. (Sigbjørn Obstfelder er en favoritt)

Neste fremskritt var noe som heter Recurrent Neural Networks (RNN), som stort sett bruker samme prinsippet, men kan ‘se’ større biter enn bare bokstaver, og rimelig pålitelig kan produsere grammatisk gyldige setninger, men som fremdeles stort sett ikke gir mening.

For at vi skal kunne få noe fornuftig ut av en AI modell må vi ha noe mer; noe slikt som:

Magibiten er det som OpenAI løste og som er beskrevet i en glimrende forskningsartikkel som heter ‘Attention is all you need’.

Det som foregår her er litt komplekst, så vi skal gå gjennom med noen eksempler. La oss mate inn en tilfeldig setning:

Ved Fjære kirke jeg så en grav, den var dårlig skjøttet, sunken og lav.

Foreløpig “vet” ikke modellen noe som helst om den setningen, men vi laster inn en mengde andre setninger, og ord som dukker opp ofte i mange varierte sammenhenger får en mindre vekting. Setningen vår ser nå slik ut:

Ved Fjære kirke jeg så en grav, den var dårlig skjøttet, sunken og lav.

De uthevede ordene har nå høyere vekt eller “attention” og er signifikante ord som vi bør ta hensyn til.

Så legger vi inn flere observasjoner fra kirkegårder:

Ved Vestre Aker kirke er det en velstelt grav med roser og fioler.

Nå får den opprinnelige setningen vår en litt justert vekting igjen:

Ved Fjære kirke jeg så en grav, den var dårlig skjøttet, sunken og lav.

Nå ‘vet’ modellen at ordene ‘kirke’ og ‘grav’ er viktige og hører ofte sammen, resten kan variere en hel del. Den ‘vet’ også at ‘dårlig skjøttet’ kanskje også hører sammen med ‘sunken og lav’ siden de ikke opptrer uavhengig av hverandre.
Alt dette gjøres kun ved å sette forskjellige verdier/vekter/attention til ordene.

La oss se på noen helt andre setninger:

Den flygende elgen prøvde å komme seg inn i bilen, men den var for …

Den rosa elgen prøvde å stoppe bilen men den var for …

Vi som led oss gjennom setningsanalyse på skolen kan identifisere både subjekt og objekt og kanskje foreslå ‘stor’ som avslutning til den første setningen og ‘rask’ til den andre.

Hvordan kan modellen vår komme frem til det uten å ha hørt om hverken subjekt eller objekt? Ved å vekte ordkombinasjoner:

‘elgen + bilen’ er en enhet, og gitt tilstrekkelig mange setninger vil den også kunne finne ut at ‘stoppe + rask’ og ‘inn i + stor’ henger sammen. Så fyller den ganske enkelt inn de manglende ordene og har ikke noe behov for hverken formell grammatikk eller kunnskap om fauna:

Den flygende elgen prøvde å komme seg inn i bilen, men den var for stor

Den rosa elgen prøvde å stoppe bilen men den var for rask

En av mange detaljer vi har hoppet over er at for å faktisk oppnå en slik vekting vil man mate inn samme setning i mange steg:

  1. Den
  2. Den rosa
  3. Den rosa elgen

og så videre. Det finnes egne verktøy (‘tokenizers’) som tar seg av den jobben under trening av modellen.

Dette magilaget som vekter ord og ordkombinasjoner heter på fagspråket et “Attention Head” og er et lag som man forhåndstrener og legger inn mellom andre generative nevrale nett. En stor modell som ChatGPT vil inneholde mange Attention Heads, og nøyaktig hvor mange og hvor i arkitekturen de holder til er noe som OpenAI holder hemmelig.

På den annen side kan man etter et par timer med et godt maskinlæringsbibliotek (Keras eller PyTorch, eksempelvis) lage en prinsipielt lik modell som gir forbausende gode resultater med et moderat datagrunnlag. Det som koster tid og penger er alt arbeidet med å preparere dataene og den faktiske kjøretiden på store mengder data samt etterarbeidet med finjustering av modellresultatene via ’Supervised Reinforcement Training”, som er et helt annet emne.