08 · LLM · 6 min czytania · aktualizacja
Co to jest perpleksja modelu językowego i jak ją czytać?
W skrócie
Perpleksja to e do potęgi średniej entropii krzyżowej na token. Na małym korpusie bigram z wygładzaniem ma 14,41 na zdaniach treningowych i 114,94 na nowych.
Co to jest
Perpleksja (perplexity) mierzy, jak bardzo model językowy jest „zaskoczony” tekstem, którego wcześniej nie widział. Model czyta tekst token po tokenie i dla każdego podaje prawdopodobieństwo tego tokenu, który rzeczywiście wystąpił. Średnia z −ln tych prawdopodobieństw to entropia krzyżowa na token, czyli ta sama strata, którą minimalizuje się podczas treningu. Perpleksja to e do potęgi tej średniej: PPL = exp(−(1/N) · Σ ln p(token_i | kontekst)).
Najprostsza interpretacja: perpleksja to efektywna liczba równie prawdopodobnych możliwości, między którymi model się waha. Model, który dla każdego z 126 słów słownika podaje po 1/126, ma perpleksję dokładnie 126. Model z perpleksją 10 jest średnio tak niepewny, jakby losował spośród 10 jednakowo możliwych tokenów. Pojęcie wprowadzili Jelinek, Mercer, Bahl i Baker w 1977 roku jako miarę trudności zadań rozpoznawania mowy, lepszą niż sama wielkość słownika.
Ta sama wielkość w bitach: log₂ PPL to średnia liczba bitów na token. Perpleksja 126 to 6,98 bitu, a perpleksja 2 — jeden bit.
Mechanizm — dlaczego tak działa
Dlaczego średnia logarytmów, a nie średnia prawdopodobieństw? Bo prawdopodobieństwo całego tekstu to iloczyn prawdopodobieństw kolejnych tokenów. Logarytm zamienia iloczyn w sumę, a podzielenie przez N daje wynik niezależny od długości tekstu. Perpleksja to więc odwrotność średniej geometrycznej prawdopodobieństw przypisanych prawdziwym tokenom. Średnia geometryczna jest bezlitosna dla zer: wystarczy jeden token z prawdopodobieństwem 0, a cały tekst ma prawdopodobieństwo 0 i perpleksję nieskończoną.
Stąd potrzeba wygładzania. Model zliczający, jak często słowo b występuje po słowie a (bigram), na nowym tekście szybko natrafia na pary, których nie widział. Wygładzanie „dodaj k” dokłada k do każdego licznika, więc żadne prawdopodobieństwo nie jest zerem. Interpolacja miesza bigram z modelem pojedynczych słów (unigramem): λ · p_bigram + (1 − λ) · p_unigram. Słowa spoza słownika zamienia się na wspólny symbol ⟨unk⟩, który też dostaje kawałek prawdopodobieństwa. Chen i Goodman (1999) porównali wiele takich metod na dużych korpusach.
Perpleksja liczona na tekście treningowym jest myląca z tego samego powodu co dokładność na zbiorze treningowym: model, który zapamiętał tekst, ma niską perpleksję na nim i wysoką na nowym. Liczy się tylko perpleksja na tekście odłożonym.
Perpleksje są porównywalne tylko przy tym samym podziale tekstu na tokeny i tym samym zbiorze testowym. Model z mniejszym słownikiem albo z krótszymi tokenami ma mniej możliwości na token i zwykle niższą perpleksję na token, choć tekst jako całość przewiduje wcale nie lepiej. Uczciwszą jednostką jest liczba bitów na znak albo na bajt: łączna liczba bitów dla całego tekstu podzielona przez liczbę znaków. Dokumentacja Hugging Face zaznacza wprost, że tokenizacja bezpośrednio wpływa na perpleksję i trzeba ją uwzględnić przy porównaniach.
Na przykładzie
Korpus to 52 polskie zdania napisane do ćwiczenia w kursie (np. „Każdego ranka piję filiżankę herbaty.”). To bardzo mały tekst — wyniki ilustrują mechanizm, a nie zachowanie prawdziwych modeli. Co czwarte zdanie odkładamy do testu: 39 zdań treningowych (212 tokenów) i 13 testowych (77 tokenów). Tokeny to słowa małymi literami i znacznik końca zdania; słownik treningowy ma 125 typów, plus ⟨unk⟩.
Model jednostajny ma perpleksję 126 na każdym tekście — to dokładnie liczba możliwości. Unigram bez wygładzania ma na treningu 71,71, a na teście nieskończoność: 33 z 77 tokenów testowych (42,9%) to słowa, których w treningu nie było. Polska odmiana robi swoje — „filiżanka” jest w teście, w treningu tylko „filiżankę”.
Bigram bez wygładzania na zdaniach treningowych ma perpleksję 2,51: model waha się średnio między dwoma, trzema słowami. Na teście znów nieskończoność — 65 z 77 par testowych (84,4%) nie wystąpiło w treningu. Z wygładzaniem perpleksja na teście staje się skończona, ale luka jest ogromna. Bigram z k = 0,1: 14,41 na treningu i 114,94 na teście. Z k = 0,01: 4,14 i 161,49 — gorzej niż model jednostajny. Interpolacja z λ = 0,9: 2,77 i 526,31. Im mocniej model dopasowuje się do treningu, tym gorzej na nowym tekście.
Najlepszy na teście okazał się unigram z k = 1: 112,41, niewiele lepiej niż 126 z modelu jednostajnego. A unigram nie zna kolejności słów: „piję filiżankę herbaty” i „herbaty filiżankę piję” dostają u niego to samo prawdopodobieństwo. Niższa perpleksja nie oznacza tu lepszego tekstu. Przy innych podziałach (co czwarte zdanie od pierwszego, drugiego lub trzeciego) wyniki się przesuwają: unigram z k = 1 od 105,09 do 117,34, bigram z k = 0,1 od 98,19 do 123,12. Na tak małym korpusie kolejność modeli zależy od podziału.
Porównanie tokenizacji. Bigram znakowy (34 symbole: litery, spacja i koniec zdania) ma na tym samym teście perpleksję 12,73 na znak, czyli 3,67 bitu na znak. Bigram słowny z k = 0,1, przeliczony na znaki, daje 1,38 bitu na znak — pozornie prawie trzy razy lepiej. Ale to złudzenie: model słowny za każde z 33 nieznanych słów płaci tylko raz, za symbol ⟨unk⟩, i nie musi go przeliterować. Model znakowy przewiduje cały tekst, łącznie z nieznanymi słowami. Liczby różnią się, bo modele rozwiązują inne zadania.
Jak to policzono
- Korpus:
site-src/course/labs/next-token.corpus.js, częśćpl— 52 zdania, jedno na linię, napisane do kursu (nie z książki). Tokeny: wyrażenie regularne z ćwiczenia kursu ([\p{L}\p{N}]+(?:['’-][\p{L}\p{N}]+)*oraz.!?jako koniec zdania), małe litery; kontekst pierwszego słowa to znacznik początku zdania. - Podział: zdania o numerach i z i mod 4 = 3 → test (13 zdań, 77 tokenów), reszta → trening (39 zdań, 212 tokenów). Słownik treningowy 125 typów (z końcem zdania) + ⟨unk⟩ = 126. Słowa testowe spoza słownika: 33 tokeny, 30 różnych.
- Perpleksja trening / test: jednostajny 126 / 126; unigram bez wygładzania 71,71 / ∞; unigram k = 1: 74,44 / 112,41; unigram k = 0,1: 71,80 / 236,07; bigram bez wygładzania 2,51 / ∞; bigram k = 1: 60,67 / 116,71; k = 0,1: 14,41 / 114,94; k = 0,01: 4,14 / 161,49. Interpolacja bigramu (bez wygładzania) z unigramem k = 1: λ = 0,3: 7,19 / 116,24; λ = 0,5: 4,68 / 145,68; λ = 0,7: 3,47 / 215,08; λ = 0,9: 2,77 / 526,31. Wygładzanie: p = (licznik + k) / (suma + 126·k).
- Pary testowe niewidziane w treningu: 65 z 77. Pozostałe trzy podziały (i mod 4 = 0, 1, 2): słowa nieznane 44,3%, 40,8%, 33,8% tokenów testowych; jednostajny 126, 127, 132; unigram k = 1: 117,34; 109,18; 105,09; bigram k = 0,1: 123,12; 98,86; 98,19.
- Znaki: zdanie jako znaki ze spacjami + koniec zdania, bigram znakowy k = 0,1 na 34 symbolach + ⟨unk⟩: perpleksja 12,73 na 381 znakach testu (3,67 bitu/znak, łącznie 1398 bitów). Bigram słowny k = 0,1: łącznie 527 bitów → 1,38 bitu/znak.
Python 3.13, tylko biblioteka standardowa (re,math,collections.Counter); bez losowości.
W praktyce
- Porównuj perpleksję tylko przy tym samym tokenizatorze, tym samym tekście testowym i tej samej obsłudze słów nieznanych. Między różnymi tokenizatorami raportuj bity na znak lub bajt.
- Liczy się wyłącznie perpleksja na tekście odłożonym, którego model nie widział. Sprawdź, czy tekst testowy nie wyciekł do danych treningowych — wtedy perpleksja jest zaniżona.
- W
transformersperpleksja toexp(loss)z modelu przyczynowego; przy tekstach dłuższych niż okno kontekstu licz ją oknem przesuwnym, bo wynik zależy od długości dostępnego kontekstu. - Perpleksja dobrze śledzi postęp pretreningu i porównuje warianty tego samego modelu. Nie mierzy prawdziwości, przydatności ani bezpieczeństwa odpowiedzi — do tego potrzebne są osobne testy zadań.
- Gdzie się psuje: słowa nieznane zamieniane na jeden symbol ⟨unk⟩ sztucznie obniżają perpleksję; mniejszy słownik też; model może mieć niską perpleksję, a pisać tekst bez sensu, jak unigram w przykładzie.
Najczęstsze pytania
- Czy niższa perpleksja oznacza lepszy model?
- Tylko przy tym samym tokenizatorze i tym samym tekście testowym, i tylko w sensie „lepiej przewiduje ten rodzaj tekstu”. Model nagradzany za przewidywanie tekstu z internetu przewiduje także jego błędy. Jakość odpowiedzi na pytania trzeba mierzyć osobno.
- Jak przeliczyć perpleksję na bity i stratę?
- Strata (entropia krzyżowa w natach) = ln PPL, bity na token = log₂ PPL. Strata 2 naty to perpleksja e² ≈ 7,39 i 2,89 bitu na token.
- Skąd nieskończona perpleksja?
- Z jednego tokenu, któremu model dał prawdopodobieństwo zero. W przykładzie unigram bez wygładzania trafia na 33 słowa nieznane, a bigram na 65 niewidzianych par. Każdy praktyczny model musi zostawić trochę prawdopodobieństwa na rzeczy niewidziane.
- Czy perpleksja 126 to dużo?
- Zależy od słownika. Dla modelu jednostajnego na 126 słowach to dokładnie zgadywanie na ślepo. Dla modelu z 50 000 tokenów byłaby to duża poprawa nad zgadywaniem. Sama liczba bez słownika i zbioru testowego niewiele mówi.
Źródła
- Jelinek, F., Mercer, R. L., Bahl, L. R., Baker, J. K. (1977). „Perplexity — a measure of the difficulty of speech recognition tasks”. Journal of the Acoustical Society of America, 62(S1), S63.
- Shannon, C. E. (1951). „Prediction and entropy of printed English”. Bell System Technical Journal, 30(1), 50–64. https://doi.org/10.1002/j.1538-7305.1951.tb01366.x
- Chen, S. F., Goodman, J. (1999). „An empirical study of smoothing techniques for language modeling”. Computer Speech and Language, 13(4), 359–394. Wersja raportu: Harvard TR-10-98, https://dash.harvard.edu/bitstream/handle/1/25104739/tr-10-98.pdf
- Jurafsky, D., Martin, J. H. Speech and Language Processing, 3rd ed. draft, rozdz. 3 (N-gram Language Models: perpleksja, wygładzanie, interpolacja). https://web.stanford.edu/~jurafsky/slp3/
- Hugging Face Transformers: „Perplexity of fixed-length models”. https://huggingface.co/docs/transformers/perplexity
Czy to było pomocne?
Dzięki! To pomaga nam poprawiać Atlas.