Lær ved at prøve

Matematikken bag kunstig intelligens

Hej. Her ser du lidt af matematikken bag kunstig intelligens, og hvordan den bliver trænet. Du skal bare kende +, −, × og ÷, og vide, hvad en funktion og en hældning er. Resten tager vi her.

Vi bygger en lille model, der foreslår ét bogstav ad gangen. Hvert trin viser én ting, du selv kan prøve.

01 · Gang og læg sammen

To tal bliver til to nye tal

En matrice er en tabel med tal. Hver række ganger inputtallene og lægger resultaterne sammen.

Beregningsmatrice

Input

Output

Ændr tallene i matricen eller inputtet. Klik på et resultat for at se regnestykket.

02 · To matricer

En række gange en kolonne

Nu har input to kolonner. Hver kolonne beregnes ligesom vektoren ovenfor. Resultatet får derfor også to kolonner.

Input · 2 × 2

Beregningsmatrice · 2 × 2

Output · 2 × 2

Klik på et af de fire outputtal. Den valgte række til venstre og kolonne ovenover markeres. Alle otte inputtal kan ændres.

03 · Output

Fra tre bogstaver til et navn

Vi starter med tre bogstaver fra et navn. Den 27. mulighed er sluttegnet ·. Vælger du det, er navnet færdigt. Outputtet er det endelige resultat: ét tal for hvert muligt næste bogstav. Klik på det største tal for at vælge det fjerde bogstav — og fortsæt derefter ét bogstav ad gangen.

Klik på et bogstav i en inputrække. Rækken er en position i konteksten, og de 27 kolonner er A–Z og sluttegnet ·. Det valgte bogstav får 1; resten får 0. Klik igen for at tømme pladsen.

1. Gang de to matricer

Hver kombination af position og bogstav får sin egen række: 8 × 27 = 216 rækker. Et aktivt 1-tal står i den tilhørende bogstavkolonne. Det giver input på 216 × 27 og bevarer både positionen og bogstavet.

Vi lægger tallene i hver resultatrække sammen til det endelige resultat i kolonnen til højre. Klik på et slutresultat for at fortsætte navnet. · betyder slut.

Input · 8 × 27

Lærte vægte · 27 × 216

Resultat · 27 × 27

Endeligt resultat · 27 × 1

Klik på en celle i resultatet

Den tilhørende række i vægtene og kolonne i input bliver markeret. Beregningen vises her.

Mellemregning · 27 × 27

Modellen har lært 94 navne. Den bruger de lærte tal til at foreslå næste tegn. Nogle begyndelser har flere svar: JAS kan blive til både JASPER og JASMIN.

Men hvad sker der, hvis vi giver den en helt ny begyndelse? Prøv nedenfor.

Prøv selv · Tre måder at fortsætte på

Kan modellen finde på nye navne?

Alle tre får samme begyndelse. Prøv tre tilfældige bogstaver med skiftevis konsonant og vokal, eller skriv din egen.

Skriv 1–8 bogstaver fra A til Z. De nye bogstaver vises med blå skrift.

Tilfældige bogstaver
Den enkle model
Modellen med blanding

Hvilken synes du giver det bedste resultat?

Tilfældig trækker næste tegn uden træning. De to modeller vælger tegnet med højest score, så samme begyndelse giver samme svar. Vi stopper senest ved 8 bogstaver.

En navneliste kan huske navne. En model kan også bruge lærte mønstre til nye forslag. Det er idéen med at samle erfaringer i en model — en form for “komprimering”, som kan give mere end hukommelse.

Den store navneliste er vores træningsudvalg fra Familieretshusets godkendte fornavne. Den rummer danske og internationale navne. Vi bruger kun A–Z og højst otte bogstaver.

Hvor meget fylder det?

Navnelisten er UTF-8 med ét linjeskift mellem navnene. Modellens tal tælles som 32-bit tal, altså 4 bytes hver, uden programkode og metadata.

Den blandede modelBeregningBytes

Se, hvordan modellen med blanding virker.

Samme metode, mange muligheder

Her genererer modellen tekst ved at forudsige næste bogstav. Det samme træningsprincip kan også bruges til at skabe billeder, film, tale og musik: mål fejlen, find hældningerne og justér værdierne. Modellerne og træningsdataene er forskellige, men grundidéen er den samme.

Fra stregtegning til billede

Det er forholdsvis nemt at skrive et program, der laver et billede om til en stregtegning. Den modsatte vej — fra streger til et realistisk billede — er langt sværere at programmere med faste regler. Men vi kan bruge det enkle program til at lave par af billeder og stregtegninger. Så kan en AI-model lære at gå den anden vej.

Fra støj til billede

Samme idé kan bruges med støj: Vi tilføjer gradvist støj til billeder og træner en model til at fjerne den igen. Modellen kan derefter starte med tilfældig støj og danne et nyt billede, lidt ad gangen.

To motiver i ét billede

Undervejs kan modellen arbejde med billedet både normalt og på hovedet. Ved at kombinere forslagene til støjfjernelse kan den skabe ét motiv i hver retning. Se eksempler i Visual Anagrams.

Samme idé, mange slags matematik

AI-forskere bruger langt mere end plus og gange: fx sinus, cosinus, tangens, eksponentialfunktioner og logaritmer. Metoden til at finde hældninger, som vi kommer til senere, hedder automatisk differentiering. Den kan følge beregninger gennem hele programmer, når operationerne understøttes og kan differentieres.

Der er stor frihed til at eksperimentere med matematikken. Prøv selv input, lag og aktiveringsfunktioner i TensorFlow Playground.

I det trænede eksempel med blanding nederst får alle 27 felter i hver udfyldt række et bidrag fra bogstaverne hidtil. Tomme rækker er stadig 0. Outputtet beregnes med samme matrixmultiplikation og summering som her. Blandingen kræver ekstra beregning, men lod os finde et større træningssæt med korrekte fortsættelser: 126 navne mod 101 i forsøget uden blanding. Det er ikke en måling af hastighed eller en øvre grænse.

Fra fejl til hældning

04 · Find de rigtige vægte

Hvordan finder vi værdier, der giver gode svar?

Matricens tal kaldes vægte. De bestemmer, hvilket output vi får. Vi vil finde vægte, som giver et højt output for det rigtige næste bogstav og et lavt output for de andre.

Her starter træningen: med en tilfældig matrice. Vi kender endnu ikke de gode værdier, så vi vælger først tal mellem −1 og 1. De giver som regel ikke det svar, vi ønsker.

For hvert træningseksempel kender vi både inputtet og det ønskede svar. Her bruger vi KASPER fra træningsnavnene ovenfor. I navnet KASPER kommer P efter KAS. Vi sætter derfor det forventede output til 1 ved P og 0 ved de andre bogstaver og sluttegnet. Efter det sidste bogstav i et helt navn er det i stedet sluttegnet, der skal have 1.

Fejlen måler, hvor langt modellens svar er fra det ønskede svar. Vi sammenligner de to vektorer, kvadrerer forskellene og tager gennemsnittet. Et mindre fejltal betyder, at svaret ligger tættere på målet i dette eksempel.

Det giver os noget konkret at forbedre: Vi ændrer vægtene, så fejlen bliver mindre. Vi gør det på mange navne, ikke kun KASPER, og undersøger bagefter, om modellen også giver gode svar på eksempler, den ikke er trænet på.

Input: K A S → forventet: P

BogstavForventetModtagetForskel²

Klik på et tal i Forskel² for at se regnestykket og differentiere det.

Forskel² = (modtaget − forventet)². Kolonnen viser den kvadrerede forskel, som altid er 0 eller positiv. Vi tager gennemsnittet: Det giver ét tal for fejlen. En negativ og en positiv forskel kan derfor ikke ophæve hinanden.

Her sammenligner vi rå outputtal med en målvektor, ikke procenter. P er svaret i netop KASPER; andre navne kan fortsætte anderledes.

Computeren kan finde hældningen

Ét træningseksempel kaldes en sample. For KAS → P er målet 1 ved P og 0 ved alle andre tegn, også sluttegnet. Den fulde loss for dette eksempel er gennemsnittet af alle 27 kvadrerede forskelle:

127⋅[(oA−0)2+(oB−0)2+(oC−0)2+(oD−0)2+(oE−0)2+(oF−0)2+(oG−0)2+(oH−0)2+(oI−0)2+(oJ−0)2+(oK−0)2+(oL−0)2+(oM−0)2+(oN−0)2+(oO−0)2+(oP−1)2+(oQ−0)2+(oR−0)2+(oS−0)2+(oT−0)2+(oU−0)2+(oV−0)2+(oW−0)2+(oX−0)2+(oY−0)2+(oZ−0)2+(o·−0)2]

o er modellens output for det angivne tegn. Alle 27 led er med — rul vandret for at se dem.

Fra ét eksempel til mange

Vi beregner en loss for hvert eksempel, lægger dem sammen og dividerer med antallet. På samme måde lægger vi deres gradienter sammen og dividerer med antallet. En gradient indeholder én afledt for hver vægt.

Gennemsnitlig loss=loss1+⋯+lossNNRetning for vægtene=−gradient1+⋯+gradientNN

Den gennemsnitlige gradient peger mod større loss. Vi vender derfor pilen om og tager et lille skridt i den modsatte retning. Det er en retning mod mindre gennemsnitlig loss lokalt — ikke nødvendigvis et bedre svar på hvert enkelt eksempel. Skridtets størrelse styres af læringsraten.

Computeren kan udføre differentieringen automatisk gennem de understøttede operationer i et program. Derfor kan samme princip bruges, selv når modellen indeholder langt mere matematik end vores lille matrix.

05 · Følg hældningen

Et lille skridt mod mindre fejl

På denne enkle kurve er fejlen (vægt − 3)². Hældningen fortæller, hvilken vej vægten skal flyttes. Vi tager et lille skridt modsat hældningen.

Vi søger den laveste fejl. I denne øvelse er den 0; en model, der forudsiger navne, kan ikke altid nå 0, fordi samme bogstav kan efterfølges af flere forskellige bogstaver.

06 · Ret matricen

Se modellen lære

Nu træner vi på små navne. For hvert bogstav sammenligner vi modellens sandsynligheder med det rigtige næste bogstav. Forskellen fortæller, hvordan vægtene skal ændres.

Se ændringerne i matricen (ΔW)

Hver celle viser den seneste ændring. Kolonnen er inputbogstavet, rækken er det næste bogstav. Ny vægt = gammel vægt + ΔW.

“Én gang” er én samlet opdatering ud fra alle bogstavpar i navnene. Vi bruger samme matrice og samme regneregler til træning og forudsigelse.

Se navnene og regnereglen

Et lille, håndvalgt undervisningseksempel — ikke en repræsentativ navnedatabase:

Inputtet x har ét 1-tal. Scorer: z = W × x. Sandsynligheder: pᵢ = exp(zᵢ) / Σ exp(zⱼ). Fejl for det rigtige bogstav: −log(p). Ændring: ΔW = −læringsrate × gennemsnittet af (p − korrekt svar) × xᵀ. Det korrekte svar har 1 ved det rigtige bogstav og 0 på resten.

Appendix · Trænet blanding

Et nyt bogstav ændrer det blandede input

Hver række blander det nye bogstav med de foregående og en fast vægt for positionen. De første tre bogstaver behandles på samme måde. Klik på et outputbogstav: den nye række lyser op, og modellen beregner næste forslag.

1. Gang de to matricer

Input vises som 8 × 27. I beregningen fordeles de 216 inputtal på 216 rækker og 27 kolonner, så bidragene samles efter feltnummer.

Vi lægger tallene i hver resultatrække sammen til det endelige resultat i kolonnen til højre. Klik på et slutresultat for at fortsætte navnet. · betyder slut.

Input · 8 × 27

Lærte vægte · 27 × 216

Resultat · 27 × 27

Endeligt resultat · 27 × 1

Klik på en celle i resultatet

Rækken i vægtene og kolonnen i input markeres. Beregningen vises her.

Trænet på 126 udvalgte navne uden bias i outputmatricen. Alle 330 træningskontekster rangerer gyldige fortsættelser over de ugyldige, helt til sluttegnet. Det er memorering af træningsnavne; frit valgte forkerte bogstaver kan føre uden for dem.

Se blandingen og træningsnavnene

Ny række = tanh(0,5 × R × forrige række + 0,5 × positionsvægt × bogstavkode). Første række starter med en nulvektor. Positionsvægtene går fra 0,75 til 1,25. R og bogstavkoderne er faste; tanh holder værdierne mellem −1 og 1.

De otte rækker samles til 216 inputtal. En lært matrice giver de 27 outputscorer. Kun denne sidste matrice trænes ved at minimere den gennemsnitlige kvadrerede fejl. Tidligere rækker bevares, når et nyt bogstav tilføjes.