Θεμελιώδεις Έννοιες Tokenization και NLP: BPE, SentencePiece και WordPiece
Το Tokenization είναι η διαδικασία διαχωρισμού του κειμένου σε υπομονάδες (tokens) που μπορούν να επεξεργαστούν από ένα μοντέλο. Αυτή η διαδικασία, που αποτελεί τη βάση των σύγχρονων LLMs, επηρεάζει άμεσα την απόδοση του μοντέλου.
Τι είναι το Tokenization;
Το Tokenization είναι το πρώτο βήμα στη μετατροπή ακατέργαστου κειμένου σε αριθμητικές αναπαραστάσεις:
"Hello world!" → ["Hello", "world", "!"] → [1234, 5678, 99]
Επίπεδα Tokenization
- Character level: Κάθε χαρακτήρας είναι ένα token.
- Word level: Κάθε λέξη είναι ένα token.
- Subword level: Οι λέξεις διαχωρίζονται σε μικρότερες υπομονάδες (η σύγχρονη προσέγγιση).
Tokenization σε Επίπεδο Λέξεων
Απλή Προσέγγιση
1def word_tokenize(text): 2 return text.split() 3 4# Example 5text = "Artificial intelligence is shaping the future" 6tokens = word_tokenize(text) 7# ['Artificial', 'intelligence', 'is', 'shaping', 'the', 'future']
Προβλήματα
- OOV (Out of Vocabulary): Συνάντηση λέξεων που δεν υπήρχαν κατά την εκπαίδευση.
- Μεγάλο Λεξιλόγιο: Η διαχείριση εκατοντάδων χιλιάδων λέξεων είναι αναποτελεσματική.
- Μορφολογικός Πλούτος: Σε γλώσσες όπως τα τουρκικά, ο αριθμός των παραλλαγών λέξεων λόγω καταλήξεων είναι τεράστιος.
- Σύνθετες Λέξεις: Το αν το "Artificial intelligence" πρέπει να θεωρείται μία ή δύο έννοιες.
Tokenization σε Επίπεδο Χαρακτήρων
1def char_tokenize(text): 2 return list(text) 3 4# Example 5text = "Hello" 6tokens = char_tokenize(text) 7# ['H', 'e', 'l', 'l', 'o']
Πλεονεκτήματα
- Δεν υπάρχει πρόβλημα OOV.
- Μικρό μέγεθος λεξιλογίου (~100 χαρακτήρες).
Μειονεκτήματα
- Οι παραγόμενες ακολουθίες είναι πολύ μεγάλες.
- Απώλεια συμφραζόμενου νοήματος στο επίπεδο token.
- Υψηλότερο υπολογιστικό κόστος για το μοντέλο.
Subword Tokenization
Η επιλογή των σύγχρονων LLMs: Μια ισορροπία ανάμεσα στο επίπεδο λέξεων και χαρακτήρων.
"tokenization" → ["token", "ization"] "unhappiness" → ["un", "happiness"] or ["un", "happy", "ness"]
BPE (Byte Pair Encoding)
Ο πιο ευρέως χρησιμοποιούμενος αλγόριθμος subword tokenization.
Αλγόριθμος BPE
- Διαχωρισμός του κειμένου σε μεμονωμένους χαρακτήρες.
- Εύρεση του πιο συχνού ζεύγους γειτονικών χαρακτήρων.
- Συγχώνευση αυτού του ζεύγους σε ένα νέο μοναδικό token.
- Επανάληψη της διαδικασίας μέχρι να επιτευχθεί το επιθυμητό μέγεθος λεξιλογίου.
Παράδειγμα BPE
1Starting vocabulary: ['l', 'o', 'w', 'e', 'r', 'n', 's', 't', 'i', 'd'] 2Corpus: "low lower newest lowest widest" 3 4Step 1: Most frequent pair 'e' + 's' → 'es' 5Step 2: Most frequent pair 'es' + 't' → 'est' 6Step 3: Most frequent pair 'l' + 'o' → 'lo' 7Step 4: Most frequent pair 'lo' + 'w' → 'low' 8... 9 10Final Result: ['low', 'est', 'er', 'new', 'wid', ...]
Υλοποίηση BPE
1def get_stats(vocab): 2 pairs = {} 3 for word, freq in vocab.items(): 4 symbols = word.split() 5 for i in range(len(symbols) - 1): 6 pair = (symbols[i], symbols[i + 1]) 7 pairs[pair] = pairs.get(pair, 0) + freq 8 return pairs 9 10def merge_vocab(pair, vocab): 11 new_vocab = {} 12 bigram = ' '.join(pair) 13 replacement = ''.join(pair) 14 for word in vocab: 15 new_word = word.replace(bigram, replacement) 16 new_vocab[new_word] = vocab[word] 17 return new_vocab 18 19def train_bpe(corpus, num_merges): 20 vocab = get_initial_vocab(corpus) 21 22 for i in range(num_merges): 23 pairs = get_stats(vocab) 24 if not pairs: 25 break 26 best_pair = max(pairs, key=pairs.get) 27 vocab = merge_vocab(best_pair, vocab) 28 29 return vocab
WordPiece
Ένας αλγόριθμος που αναπτύχθηκε από τη Google και χρησιμοποιείται σε μοντέλα όπως το BERT.
BPE vs WordPiece
| Feature | BPE | WordPiece |
|---|---|---|
| Merge Criterion | Frequency | Likelihood |
| Prefix | None | ## (for mid-word tokens) |
| Used In | GPT, LLaMA | BERT, DistilBERT |
Παράδειγμα WordPiece
1"tokenization" → ["token", "##ization"] 2"playing" → ["play", "##ing"] 3## SentencePiece 4 5Ένας γλωσσικά ανεξάρτητος tokenizer που αναπτύχθηκε επίσης από τη Google. 6 7### Features 8 9- **Language Independent:** Δεν υποθέτει ότι το κενό είναι διαχωριστής λέξεων. 10- **Byte-level:** Λειτουργεί απευθείας πάνω στο ακατέργαστο κείμενο. 11- **BPE + Unigram:** Υποστηρίζει πολλαπλούς αλγορίθμους. 12- **Reversible:** Είναι δυνατή η τέλεια απο-τοκενικοποίηση. 13 14### SentencePiece Usage 15 16```python 17import sentencepiece as spm 18 19# Training the model 20spm.SentencePieceTrainer.train( 21 input='corpus.txt', 22 model_prefix='tokenizer', 23 vocab_size=32000, 24 model_type='bpe' # or 'unigram' 25) 26 27# Loading and using the model 28sp = spm.SentencePieceProcessor() 29sp.load('tokenizer.model') 30 31# Encode 32tokens = sp.encode('Hello world', out_type=str) 33# ['▁Hello', '▁world'] 34 35ids = sp.encode('Hello world', out_type=int) 36# [1234, 5678, 9012] 37 38# Decode 39text = sp.decode(ids) 40# 'Hello world'
▁ (Underscore) Symbol
Το SentencePiece σημειώνει την αρχή των λέξεων με ▁:
"Hello world" → ["▁Hello", "▁world"] "New York" → ["▁New", "▁York"]
Tiktoken (OpenAI)
Η εξειδικευμένη υλοποίηση BPE που χρησιμοποιείται από την OpenAI.
1import tiktoken 2 3# Loading the encoder 4enc = tiktoken.encoding_for_model("gpt-4") 5 6# Encode 7tokens = enc.encode("Hello world!") 8# [12345, 67890, 999] 9 10# Decode 11text = enc.decode(tokens) 12# "Hello world!" 13 14# Check token count 15print(len(tokens)) # 3
Model-Encoder Mappings
| Model | Encoder | Vocab Size |
|---|---|---|
| GPT-4 | cl100k_base | 100,277 |
| GPT-3.5 | cl100k_base | 100,277 |
| GPT-3 | p50k_base | 50,281 |
| Codex | p50k_edit | 50,281 |
Hugging Face Tokenizers
1from transformers import AutoTokenizer 2 3# Loading the tokenizer 4tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased") 5 6# Encode 7encoded = tokenizer("Hello, world!", return_tensors="pt") 8# { 9# 'input_ids': tensor([[101, 7592, 1010, 2088, 999, 102]]), 10# 'attention_mask': tensor([[1, 1, 1, 1, 1, 1]]) 11# } 12 13# Decode 14text = tokenizer.decode(encoded['input_ids'][0]) 15# "[CLS] hello, world! [SEP]" 16 17# Token List 18tokens = tokenizer.tokenize("Hello, world!") 19# ['hello', ',', 'world', '!']
Fast Tokenizers
1from tokenizers import Tokenizer, models, trainers, pre_tokenizers 2 3# Creating a new tokenizer 4tokenizer = Tokenizer(models.BPE()) 5tokenizer.pre_tokenizer = pre_tokenizers.Whitespace() 6 7trainer = trainers.BpeTrainer( 8 vocab_size=30000, 9 special_tokens=["[PAD]", "[UNK]", "[CLS]", "[SEP]", "[MASK]"] 10) 11 12tokenizer.train(files=["corpus.txt"], trainer=trainer) 13tokenizer.save("my_tokenizer.json")
Special Tokens
Common Special Tokens
| Token | Description | Use Case |
|---|---|---|
| [CLS] | Αρχή της ακολουθίας | BERT classification tasks |
| [SEP] | Διαχωριστής τμημάτων | Διαχωρισμός ζευγών προτάσεων |
| [PAD] | Padding | Ευθυγράμμιση batch processing |
| [UNK] | Unknown token | Χειρισμός λέξεων εκτός λεξιλογίου |
| [MASK] | Mask | Masked Language Modeling (MLM) |
| <|endoftext|> | Τέλος ακολουθίας | GPT Generative tasks |
Chat Tokens
1<|system|>You are a helpful assistant<|end|> 2<|user|>Hello!<|end|> 3<|assistant|>Hello! How can I help you today?<|end|>
Tokenization Challenges in Turkish
Morphological Richness
1"gelebileceklermiş" (they were said to be able to come) → A single word but complex structure 2gel (come) + ebil (can) + ecek (will) + ler (they) + miş (reportedly) 3 4Tokenization: 5- Poor: ["gelebileceklermiş"] (Single token, very rare) 6- Good: ["gel", "ebil", "ecek", "ler", "miş"]
Solutions
- Turkish-optimized tokenizer training.
- Integration of morphological analysis.
- Suffix-aware BPE application.
Όρια και Διαχείριση Token
Παράθυρο Πλαισίου (Context Window)
| Model | Context Length (Tokens) | ~Word Equivalent |
|---|---|---|
| GPT-3.5 | 16K | ~12,000 |
| GPT-4 | 128K | ~96,000 |
| Claude 3 | 200K | ~150,000 |
Εκτίμηση Αριθμού Token
1def estimate_tokens(text): 2 # Rough estimate: 1 token ≈ 4 characters (English) 3 # For Turkish: 1 token ≈ 3 characters 4 return len(text) // 3 5 6# More accurate calculation 7def count_tokens(text, model="gpt-4"): 8 enc = tiktoken.encoding_for_model(model) 9 return len(enc.encode(text))
Συμπέρασμα
Η τοκενικοποίηση είναι το θεμελιώδες δομικό στοιχείο του NLP και των LLMs. Μέθοδοι υπο-λέξεων όπως τα BPE, WordPiece και SentencePiece διαδραματίζουν κρίσιμο ρόλο στην επιτυχία των σύγχρονων γλωσσικών μοντέλων. Η επιλογή και ρύθμιση του κατάλληλου tokenizer επηρεάζει άμεσα την τελική απόδοση του μοντέλου.
Στη Veni AI, παρέχουμε στρατηγικές τοκενικοποίησης εξειδικευμένες σε λύσεις Turkish NLP.
