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:
| Token | ID |
|---|---|
| a | 0 |
| about | 1 |
| after | 2 |
| … | … |
| zebra | 270030 |
| … | … |
| ! | 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.
| Token | ID |
|---|---|
| a | 0 |
| b | 1 |
| … | … |
| A | 26 |
| … | … |
| ! | 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].
| Token | ID |
|---|---|
| the | 0 |
| of | 1 |
| home | 2 |
| … | … |
| ##ing | 50252 |
| ##ed | 50253 |
| ##able | 50254 |
| <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.
| Pristup | Veličina vocabulary-ja | Dužina sekvence | Nepoznate reči | Koristi se za frontier modele |
|---|---|---|---|---|
| Word-level | Veoma velika (100K–milioni) | Kratka | Puca (OOV) | Retko |
| Character-level | Sićušna (~stotine) | Veoma duga | Nema OOV, ali ni osećaj za reč | Retko |
| Subword-level | Umerena (50K–200K) | Umerena | Sastavlja se od subword-ova | Standard |
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-4oo200k200K. 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:
low
lower
lowestBPE prvo predstavlja svaku reč kao sekvencu karaktera:
low → l o w
lower → l o w e r
lowest → l o w e s tZatim 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:
lo w
lo w e r
lo w e s tPonovo broji parove i spaja opet. Ako je (lo, w) sada najčešći par, postaje low:
low
low e r
low e s tOvo 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:
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
- Neural Machine Translation of Rare Words with Subword Units — Sennrich, Haddow i Birch (2016), rad koji je uveo BPE u NLP tokenizaciju.
- Hugging Face NLP Course — Building a tokenizer, block by block — gradi BPE, WordPiece i Unigram tokenizer-e od nule; praktičan pandan poglavlju "don't build your own."
- Hugging Face NLP Course — WordPiece tokenization — kompletan vodič kroz WordPiece i
##prefiks za nastavak koji ova stranica koristi. - google/sentencepiece — Google-ov jezički nezavisan subword tokenizer (BPE + Unigram), jedan od "bliskih rođaka" pomenutih gore.
- Let's build the GPT Tokenizer — Karpathy kodira BPE trening i encode/decode od početka do kraja; živa verzija korak-po-korak dela ove stranice.
Povezano: Tokenization · How LLMs Are Built
Izmeni stranicu na GitHub-u