Sieć pracuje tylko na liczbach: tokeny i kodowanie one-hot

🎯 Po co Ci to?

W Części III sieć dostawała na wejście już liczby: jasności pikseli, kanały RGB, mapy cech. Przy tekście tej wygody nie ma. Litery i słowa nie są liczbami — a sieć umie wyłącznie mnożyć, dodawać i przepuszczać wynik przez funkcję aktywacji (Jednostka 10.1). Zanim więc cokolwiek „przeczyta", ktoś musi zamienić język na reprezentację numeryczną.

Ta jednostka pokazuje najprostszą taką zamianę — i dlaczego, mimo że jest poprawna formalnie, nie nadaje się do uczenia znaczenia. Bez tego nie zrozumiesz, po co wymyślono word2vec.

✅ Czego się nauczysz

Po tej lekcji potrafisz:

  • wyjaśnić, dlaczego sieć neuronowa nie przetwarza tekstu bezpośrednio;
  • opisać tokenizację, słownik i indeks tokenu;
  • zbudować kodowanie z gorącą jedynką (one-hot) dla małego słownika;
  • wskazać trzy problemy tej reprezentacji: kolejność, rozmiar, brak podobieństwa znaczeniowego.

🔁 Przypomnij sobie

Z Jednostki 10.1 wiesz, że sztuczny neuron bierze liczby, mnoży je przez wagi i sumuje. Z Jednostki 12.1 wiesz, że obraz staje się tablicą liczb (piksele) — i dopiero wtedy wchodzi do sieci. Tekst wymaga analogicznego kroku, tylko trudniejszego: nie ma oczywistej „jasności litery".

📘 Trzy zdania i pocięcie na tokeny

Załóżmy, że cały tekst, jakim dysponujemy, składa się z trzech zdań:

  • Ala ma kota.
  • Ja mam psa.
  • Marysia ma czerwonego kanarka.
Trzy zdania — punkt wyjścia do tokenizacji i budowy słownika
Trzy zdania — punkt wyjścia do tokenizacji i budowy słownika

Pierwszą rzeczą, jaką musimy zrobić, jest pocięcie tekstu na mniejsze części — na przykład pojedyncze wyrazy (choć mogą to być też pojedyncze znaki albo sylaby). Nazywamy je tokenami. Sam proces cięcia to tokenizacja. Dla uproszczenia pomijamy znaki interpunkcyjne.

W wyniku tokenizacji dostajemy listę słów-tokenów, którą możemy uporządkować alfabetycznie:

  1. Ala
  2. czerwonego
  3. Ja
  4. kanarka
  5. kota
  6. ma
  7. mam
  8. Marysia
  9. psa

Taką listę wszystkich unikalnych słów z całej kolekcji tekstów nazywamy słownikiem. Każdy token w słowniku ma swój unikalny indeks: „Ala" = 1, „czerwonego" = 2, „Ja" = 3, …

📐 DEFINICJA — token: najmniejsza jednostka, na którą dzielimy tekst przed dalszym przetwarzaniem (słowo, znak, podsłowo — zależnie od metody).

Po ludzku: kawałek tekstu, którym maszyna operuje zamiast „całym zdaniem naraz".

📐 DEFINICJA — tokenizacja: proces dzielenia tekstu na tokeny.

📐 DEFINICJA — słownik: uporządkowana lista wszystkich unikalnych tokenów w kolekcji tekstów; każdy ma indeks.

📘 Reprezentacja: nie byle jaki zapis, tylko użyteczny

Pierwszy pomysł zamiany tekstu na liczby: zastąpić słowa ich indeksami. Zdanie „Ala ma kota" miałoby wtedy reprezentację:

1 6 5

Zatrzymajmy się przy słowie reprezentacja. W informatyce zwykle oznacza ono sposób zapisu, przedstawienia czy uporządkowania danych użyteczny do określonego celu. Dane o sprzedaży czy poparciu partii przedstawiamy wykresami — bo tak szybciej je rozumiemy.

Wykresy jako forma reprezentacji informacji — komputer też potrzebuje reprezentacji dopasowanej do zadania
Wykresy jako forma reprezentacji informacji — komputer też potrzebuje reprezentacji dopasowanej do zadania

Podobnie komputer potrzebuje reprezentacji danych dopasowanej do zadania. Przyjmuje się, że przygotowanie dobrej reprezentacji może zajmować 50–80% czasu projektu uczenia maszynowego. To nie jest drobiazg administracyjny — to sedno.

📘 Kodowanie z gorącą jedynką

Reprezentacja „1 6 5" ma praktyczny problem: sieci neuronowe nie lubią dużych liczb — wygodny dla nich zakres to zwykle okolice przedziału [−1, 1]. Możemy więc zrobić coś innego: połączyć indeksy ze słownika z informacją, czy dane słowo występuje w tekście. Występowanie oznaczamy przez 1, niewystępowanie przez 0.

Tekst złożony z samego słowa „Ala":

(1, 0, 0, 0, 0, 0, 0, 0, 0)

— jedynka na pierwszym miejscu, bo „Ala" jest pierwsza w słowniku. Słowo „psa":

(0, 0, 0, 0, 0, 0, 0, 0, 1)

Taki sposób kodowania nazywa się kodowaniem z gorącą jedynką (ang. one-hot encoding).

Całe zdania (znów: porównaj miejsca jedynek z indeksami w słowniku):

zdanie wektor
Ala ma kota (1, 0, 0, 0, 1, 1, 0, 0, 0)
Ja mam psa (0, 0, 1, 0, 0, 0, 1, 0, 1)
Marysia ma czerwonego kanarka (0, 1, 0, 1, 0, 1, 0, 1, 0)

Każdy taki ciąg to wektor o długości równej rozmiarowi słownika (tu: 9). Proces zamiany tekstu na taki wektor to wektoryzacja tekstu.

📐 DEFINICJA — kodowanie z gorącą jedynką (one-hot): reprezentacja tokenu (lub zbioru tokenów) jako wektora zer z jedynką na pozycji odpowiadającej indeksowi w słowniku.

Po ludzku: długa lista przełączników — zapalony jest tylko ten od danego słowa. Czym to NIE jest: to nie jest jeszcze „rozumienie" — to tylko etykieta pozycji w słowniku.

📐 DEFINICJA — wektor / wektoryzacja tekstu: uporządkowany ciąg liczb reprezentujący tekst; proces tworzenia takiej reprezentacji.

📘 Trzy problemy tej reprezentacji

Pierwszy: kolejność. Wektor (0, 1, 0, 1, 0, 1, 0, 1, 0) mówi tylko, że w tekście są tokeny o indeksach 2, 4, 6 i 8 („czerwonego", „kanarka", „ma", „Marysia"). Nie mówi nic o kolejności. „Marysia ma czerwonego kanarka" i „kanarka ma Marysia czerwonego" dają ten sam worek zapaleń.

Drugi: rozmiar. Przy słowniku 9 tokenów wektor ma długość 9. Przy słowniku 10 000 unikalnych słów wektor „Ala" to jedynka i 9999 zer. Zdanie „Ala ma kota" — trzy jedynki i 9997 zer. To mało ekonomiczne — i kosztowne w obliczeniach.

Trzeci, najistotniejszy: zero informacji o znaczeniu. Intuicyjnie „Ala" jest bliższa „Marysi" niż „kanarkowi" czy „kotu", a „kanarka" i „kota" są bliższe sobie niż pozostałym. Z kształtu wektorów one-hot tego nie widać:

słowo wektor
Ala (1, 0, 0, 0, 0, 0, 0, 0, 0)
Marysia (0, 0, 0, 0, 0, 0, 0, 1, 0)
kanarka (0, 0, 0, 1, 0, 0, 0, 0, 0)
kota (0, 0, 0, 0, 1, 0, 0, 0, 0)

Każda para różnych słów jest jednakowo „odległa": różnią się dokładnie dwiema pozycjami. Dla sieci „pies" i „kot" są tak samo różne jak „pies" i „traktor".

Właśnie te trzy problemy — kolejność, rozmiar i brak sensu — sprawiły, że w 2013 roku powstał word2vec: pomysł, który je adresuje i stanowi krok milowy w kierunku modeli, które niespełna dekadę później dadzą ChatGPT.

💭 Pomyśl

Mamy słownik 50 000 słów. Ile zer ma wektor one-hot pojedynczego słowa? A wektor zdania złożonego z 12 różnych słów (przy założeniu, że zapalasz pozycje obecnych tokenów, bez zliczania powtórzeń)? Co to mówi o koszcie takiej reprezentacji?

Sprawdź odpowiedź

Pojedyncze słowo: 1 jedynka i 49 999 zer. Zdanie z 12 różnymi słowami: 12 jedynek i 49 988 zer. Prawie cały wektor to zera — sieć musi mnożyć i sumować ogromną liczbę nic nieznaczących pozycji. Przy milionie zdań treningowych koszt pamięci i czasu rośnie dramatycznie, a model wciąż nie wie, że „pies" i „kot" są do siebie bliższe niż „pies" i „traktor". Dlatego one-hot jest poprawny jako etykieta, ale bezużyteczny jako reprezentacja znaczenia.

⚠️ Uwaga, pułapka

Nie myl indeksu w słowniku z znaczeniem. Numer 1 przy „Ala" i numer 8 przy „Marysia" nie mówią, że te słowa są do siebie podobne — mówią tylko, gdzie stoją na liście alfabetycznej. Relacja numeryczna (1 jest „bliżej" 2 niż 8) to zbieg kolejności nadawania numerów, nie wiedza o języku.

🌍 Powiązania

Problem „dane muszą być liczbami" znałeś już z obrazów (Jednostka 12.1). Różnica: piksel ma naturalną skalę jasności, a słowo — nie. W Jednostce 14.2 zobaczysz próbę ręcznego nadania słowom cech liczbowych, a w 14.3 — jak sieć uczy się tych cech sama.

📐 Definicje tej lekcji

  • Token / tokenizacja / słownik — jednostka tekstu, proces cięcia, lista unikalnych tokenów z indeksami.
  • Reprezentacja — sposób zapisu danych użyteczny do celu (tu: wejście do sieci).
  • Kodowanie z gorącą jedynką (one-hot) — wektor zer z jedynką na pozycji indeksu.
  • Wektor / wektoryzacja tekstu — ciąg liczb reprezentujący tekst; proces jego tworzenia.

📌 Najważniejsze w pigułce

  • Sieć neuronowa nie czyta liter — pracuje tylko na liczbach; tekst trzeba zamienić na reprezentację numeryczną.
  • Tokenizacja tnie tekst na tokeny; słownik zbiera unikalne tokeny z indeksami.
  • One-hot zapala jedną pozycję w wektorze długości słownika.
  • Trzy problemy: gubi kolejność, rozdyma się przy dużym słowniku, nie koduje podobieństwa znaczeniowego.
  • Stąd potrzeba word2vec (Jednostka 14.3).

🎒 Zadania

Zadanie 14.1.1. Zbuduj słownik (alfabetycznie) dla tekstu: „Kot pije mleko. Pies pije wodę." Potem zapisz one-hot dla słowa „pije" oraz wektor obecności dla zdania „Kot pije mleko" (zapal pozycje obecnych tokenów).

Pokaż rozwiązanie

Słownik (unikalne, alfabetycznie): 1. Kot, 2. mleko, 3. Pies, 4. pije, 5. wodę.
„pije": (0, 0, 0, 1, 0).
„Kot pije mleko": (1, 1, 0, 1, 0) — zapalony Kot, mleko, pije.

Zadanie 14.1.2. Wyjaśnij na przykładzie „pies" / „kot" / „traktor", dlaczego one-hot nie nadaje się do mierzenia podobieństwa znaczeniowego — mimo że „zamienia słowo w liczby".

Pokaż rozwiązanie

Każde z trzech słów dostaje wektor z jedynką na innej pozycji. Odległość (np. liczba różniących się pozycji) między każdą parą różnych słów jest taka sama. Model nie ma skąd wiedzieć, że pies i kot są zwierzętami, a traktor — nie: w one-hot nie ma żadnej wspólnej cechy liczbowej, tylko trzy różne etykiety pozycji.

Zadanie 14.1.3. Dlaczego reprezentacja indeksowa „Ala ma kota" → 1 6 5 jest zła dla sieci, nawet jeśli jest krótsza niż one-hot?

Pokaż rozwiązanie

Bo indeksy to duże, arbitralne liczby, a sieci lubią wejścia w okolicy małego zakresu (często [−1, 1]). Co gorsza, model mógłby „nauczyć się", że większy numer = „większe" słowo — a numer wynika z alfabetu, nie ze znaczenia. One-hot unika skali indeksu, ale wprowadza własne problemy (rozmiar, brak sensu). Obie reprezentacje naiwne są więc niewystarczające.

🔍 Sprawdź, czy umiesz

  • [ ] Wyjaśnić, dlaczego sieć nie przetwarza tekstu bezpośrednio.
  • [ ] Opisać tokenizację, słownik i indeks.
  • [ ] Zbudować one-hot / wektor obecności dla małego przykładu.
  • [ ] Wymienić trzy problemy kodowania z gorącą jedynką.

Ucz się tej jednostki z asystentem