Veni AI
Elaborazione del linguaggio naturale

Nozioni di Tokenizzazione e Fondamenti di NLP: BPE, SentencePiece e WordPiece

Metodi di tokenizzazione nel trattamento del linguaggio naturale, algoritmi BPE, SentencePiece, WordPiece e architetture moderne dei tokenizer per LLM.

Veni AI Technical Team7 Ocak 20257 dk okuma
Nozioni di Tokenizzazione e Fondamenti di NLP: BPE, SentencePiece e WordPiece

Tokenizzazione e Fondamenti di NLP: BPE, SentencePiece e WordPiece

La tokenizzazione è il processo di suddividere il testo in sotto-unità (token) che possono essere elaborate da un modello. Questo processo, che costituisce la base dei moderni LLM, influisce direttamente sulle prestazioni del modello.

Che cos’è la Tokenizzazione?

La tokenizzazione è il primo passo per convertire testo grezzo in rappresentazioni numeriche:

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

Livelli di Tokenizzazione

  1. A livello di carattere: Ogni carattere è un token.
  2. A livello di parola: Ogni parola è un token.
  3. A livello di sottoparola: Le parole vengono suddivise in sotto-unità più piccole (l’approccio moderno).

Tokenizzazione a Livello di Parola

Approccio Semplice

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']

Problemi

  1. OOV (Out of Vocabulary): Incontro con parole non viste durante l’addestramento.
  2. Vocabolario Ampio: Gestire centinaia di migliaia di parole è inefficiente.
  3. Ricchezza Morfologica: In lingue come il turco, il numero di variazioni delle parole dovute ai suffissi è enorme.
  4. Parole Composte: Determinare se "Artificial intelligence" debba essere un unico concetto o due.

Tokenizzazione a Livello di Carattere

1def char_tokenize(text): 2 return list(text) 3 4# Example 5text = "Hello" 6tokens = char_tokenize(text) 7# ['H', 'e', 'l', 'l', 'o']

Vantaggi

  • Nessun problema di OOV.
  • Vocabolario di dimensioni ridotte (~100 caratteri).

Svantaggi

  • Le sequenze risultanti sono molto lunghe.
  • Perdita del significato contestuale a livello di token.
  • Maggiore costo computazionale per il modello.

Tokenizzazione Subword

La scelta dei moderni LLM: un equilibrio tra livello di parola e livello di carattere.

"tokenization" → ["token", "ization"] "unhappiness" → ["un", "happiness"] or ["un", "happy", "ness"]

BPE (Byte Pair Encoding)

L’algoritmo di tokenizzazione subword più ampiamente utilizzato.

Algoritmo BPE

  1. Suddividere il testo in caratteri individuali.
  2. Trovare la coppia di caratteri adiacenti più frequente.
  3. Unire questa coppia in un nuovo token singolo.
  4. Ripetere il processo fino al raggiungimento della dimensione di vocabolario desiderata.

Esempio di 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', ...]

Implementazione 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

Un algoritmo sviluppato da Google e utilizzato in modelli come BERT.

BPE vs WordPiece

FeatureBPEWordPiece
Merge CriterionFrequencyLikelihood
PrefixNone## (for mid-word tokens)
Used InGPT, LLaMABERT, DistilBERT

Esempio di WordPiece

1"tokenization" → ["token", "##ization"] 2"playing" → ["play", "##ing"] 3## SentencePiece 4 5Un tokenizer indipendente dalla lingua, sviluppato anch’esso da Google. 6 7### Features 8 9- **Indipendente dalla lingua:** Non assume che lo spazio sia un separatore di parole. 10- **A livello di byte:** Opera direttamente sul testo grezzo. 11- **BPE + Unigram:** Supporta più algoritmi. 12- **Reversibile:** È possibile una detokenizzazione perfetta. 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 segna l’inizio delle parole con :

"Hello world" → ["▁Hello", "▁world"] "New York" → ["▁New", "▁York"]

Tiktoken (OpenAI)

La specializzata implementazione BPE utilizzata da 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]Inizio della sequenzaCompiti di classificazione con BERT
[SEP]Separatore di segmentiSeparazione di coppie di frasi
[PAD]PaddingAllineamento nel batch processing
[UNK]Token sconosciutoGestione di parole fuori vocabolario
[MASK]MascheraMasked Language Modeling (MLM)
<|endoftext|>Fine della sequenzaCompiti generativi GPT

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. Addestramento di un tokenizer ottimizzato per il turco.
  2. Integrazione dell’analisi morfologica.
  3. Applicazione di BPE sensibile ai suffissi.

Limiti e Gestione dei Token

Finestra di Contesto

ModelloLunghezza Contesto (Token)~Equivalente Parole
GPT-3.516K~12.000
GPT-4128K~96.000
Claude 3200K~150.000

Stima del Conteggio dei 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))

Conclusione

La tokenizzazione è il mattone fondamentale dell'NLP e degli LLM. I metodi subword come BPE, WordPiece e SentencePiece svolgono un ruolo cruciale nel successo dei moderni modelli linguistici. La scelta e la configurazione del tokenizer corretto influiscono direttamente sulle prestazioni finali del modello.

In Veni AI forniamo strategie di tokenizzazione specializzate per soluzioni NLP in turco.

İlgili Makaleler