ai-engineer.sh
GitHub

How Tokenizers Are Built

Stranica Tokenization objasnila je šta je token — diskretnu jedinicu koju LLM zapravo čita. Ova stranica govori o tokenizer-u koji ih proizvodi: kako se gradi, koja tri pristupa možete da izaberete, i zašto skoro svaki moderni LLM završi na istom — subword tokenization izgrađen pomoću Byte-Pair Encoding (BPE).

Two phases: training and inference

Tokenizer ima dva različita trenutka u svom životu: training phase, u kojoj se njegov vocabulary gradi jednom, i inference phase, u kojoj se taj fiksni vocabulary koristi iznova i iznova.

Training phase

Tokom treninga tokenizer-u dajete ogromnu količinu očišćenog teksta. On deli taj tekst na male jedinice, a zatim skuplja svaku jedinstvenu jedinicu u vocabulary — tabelu koja mapira svaki token u celobrojni ID.

Prvi korak je text splitting: razbijanje dugačkog toka teksta na manje delove. Drugi je building the vocabulary: prikupljanje jedinstvenih delova i dodeljivanje ID-a svakom od njih. Svaka jedinstvena jedinica je ono što zovemo token, a tabela token-na-ID je vocabulary.

Nemojte da brkate treniranje tokenizer-a sa treniranjem modela. Izgradnja vocabulary-ja samo proizvodi tu lookup tabelu. Model se trenira odvojeno — on uči statističke obrasce između token ID-eva optimizujući milijarde parametara neuronske mreže.

Inference phase

Kada vocabulary jednom postoji, on je zamrznut. U inference fazi tokenizer ga samo primenjuje — u oba smera:

Kada pošaljete tekst LLM-u, tokenizer ga encode-uje u sekvencu token ID-eva. Model pretvara te ID-eve u embedding vektore, obavlja računanje i predviđa sledeći token ID jedan po jedan. Tokenizer zatim decode-uje generisane ID-eve nazad u tekst.

Tokenizer je reverzibilan: encoding pretvara tekst u ID-eve, decoding pretvara ID-eve nazad u tekst. Isti vocabulary pokreće oba smera. Sam model nikada ne radi sa rečima — samo sa numeričkim ID-evima i njihovim embedding-zima.

Three families of tokenizer

Deo koji se zapravo razlikuje između LLM-ova je algoritam deljenja — kako tekst postaje tokeni. Postoje tri široka pristupa:

Word-level i character-level tokenizer-i se retko koriste za treniranje modernih frontier modela. Skoro svaki današnji LLM koristi subword-level tokenization — druga dva pristupa imaju mane koje ih čine lošim izborom na velikoj skali.

Word-level

Word-level tokenizer deli tekst po whitespace-u i interpunkciji, pa je svaki token cela reč. Perfectly fine postaje [Perfectly, fine], a zatim se mapira u ID-eve poput [52141, 7060].

Deluje prirodno, ali vocabulary eksplodira. Internet sadrži ogroman broj različitih reči — kroz jezike, plus žargon, imena kompanija i proizvoda, lična imena, URL-ove, tipografske greške i kod. Vocabulary naraste na stotine hiljada ili čak milione unosa:

TokenID
a0
about1
after2
zebra270030
!270131

Ogroman vocabulary naduvava memoriju: embedding matrica i izlazni sloj moraju da pokriju svaki token. Gore je out-of-vocabulary (OOV) problem — model može da naiđe na reč koju nikada nije video tokom treninga i nema načina da je predstavi.

Character-level

Character-level tokenizer deli tekst na pojedinačne karaktere. Perfectly fine postaje 14 tokena: [P, e, r, f, e, c, t, l, y, (space), f, i, n, e]. Svaki karakter — slovo, cifra, razmak, interpunkcija ili bilo koji Unicode simbol — dobija ID.

TokenID
a0
b1
A26
!57
<SPACE>105

Vocabulary je sićušan i nema OOV problema. Ali sekvence postaju veoma dugačke — 14 tokena tamo gde je word-level koristio 2. Dugačke sekvence znače mnogo više računanja, jer Transformer mora da obradi i poveže svaki token. Model takođe mora da nauči kako se karakteri kombinuju u reči i kako te reči nose značenje, što otežava učenje.

Subword-level

Subword-level tokenization je kompromis, i današnji standard. Česte reči dobijaju svoj token; ređe ili neviđene reči se razbijaju na manje subword komade. Perfectly fine može da postane [Perfect, ly, fine].

TokenID
the0
of1
home2
##ing50252
##ed50253
##able50254
<EOS>50255
<SPACE>50256

Prefiks ## označava komad koji nastavlja prethodni token (pa walking[walk, ##ing]). To daje umeren vocabulary, prihvatljive dužine sekvenci i elegantno baratanje potpuno novim rečima.

PristupVeličina vocabulary-jaDužina sekvenceNepoznate rečiKoristi se za frontier modele
Word-levelVeoma velika (100K–milioni)KratkaPuca (OOV)Retko
Character-levelSićušna (~stotine)Veoma dugaNema OOV, ali ni osećaj za rečRetko
Subword-levelUmerena (50K–200K)UmerenaSastavlja se od subword-ovaStandard

Moderni LLM-ovi obično koriste vocabulary između 50.000 i 200.000 tokena — GPT-2 je koristio ~50K, GPT-4 cl100k ~100K, a GPT-4o o200k 200K. To je namerni kompromis između veličine vocabulary-ja i dužine sekvence.

Byte-Pair Encoding, step by step

Najpopularniji algoritam za izgradnju subword vocabulary-ja je Byte-Pair Encoding (BPE). (WordPiece i SentencePiece su bliski rođaci.) BPE je prvobitno bio algoritam za kompresiju teksta; OpenAI ga je usvojio za tokenizaciju GPT-a.

Ključna ideja: kreće se od pojedinačnih karaktera, pa se iterativno spaja najčešći susedni par u novi, veći token.

Recimo da trening podaci sadrže ove reči:

Plain Text
low
lower
lowest

BPE prvo predstavlja svaku reč kao sekvencu karaktera:

Plain Text
low     → l o w
lower   → l o w e r
lowest  → l o w e s t

Zatim skenira ceo korpus i broji koliko često se javlja svaki susedni par. Cilj nije pronaći cele reči — već pronaći obrasce koji se često ponavljaju. Par (l, o) se pojavljuje u sve tri reči, pa se spaja u novi token lo:

Plain Text
lo w
lo w e r
lo w e s t

Ponovo broji parove i spaja opet. Ako je (lo, w) sada najčešći par, postaje low:

Plain Text
low
low e r
low e s t

Ovo se ponavlja hiljadama — ponekad desetinama hiljada — puta nad ogromnim količinama teksta, dok vocabulary ne dostigne ciljanu veličinu. Veoma česti obrasci dobijaju svoje tokene. Nekad su to cele reči (low, house, computer); nekad delovi reči (ing, tion, ment, able).

Why start from characters?

Deluje čudno što BPE kreće od karaktera kad character-level tokenization ima problem dugačkih sekvenci. Ali karakteri su samo početna tačka za izgradnju vocabulary-ja — ceo posao BPE-a je da ih spoji u veće, korisne jedinice. Uzmite programming:

Plain Text
Character-level:  p r o g r a m m i n g     (11 tokens)
BPE:              program ming               (2 tokens)

Ako je programming dovoljno čest, BPE ga može čak zadržati kao jedan token. Tako tekst koji bi character-level tokenization razbila na hiljade tokena, BPE često predstavi sa znatno manje. A potpuno nova reč koju model nikada nije video i dalje može da se sastavi od postojećih subword komada — running[run, ning] — pa nema tvrdog OOV zida.

Kraće sekvence znače manje memorije, manje računanja i efikasnije treniranje i inference. Zato je BPE postao zlatna sredina između word-level i character-level pristupa, i zato većina modernih LLM-ova koristi neku varijantu subword tokenization-a.

BPE merge-evi se uče u vreme izgradnje. Brojanje parova i spajanje opisano gore se odvija dok se tokenizer kreira — ne svaki put kad pošaljete poruku. U inference fazi naučeni merge-evi se jednostavno primenjuju na vaš tekst.

Don't build your own

Retko morate da gradite tokenizer od nule. Postoje zreli open-source tokenizer-i — najpoznatiji je OpenAI-jev tiktoken, BPE tokenizer koji možete da ubacite u sopstveni trening ili inference pipeline.

Da biste videli tokenization uživo kroz različite modele, probajte Tiktokenizer playground — nalepite tekst i gledajte kako ga svaki tokenizer deli i dodeljuje ID-eve.

Further reading


Povezano: Tokenization · How LLMs Are Built

Izmeni stranicu na GitHub-u