Ga naar de hoofdinhoud
BVDNET
Arnhem · websites & automatiseringBVDNET
Modellen & Architectuur

Perplexity in NLP

Perplexity is een score voor hoe goed een taalmodel tekst voorspelt: hoe lager het getal, hoe minder het model verrast was door de woorden die echt volgden.

Ook bekend als: perplexiteit, language model perplexity, PPL

Perplexity (ook wel perplexiteit) is een score voor hoe goed een taalmodel tekst voorspelt. Het model leest een tekst stukje voor stukje en geeft elk stukje dat echt volgt een kans; perplexity maakt van al die kansen één getal. Hoe lager dat getal, hoe minder het model verrast was. Modelbouwers vergelijken er versies van een model mee, maar een lagere score garandeert geen betere antwoorden in de praktijk.

Hoe bereken je het?

Neem een testtekst die het model niet kent en deel die op in tokens. Voor elk token geeft het model de kans op dat token, gegeven alles wat eraan voorafgaat. Perplexity is de exponent van het gemiddelde van de negatieve logaritmen van die kansen (Hugging Face): perplexity = exp(-(log p1 + log p2 + ... + log pN) / N). Dat is gelijk aan de exponent van de cross-entropy tussen de tekst en de voorspellingen van het model, de loss waarop taalmodellen worden getraind, dus een trainingsloss zet je direct om in een perplexity.

Het leerboek Speech and Language Processing van Jurafsky en Martin beschrijft perplexity als een gewogen gemiddelde vertakkingsfactor: ongeveer het aantal even waarschijnlijke opties dat het model per token nog heeft. Een model dat gelijkmatig gokt tussen 50.000 tokens heeft perplexity 50.000; een model dat altijd met zekerheid het juiste token voorspelt, heeft perplexity 1.

Hoe zien de getallen eruit?

Jurafsky en Martin trainden modellen op 38 miljoen woorden uit de Wall Street Journal en testten ze op 1,5 miljoen woorden. De perplexity daalde van 962 voor een model dat naar losse woorden kijkt naar 170 voor woordparen en 109 voor reeksen van drie woorden. Op de One Billion Word Benchmark (Chelba e.a., 2013) scoorde een klassiek 5-grammodel 67,6, en een combinatie van modellen, met een recurrent neuraal netwerk als sterkste, bracht dat 35% omlaag. In cross-entropy was dat een daling van 10%: de exponent vergroot verschillen.

Perplexity is ook een snelle controle na het comprimeren van een model. GPTQ (Frantar e.a., 2022) rapporteert het op WikiText-2, PTB en C4, omdat het sterk reageert op kwantisatie. Bij 4 bits verloor OPT-175B 0,03 perplexity met GPTQ en 2,2 met gewoon afronden.

Waar gaat het mis?

  • Scores zijn alleen vergelijkbaar op dezelfde testtekst met dezelfde tokenizer. Jurafsky en Martin schrijven dat perplexities alleen vergelijkbaar zijn bij een identiek vocabulaire, en Hugging Face wijst erop dat de tokenisatie de score direct beïnvloedt.
  • De rekenmethode verandert het getal. Hugging Face mat GPT-2 large op WikiText-2: in losse blokken van 1.024 tokens scoorde het 19,44, dicht bij de 19,93 uit het GPT-2-paper, en met een verschuivend venster dat elk token meer context geeft 16,44.
  • Testtekst die in de trainingsdata zat, maakt de score kunstmatig laag (Jurafsky en Martin).
  • Het past bij modellen die van links naar rechts schrijven. Voor gemaskeerde modellen zoals BERT is perplexity niet goed gedefinieerd (Hugging Face).
  • Een lagere perplexity garandeert geen betere resultaten op een echte taak, en Jurafsky en Martin raden aan dat te bevestigen met een test op die taak zelf. Voor lange teksten vonden Hu e.a. (2024) geen verband tussen perplexity en hoe goed modellen die teksten begrijpen.

Voorbeeld

Jurafsky en Martin gebruiken een taal van drie woorden: rood, blauw en groen. Een model dat elk woord even waarschijnlijk vindt, heeft op elke tekst perplexity 3. Een model dat rood een kans van 0,8 geeft en de andere twee elk 0,1, scoort 1,89 op de testtekst "rood rood rood rood blauw". In Python:

Python
1import math
2kansen = [0.8, 0.8, 0.8, 0.8, 0.1] # kans op elk woord dat echt volgde
3perplexity = math.exp(-sum(math.log(p) for p in kansen) / len(kansen))
4print(round(perplexity, 2)) # 1.89