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.
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.
Wybierz odpowiedź i pewność.
Odpowiedz, żeby odblokować lab.
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.
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)
- 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), aPPL = e^H. Przy rozkładzie jednostajnym naVznakachH = ln V, więcPPL = V.- Z logarytmem o podstawie 2 zamiast
lnentropia wychodzi w bitach na znak, aPPL = 2^Hdaje tę samą perpleksję. - Zliczenia z cofaniem:
p_0(a) = (n(a) + 1) / (N_0 + V), a dla kontekstu długościj:p_j(a) = (n_j(a) + α · p_(j−1)(a)) / (N_j + α), gdzien_j(a)to liczba wystąpień literyapo tychjliterach,N_jich suma, aα = 4. - Możliwych kontekstów długości
cjestV^c; tekst o długościnpokaże ich najwyżejn, więc dla dużegocwię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.
Pobierz notebook (.ipynb). Otwórz go w Jupyterze albo wgraj do Google Colab; brakujące dane pobierze sam.
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: