hacktricks/todo/llm-training-data-preparation/1.-tokenizing.md

5.2 KiB

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).

{% hint style="success" %} Cilj ove inicijalne faze je vrlo jednostavan: Podeliti ulaz u tokene (ids) na način koji ima smisla. {% endhint %}

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