1. Tokenizing

Tokenizing

Tokenizing je proces razbijanja podataka, kao što je tekst, na manje, upravljive delove nazvane tokens. 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).

Cilj ove inicijalne faze je vrlo jednostavan: Podeliti ulaz u tokene (ids) na način koji ima smisla.

Kako Tokenizing Funkcioniše

  1. Deljenje Teksta:

  • Osnovni Tokenizer: Jednostavan tokenizer može podeliti tekst na pojedinačne reči i interpunkcijske znakove, uklanjajući razmake.

  • Primer: Tekst: "Hello, world!" Tokeni: ["Hello", ",", "world", "!"]

  1. Kreiranje Rečnika:

  • Da bi se tokeni pretvorili u numeričke ID-ove, kreira se rečnik. Ovaj rečnik navodi sve jedinstvene tokene (reči i simbole) i dodeljuje svakom specifičan ID.

  • Specijalni Tokeni: Ovo su posebni simboli dodati rečniku za upravljanje raznim scenarijima:

  • [BOS] (Početak Sekvence): Ukazuje na početak teksta.

  • [EOS] (Kraj Sekvence): Ukazuje na kraj teksta.

  • [PAD] (Podočnjaci): Koristi se da sve sekvence u grupi budu iste dužine.

  • [UNK] (Nepoznato): Predstavlja tokene koji nisu u rečniku.

  • Primer: Ako je "Hello" dodeljen ID 64, "," je 455, "world" je 78, i "!" je 467, tada: "Hello, world!"[64, 455, 78, 467]

  • Upravljanje Nepoznatim Rečima: Ako reč poput "Bye" nije u rečniku, zamenjuje se sa [UNK]. "Bye, world!"["[UNK]", ",", "world", "!"][987, 455, 78, 467] (Pretpostavljajući da [UNK] ima ID 987)

Napredne Metode Tokenizacije

Dok osnovni tokenizer 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 učestali 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: "playing" može biti tokenizovan kao ["play", "ing"] ako su "play" i "ing" česti podrečni tokeni.

  1. 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 koji maksimizira verovatnoću podataka za obuku.

  • Koristi probabilistički model da odluči koje podrečne reči spojiti.

  • Prednosti:

  • Balansira između upravljive veličine rečnika i efikasnog predstavljanja reči.

  • Efikasno upravlja retkim i složenim rečima.

  • Primer: "unhappiness" može biti tokenizovan kao ["un", "happiness"] ili ["un", "happy", "ness"] u zavisnosti od rečnika.

  1. Unigram Language 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 obučene podatke.

  • Finalizuje rečnik gde je svaka reč predstavljena najverovatnijim podrečnim jedinicama.

  • Prednosti:

  • Fleksibilan i može modelovati jezik prirodnije.

  • Često rezultira efikasnijim i kompaktnijim tokenizacijama.

  • Primer: "internationalization" može biti tokenizovan u manje, smislene podrečne reči kao što su ["international", "ization"].

Code Example

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]

References

Last updated