Lær ved at prøve
Matematikken bag et navn
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.
Input · 8 × 27
Lærte vægte · 27 × 216
Resultat · 27 × 27
Klik på en celle i resultatet
Den tilhørende række i vægtene og kolonne i input bliver markeret. Beregningen vises her.
2. Læg hver række sammen
For hvert outputbogstav lægger vi de 27 tal i resultatrækken sammen. Rækkesummen er det endelige output. Klik på et endeligt output for at fortsætte navnet.
Inputvisningen har 8 × 27 felter. Til beregningen fordeles de over 216 rækker og 27 bogstavkolonner, som vist ovenfor. Den lærte matrice har 27 × 216 vægte: én for hver kombination af output, inputposition og inputbogstav. Hvert output er summen af de aktive vægte. Modellen er trænet uden bias.
“Mellemregning” viser de aktive bidrag samlet i 27 kolonner efter inputbogstav. Det er matrixproduktet: 27 × 216 ganget med 216 × 27 giver 27 × 27. Alle beregninger bruger vægten for både positionen og bogstavet. Tallene vises afrundet.
Modellen er trænet på 94 navne, blandt andet KASPER, JASPER, CASPER, JASMIN, CARSTEN og KARSTEN. Knapperne vælger tre startbogstaver. JAS har for eksempel både P og M som gyldige fortsættelser i træningsnavnene. Tallene er modellens rå scorer, ikke procenter.
Træningssættet er valgt, så denne ene matrice kan rangere fortsættelserne korrekt: I alle 249 træningskontekster scorer hvert gyldigt næste tegn højere end de ugyldige. Det gælder for alle 94 navne, helt til sluttegnet. Når flere fortsættelser er gyldige, kan du vælge mellem dem. Beregningen bruger kun de lærte vægte; svarene rettes ikke med en navneliste.
Dette er memorering af træningsnavne, ikke en test på nye navne. Modellen er trænet fra tre startbogstaver (kortere navne starter i fuld længde). Du kan ændre input frit, men svar uden for træningskonteksterne er ikke kontrolleret. “Forfra” vælger en begyndelse fra træningsnavnene. Når otte pladser er fyldt, skubbes det ældste tegn ud.
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
| Bogstav | Forventet | Modtaget | Forskel² |
|---|
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:
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.
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.
Det er nemt at få computeren til at differentiere — altså finde hældningen — når beregningen er bygget af operationer, den kender reglerne for. Det kaldes automatisk differentiering.
Forskere, der arbejder med kunstig intelligens, kan bruge langt mere end plus og gange: fx sin, cos, tan, exp og ln, hvor funktionerne er definerede og kan differentieres. De kan også skrive hele programmer, der kombinerer sådanne beregninger. Automatisk differentiering beregner de afledte gennem programmets operationer, uden at forskeren skal udlede hele regnestykket i hånden.
Det giver stor frihed til at bygge nye former for kunstig intelligens. Fantasien kan få frit spil — men beregningen skal stadig kunne differentieres, og modellen skal kunne trænes og afprøves.
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 · Et andet input
Flere felter i spil
Et udkast til placeringen: første række indeholder det første bogstav, anden række de to første, og så videre. A = 1, B = 2, …, Z = 26. Resten er 0. Prøv også at forskyde hver række én kolonne mod højre.
Dette viser kun inputkodningen. Den er endnu ikke koblet til træning eller modellens output.