n-gram-språkmodeller
Kunna bygga en n-gram-modell, beräkna perplexitet och förstå glesheten som motiverade neurala modeller.
Förkunskaper
Intuition
Före neurala språkmodeller fanns n-gram: gissa nästa ord utifrån de n−1 föregående, genom att räkna hur ofta kombinationen förekommit i en textmassa.
P(ord | föregående) = antal(föregående + ord) / antal(föregående)
Med en bigram-modell (n = 2) räknar man bara ordpar. «katten sover» förekom 12 gånger, «katten» 300 gånger → P(sover | katten) = 0,04.
Problemet: gleshet. Med ett ordförråd på 50 000 ord finns 2,5 miljarder möjliga bigram och 10¹⁴ trigram. De allra flesta har du aldrig sett — och då blir sannolikheten noll, vilket gör hela meningen omöjlig. Man utjämnar (smoothing) genom att lägga till en liten sannolikhet överallt, men grundproblemet består.
Kod
from collections import defaultdict, Counter
import math, random
def bygg_bigram(tokens):
modell = defaultdict(Counter)
for a, b in zip(tokens, tokens[1:]):
modell[a][b] += 1
return modell
def sannolikhet(modell, a, b, vokab, alpha=1.0): # add-alpha-utjämning
return (modell[a][b] + alpha) / (sum(modell[a].values()) + alpha * len(vokab))
def perplexitet(modell, tokens, vokab):
logs = [math.log(sannolikhet(modell, a, b, vokab)) for a, b in zip(tokens, tokens[1:])]
return math.exp(-sum(logs) / len(logs))
def generera(modell, start, n=12):
ut = [start]
for _ in range(n):
val = modell[ut[-1]]
if not val: break
ut.append(random.choices(list(val), weights=val.values())[0])
return " ".join(ut)
Vad n-gram inte kan: «Mannen som bodde i huset vid sjön var» — för att välja «var» behövs «mannen», sju ord bort. En 3-gram-modell ser bara «vid sjön». Att bara öka n hjälper inte: datan räcker aldrig till.
Det är precis det problemet neurala modeller löste — först med embeddings (liknande ord delar statistik), sedan med attention (godtyckligt långt beroende).
Behärskning innebär
- Bygger en n-gram-modell och genererar text
- Beräknar perplexitet
- Förklarar glesheten som motiverade neurala modeller
Logga in för att göra övningarna och bygga upp din behärskning.