# 1. Tokenizacija {{#include ../../banners/hacktricks-training.md}} ## 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: `"Hello, world!"`\ Tokeni: `["Hello", ",", "world", "!"]` 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 posebni 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]` (Puneći): Koristi se da sve sekvence u grupi budu iste dužine. - `[UNK]` (Nepoznat): Predstavlja tokene koji nisu u rečniku. - _Primer:_\ Ako je `"Hello"` dodeljen ID `64`, `","` je `455`, `"world"` je `78`, a `"!"` 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 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 č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:_\ `"playing"` može biti tokenizovan kao `["play", "ing"]` ako su `"play"` i `"ing"` č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:_\ `"unhappiness"` može biti tokenizovan kao `["un", "happiness"]` ili `["un", "happy", "ness"]` u zavisnosti od rečnika. 3. **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 prirodnije modelovati jezik. - Često rezultira efikasnijim i kompaktnijim tokenizacijama. - _Primer:_\ `"internationalization"` može biti tokenizovan u manje, smislene podrečne reči kao što su `["international", "ization"]`. ## 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) {{#include ../../banners/hacktricks-training.md}}