mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
96 lines
5.3 KiB
Markdown
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)
|