1. Tokenizacija
Reading time: 3 minutes
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
- 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", "!"]
- 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 ID64
,","
je455
,"svete"
je78
, i"!"
je467
, 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 ID987
)
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.
- 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.
- 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.
- 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:
# 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]