ML Atlas

Kurs: modele językowe od środka · Lekcja 2 z 12 · 14 min

Pretrening: tekst sam jest etykietą

W skrócie

W pretreningu etykietą jest następny token (w labie: znak), a jakość mierzy perpleksja. Kiedy dłuższy kontekst pomaga, a kiedy na małych danych przegrywa?

Rozgrzewka Dwa pytania z kursów NN i ML, na których ta lekcja się opiera. Minuta, a lekcji nie blokuje.
Z kursu NN, lekcja 4: Wyjście i strata: softmax i entropia krzyżowa Model daje prawdziwej klasie 0,01. Ile wynosi entropia krzyżowa tego przykładu?

Pokaż odpowiedź

Poprawna odpowiedź: Około 4,6

Entropia krzyżowa to −ln p prawdziwej klasy, a −ln 0,01 ≈ 4,61.

Z kursu ML, lekcja 7.2: Od sieci neuronowych do dużych modeli językowych Na jakim zadaniu trenuje się duży model językowy?

Pokaż odpowiedź

Poprawna odpowiedź: Na przewidywaniu następnego tokenu na podstawie wcześniejszych

LLM uczy się dawać wysokie prawdopodobieństwo faktycznemu następnemu tokenowi, a cała reszta wyrasta z tego zadania.

Model językowy po pretreningu umie jedno: ocenić, co będzie dalej. Do nauki nie potrzebuje nikogo, kto opisze dane. Każde miejsce w tekście samo daje przykład: wejściem jest to, co było wcześniej, etykietą następny znak albo token. Tekst sam jest etykietą, dlatego pretrening nazywa się uczeniem samonadzorowanym. Ta lekcja mierzy, jak dobrze model to robi, i sprawdza, kiedy więcej kontekstu naprawdę pomaga.

Przewidź, potem sprawdź Model znakowy zlicza 300 znaków tekstu treningowego. Jeden patrzy na 1 poprzednią literę, drugi na 3. Który ma niższą perpleksję na walidacji, czyli na zdaniach, których nie zliczał?
Jak bardzo jesteś pewny(-a)?

Eksperyment

Ten interaktywny eksperyment działa w przeglądarce z włączonym JavaScriptem. Tekst wokół opisuje, co w nim widać. W eksperymencie: Znakowy model n-gramowy uczony na coraz dłuższym polskim tekście: perpleksja na tekście odłożonym spada z 23 do 8, a w próbkach rośnie udział prawdziwych słów (z 14% do 30%).

Pokaż odpowiedź

Poprawna odpowiedź: Kontekst 1 litery

Przy 300 znakach kontekst 1 wygrywa na każdym z 5 startów (na starcie 1: 17,35 wobec 18,26). Kontekst 3 ma za mało przykładów: na starcie 1 w 69,5% miejsc walidacji trzyliterowy kontekst nie wystąpił w 300 znakach treningu ani razu. Na startach 1–5 wyprzedza kontekst 1 dopiero przy 2000 albo 3000 znaków, zależnie od startu.

Spróbuj

  • Przy 300 znakach przełączaj konteksty i porównuj dwie liczby: perpleksję na tekście treningowym i na walidacji.
  • Z kontekstem 3 przesuwaj suwak w prawo. Od ilu znaków kontekst 3 ma na walidacji niższą perpleksję niż kontekst 1? To cel labu; test zobaczysz raz, po jego spełnieniu.
  • Przy 1000 znaków sprawdź wszystkie trzy konteksty: który wygrywa na walidacji na tym starcie?

Pomysł w prostych słowach

Model w labie to zabawka, nie sieć: zlicza, jaka litera pada po 1, 2 albo 3 poprzednich, i z tych zliczeń robi rozkład następnej litery. Gdy dłuższego kontekstu nie widział, cofa się do krótszego. Zdania tekstu są losowo podzielone na dwie części: 17 z 85 to walidacja, a z reszty model zlicza pierwsze n znaków. Tekst testowy leży osobno i nie służy do żadnego wyboru.

Perpleksja to exp ze średniej entropii krzyżowej na znak, tej samej straty co w kursie NN. Czyta się ją jak liczbę równie prawdopodobnych opcji, między którymi model się waha. Zgadywanie na ślepo spośród 34 znaków daje perpleksję 34. Kontekst 3 po zliczeniu 4000 znaków ma na walidacji startu 1 perpleksję 8,93 (na startach 1–5 od 8,93 do 11,91): średnia entropia krzyżowa to 2,19, a exp(2,19) ≈ 8,9.

Dlaczego to działa

Dłuższy kontekst niesie więcej informacji, ale ma o wiele więcej możliwych wartości: 34 dla jednej litery, 39304 dla trzech. Każdy z nich trzeba zobaczyć w treningu, żeby jego zliczenia coś znaczyły. Przy 300 znakach większość trzyliterowych kontekstów walidacji jest nowa, więc kontekst 3 cofa się do krótszych albo zgaduje z kilku przypadkowych zliczeń. Przy 4000 znaków kontekst 3 ma na walidacji startu 1 perpleksję 8,93, a kontekst 1 aż 11,30: danych starcza już na dłuższy kontekst. Kontekst 1 przegrywa przy 4000 znaków na wszystkich 5 startach. Między 1000 a 4000 znaków zwycięzca zależy jednak od tego, które zdania trafiły do walidacji: przy 1000 znaków kontekst 2 wygrywa tylko na starcie 1 (13,45), na pozostałych czterech jeszcze kontekst 1, a przy 4000 znaków kontekst 3 jest najlepszy na 3 z 5 startów, na dwóch pozostałych kontekst 2.

Rzadkie konteksty to nie wada tego tekstu, tylko cecha języka. Widżet hasła Prawo Zipfa pokazuje, że częstość słowa spada z jego pozycją w rankingu prawie jak 1 przez pozycję (nachylenie −0,92 dla 20 najczęstszych słów). Przy takim rozkładzie większość różnych słów to słowa rzadkie, a z rzadkimi słowami przychodzą rzadkie układy liter. Prawdziwe modele odpowiadają na to skalą: każdy z modeli Pythia, także najmniejszy, z 70 mln parametrów, uczył się na ok. 300 mld tokenów [1]. To ok. 75 mln razy więcej jednostek tekstu niż 4000 znaków labu, a token to zwykle więcej niż jeden znak.

Częsty błąd

Prawda czy fałsz: „Niższa perpleksja na tekście treningowym to lepszy model.” Fałsz. W labie (start 1) kontekst 3 po zliczeniu 300 znaków ma na tym samym tekście perpleksję 2,37, a na walidacji 18,26, gorzej niż kontekst 1 (17,35). Na tekście, który sam zliczył, model zna każdy kontekst, więc ocena jest zawyżona. Na każdym z 5 startów jest tak samo: kontekst 3 ma na treningu poniżej 2,5, a na walidacji gorzej niż kontekst 1. Model porównuje się na tekście, którego nie widział w treningu.

Quiz

Trzy pytania na sprawdzenie się. Wybierz odpowiedź albo rozwiń odpowiedź pod pytaniem. Z klawiatury: strzałki wybierają, Enter albo spacja zatwierdza.

1. Średnia entropia krzyżowa modelu na znakach walidacji wynosi 2,19. Ile wynosi perpleksja?
Pokaż odpowiedź

Poprawna odpowiedź: Około 8,9

Perpleksja to exp ze średniej entropii krzyżowej: exp(2,19) ≈ 8,9. W labie tyle ma kontekst 3 po zliczeniu 4000 znaków.

2. Start 1, model zliczył 1000 znaków tekstu treningowego. Który kontekst ma najniższą perpleksję na walidacji?
Pokaż odpowiedź

Poprawna odpowiedź: Kontekst 2 liter

Na starcie 1 przy 1000 znaków kontekst 2 ma 13,45, kontekst 1 13,60, a kontekst 3 13,93. To wynik tego startu: na startach 2–5 przy 1000 znaków wygrywa kontekst 1, więc kontekst 2 wygrywa tu na 1 z 5 startów.

3. Start 1, 300 znaków, kontekst 3: perpleksja 2,37 na tekście treningowym i 18,26 na walidacji. Co z tego wynika?
Pokaż odpowiedź

Poprawna odpowiedź: Model zna głównie zliczony tekst; o nowym tekście mówi walidacja

Na walidacji kontekst 1 ma 17,35, czyli mniej niż kontekst 3. Przy 4000 znaków kontekst 3 spada na walidacji do 8,93, więc więcej tekstu pomaga.

Najważniejsze wnioski

  • W pretreningu każde miejsce tekstu to przykład: wejściem jest to, co było wcześniej, etykietą następny znak albo token.
  • Perpleksja to exp ze średniej entropii krzyżowej; czyta się ją jak liczbę opcji, między którymi model się waha.
  • Dłuższy kontekst pomaga dopiero, gdy danych starcza, żeby jego wartości się powtarzały; na małym tekście przegrywa.
  • Modele porównuje się na walidacji, a test zostaje na jedną ocenę końcową; perpleksja treningowa jest zawyżona.

Źródła (sprawdzone 26.10.2026)

  1. arxiv.org/abs/2304.01373: Pythia: 16 otwartych modeli od 70 mln do 12 mld parametrów; każdy uczony na ok. 300 mld tokenów (Biderman i in. 2023, rozdział 2.4). (sprawdzone 26.10.2026)

Głębiej: wzór, kod, praktyka

Matematyka

Model daje rozkład p(x_t | x_(t−c) … x_(t−1)). Średnia entropia krzyżowa na N ocenianych pozycjach i perpleksja:

  • H = −(1/N) · Σ_t ln p(x_t | kontekst), a PPL = e^H. Przy rozkładzie jednostajnym na V znakach H = ln V, więc PPL = V.
  • Z logarytmem o podstawie 2 zamiast ln entropia wychodzi w bitach na znak, a PPL = 2^H daje tę samą perpleksję.
  • Zliczenia z cofaniem: p_0(a) = (n(a) + 1) / (N_0 + V), a dla kontekstu długości j: p_j(a) = (n_j(a) + α · p_(j−1)(a)) / (N_j + α), gdzie n_j(a) to liczba wystąpień litery a po tych j literach, N_j ich suma, a α = 4.
  • Możliwych kontekstów długości c jest V^c; tekst o długości n pokaże ich najwyżej n, więc dla dużego c większość ma zero zliczeń.
  • Perpleksję można porównywać tylko na tym samym tekście i z tą samą jednostką (znak, token tego samego tokenizatora).
W kodzie (Python)

Ten sam model w numpy na krótkim tekście: zliczenia z cofaniem, entropia krzyżowa i perpleksja na treningu oraz na walidacji z nowymi słowami.

import numpy as np
from collections import Counter

train = "ala ma kota. kot ma ale. ala lubi kota. kot lubi mleko. ola ma psa. pies lubi ole. "
val = "ewa je ser. tomek pije wodę. "
alphabet = sorted(set(train + val))
V = len(alphabet)

def count(text, c):  # counts of the next letter after every context of length 0…c
    return [Counter((text[i - j:i], text[i]) for i in range(j, len(text))) for j in range(c + 1)]

def prob(tables, ctx, alpha=4.0):  # back-off: start from letter frequencies, refine with longer contexts
    row = lambda j, x: np.array([tables[j][(x, ch)] for ch in alphabet], dtype=float)
    p = (row(0, "") + 1) / (row(0, "").sum() + V)
    for j in range(1, len(tables)):
        r = row(j, ctx[-j:])
        if r.sum() == 0:
            break
        p = (r + alpha * p) / (r.sum() + alpha)
    return p

def perplexity(tables, text):  # exp(mean cross-entropy per letter), scored from position 3
    ce = [-np.log(prob(tables, text[i - 3:i])[alphabet.index(text[i])]) for i in range(3, len(text))]
    return np.exp(np.mean(ce)), np.mean(ce)

print(f"{len(train)} letters of training text = {len(train) - 3} scored examples, alphabet {V}")
for c in [1, 3]:
    t = count(train, c)
    (pt, _), (pv, ce) = perplexity(t, train), perplexity(t, val)
    print(f"context {c}: train perplexity {pt:.2f}, validation {pv:.2f} (mean cross-entropy {ce:.2f}, exp = {np.exp(ce):.2f})")

Wynik

83 letters of training text = 80 scored examples, alphabet 19
context 1: train perplexity 3.47, validation 27.66 (mean cross-entropy 3.32, exp = 27.66)
context 3: train perplexity 1.81, validation 29.86 (mean cross-entropy 3.40, exp = 29.86)

Kontekst 3 ma niższą perpleksję na treningu i wyższą na walidacji: to samo co w labie przy 300 znakach, tylko na tekście, który mieści się na ekranie. Na walidacji z samymi nowymi słowami oba modele wypadają gorzej niż zgadywanie na ślepo spośród 19 znaków alfabetu: zliczenia z treningu prowadzą je w złą stronę. Uruchomione w numpy 2.1.3.

Dla praktyka
  • Raportuj perpleksję razem z tokenizatorem i zbiorem, na którym ją liczysz: liczby z różnymi tokenizatorami nie są porównywalne, bo średnia idzie po innych jednostkach.
  • Walidację wydzielaj całymi dokumentami, a nie losowymi zdaniami z tych samych tekstów, gdy dokumenty się powtarzają: inaczej model widzi ten sam tekst w treningu i na walidacji. W labie żadne zdanie się nie powtarza, więc podział zdaniami jest tu uczciwy.
  • Przy każdym zdaniu o treningu podawaj budżet: ile tokenów albo kroków. Bez tego „model A jest lepszy” nic nie znaczy.
  • Spadek perpleksji na tekście treningowym przy płaskiej walidacyjnej to znak zapamiętywania; przerwij albo dodaj danych.

Więcej w Atlasie

Hasła encyklopedii o pojęciach z tej lekcji: