96 lines
5.3 KiB
Markdown

# 1. Tokenizacija
## Tokenizacija
**Tokenizacija** je proces razbijanja podataka, kao što je tekst, na manje, upravljive delove nazvane _tokeni_. Svakom tokenu se zatim dodeljuje jedinstveni numerički identifikator (ID). Ovo je osnovni korak u pripremi teksta za obradu od strane modela mašinskog učenja, posebno u obradi prirodnog jezika (NLP).
> [!TIP]
> Cilj ove inicijalne faze je vrlo jednostavan: **Podelite ulaz u tokene (ids) na način koji ima smisla**.
### **Kako funkcioniše tokenizacija**
1. **Deljenje teksta:**
- **Osnovni tokenizator:** Jednostavan tokenizator može podeliti tekst na pojedinačne reči i interpunkcijske znakove, uklanjajući razmake.
- _Primer:_\
Tekst: `"Zdravo, svete!"`\
Tokeni: `["Zdravo", ",", "svete", "!"]`
2. **Kreiranje rečnika:**
- Da bi se tokeni pretvorili u numeričke ID-ove, kreira se **rečnik**. Ovaj rečnik sadrži sve jedinstvene tokene (reči i simbole) i dodeljuje svakom specifičan ID.
- **Specijalni tokeni:** Ovo su specijalni simboli dodati rečniku za upravljanje raznim scenarijima:
- `[BOS]` (Početak sekvence): Označava početak teksta.
- `[EOS]` (Kraj sekvence): Označava kraj teksta.
- `[PAD]` (Podočnjaci): Koristi se da sve sekvence u grupi budu iste dužine.
- `[UNK]` (Nepoznat): Predstavlja tokene koji nisu u rečniku.
- _Primer:_\
Ako je `"Zdravo"` dodeljen ID `64`, `","` je `455`, `"svete"` je `78`, i `"!"` je `467`, tada:\
`"Zdravo, svete!"``[64, 455, 78, 467]`
- **Upravljanje nepoznatim rečima:**\
Ako reč kao što je `"Zbogom"` nije u rečniku, zamenjuje se sa `[UNK]`.\
`"Zbogom, svete!"``["[UNK]", ",", "svete", "!"]``[987, 455, 78, 467]`\
_(Pretpostavljajući da `[UNK]` ima ID `987`)_
### **Napredne metode tokenizacije**
Dok osnovni tokenizator dobro funkcioniše za jednostavne tekstove, ima ograničenja, posebno sa velikim rečnicima i upravljanjem novim ili retkim rečima. Napredne metode tokenizacije rešavaju ove probleme razbijanjem teksta na manje podjedinice ili optimizovanjem procesa tokenizacije.
1. **Byte Pair Encoding (BPE):**
- **Svrha:** Smanjuje veličinu rečnika i upravlja retkim ili nepoznatim rečima razbijajući ih na često korišćene parove bajtova.
- **Kako funkcioniše:**
- Počinje sa pojedinačnim karakterima kao tokenima.
- Iterativno spaja najčešće parove tokena u jedan token.
- Nastavlja dok se ne mogu spojiti više nijedni česti parovi.
- **Prednosti:**
- Eliminira potrebu za `[UNK]` tokenom jer se sve reči mogu predstaviti kombinovanjem postojećih podrečnih tokena.
- Efikasniji i fleksibilniji rečnik.
- _Primer:_\
`"igranje"` može biti tokenizovano kao `["igra", "nje"]` ako su `"igra"` i `"nje"` česti podrečni tokeni.
2. **WordPiece:**
- **Koriste:** Modeli poput BERT.
- **Svrha:** Slično BPE, razbija reči na podrečne jedinice kako bi se upravljalo nepoznatim rečima i smanjila veličina rečnika.
- **Kako funkcioniše:**
- Počinje sa osnovnim rečnikom pojedinačnih karaktera.
- Iterativno dodaje najčešći podrečni token koji maksimizira verovatnoću podataka za obuku.
- Koristi probabilistički model da odluči koje podrečne tokene spojiti.
- **Prednosti:**
- Balansira između upravljive veličine rečnika i efikasnog predstavljanja reči.
- Efikasno upravlja retkim i složenim rečima.
- _Primer:_\
`"nezadovoljstvo"` može biti tokenizovano kao `["ne", "zadovoljstvo"]` ili `["ne", "zadovoljan", "stvo"]` u zavisnosti od rečnika.
3. **Unigram jezički model:**
- **Koriste:** Modeli poput SentencePiece.
- **Svrha:** Koristi probabilistički model da odredi najverovatniji skup podrečnih tokena.
- **Kako funkcioniše:**
- Počinje sa velikim skupom potencijalnih tokena.
- Iterativno uklanja tokene koji najmanje poboljšavaju verovatnoću modela za obuku.
- Finalizuje rečnik gde je svaka reč predstavljena najverovatnijim podrečnim jedinicama.
- **Prednosti:**
- Fleksibilan i može prirodnije modelovati jezik.
- Često rezultira efikasnijim i kompaktnijim tokenizacijama.
- _Primer:_\
`"internacionalizacija"` može biti tokenizovana u manje, smislene podrečne reči kao `["internacional", "izacija"]`.
## Primer koda
Hajde da ovo bolje razumemo kroz primer koda sa [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch02/01_main-chapter-code/ch02.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch02/01_main-chapter-code/ch02.ipynb):
```python
# Download a text to pre-train the model
import urllib.request
url = ("https://raw.githubusercontent.com/rasbt/LLMs-from-scratch/main/ch02/01_main-chapter-code/the-verdict.txt")
file_path = "the-verdict.txt"
urllib.request.urlretrieve(url, file_path)
with open("the-verdict.txt", "r", encoding="utf-8") as f:
raw_text = f.read()
# Tokenize the code using GPT2 tokenizer version
import tiktoken
token_ids = tiktoken.get_encoding("gpt2").encode(txt, allowed_special={"[EOS]"}) # Allow the user of the tag "[EOS]"
# Print first 50 tokens
print(token_ids[:50])
#[40, 367, 2885, 1464, 1807, 3619, 402, 271, 10899, 2138, 257, 7026, 15632, 438, 2016, 257, 922, 5891, 1576, 438, 568, 340, 373, 645, 1049, 5975, 284, 502, 284, 3285, 326, 11, 287, 262, 6001, 286, 465, 13476, 11, 339, 550, 5710, 465, 12036, 11, 6405, 257, 5527, 27075, 11]
```
## Reference
- [https://www.manning.com/books/build-a-large-language-model-from-scratch](https://www.manning.com/books/build-a-large-language-model-from-scratch)