Veni AI
Επεξεργασία Φυσικής Γλώσσας

Βασικές Αρχές Τμηματοποίησης και NLP: BPE, SentencePiece και WordPiece

Μέθοδοι τμηματοποίησης στην επεξεργασία φυσικής γλώσσας, αλγόριθμοι BPE, SentencePiece, WordPiece και σύγχρονες αρχιτεκτονικές tokenizers για LLMs.

Veni AI Technical Team7 Ocak 20256 dk okuma
Βασικές Αρχές Τμηματοποίησης και NLP: BPE, SentencePiece και WordPiece

Θεμελιώδεις Έννοιες Tokenization και NLP: BPE, SentencePiece και WordPiece

Το Tokenization είναι η διαδικασία διαχωρισμού του κειμένου σε υπομονάδες (tokens) που μπορούν να επεξεργαστούν από ένα μοντέλο. Αυτή η διαδικασία, που αποτελεί τη βάση των σύγχρονων LLMs, επηρεάζει άμεσα την απόδοση του μοντέλου.

Τι είναι το Tokenization;

Το Tokenization είναι το πρώτο βήμα στη μετατροπή ακατέργαστου κειμένου σε αριθμητικές αναπαραστάσεις:

"Hello world!" → ["Hello", "world", "!"] → [1234, 5678, 99]

Επίπεδα Tokenization

  1. Character level: Κάθε χαρακτήρας είναι ένα token.
  2. Word level: Κάθε λέξη είναι ένα token.
  3. 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']

Προβλήματα

  1. OOV (Out of Vocabulary): Συνάντηση λέξεων που δεν υπήρχαν κατά την εκπαίδευση.
  2. Μεγάλο Λεξιλόγιο: Η διαχείριση εκατοντάδων χιλιάδων λέξεων είναι αναποτελεσματική.
  3. Μορφολογικός Πλούτος: Σε γλώσσες όπως τα τουρκικά, ο αριθμός των παραλλαγών λέξεων λόγω καταλήξεων είναι τεράστιος.
  4. Σύνθετες Λέξεις: Το αν το "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

  1. Διαχωρισμός του κειμένου σε μεμονωμένους χαρακτήρες.
  2. Εύρεση του πιο συχνού ζεύγους γειτονικών χαρακτήρων.
  3. Συγχώνευση αυτού του ζεύγους σε ένα νέο μοναδικό token.
  4. Επανάληψη της διαδικασίας μέχρι να επιτευχθεί το επιθυμητό μέγεθος λεξιλογίου.

Παράδειγμα 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

FeatureBPEWordPiece
Merge CriterionFrequencyLikelihood
PrefixNone## (for mid-word tokens)
Used InGPT, LLaMABERT, 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

ModelEncoderVocab Size
GPT-4cl100k_base100,277
GPT-3.5cl100k_base100,277
GPT-3p50k_base50,281
Codexp50k_edit50,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

TokenDescriptionUse Case
[CLS]Αρχή της ακολουθίαςBERT classification tasks
[SEP]Διαχωριστής τμημάτωνΔιαχωρισμός ζευγών προτάσεων
[PAD]PaddingΕυθυγράμμιση batch processing
[UNK]Unknown tokenΧειρισμός λέξεων εκτός λεξιλογίου
[MASK]MaskMasked 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

  1. Turkish-optimized tokenizer training.
  2. Integration of morphological analysis.
  3. Suffix-aware BPE application.

Όρια και Διαχείριση Token

Παράθυρο Πλαισίου (Context Window)

ModelContext Length (Tokens)~Word Equivalent
GPT-3.516K~12,000
GPT-4128K~96,000
Claude 3200K~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.

İlgili Makaleler