Veni AI
PLN

Fundamentos de Tokenización y PLN: BPE, SentencePiece y WordPiece

Métodos de tokenización en el procesamiento del lenguaje natural, algoritmos BPE, SentencePiece, WordPiece y arquitecturas modernas de tokenizadores para LLM.

Veni AI Technical Team7 Ocak 20257 dk okuma
Fundamentos de Tokenización y PLN: BPE, SentencePiece y WordPiece

Tokenización y Fundamentos de PLN: BPE, SentencePiece y WordPiece

La tokenización es el proceso de dividir el texto en subunidades (tokens) que pueden ser procesadas por un modelo. Este proceso, que constituye la base de los LLM modernos, afecta directamente el rendimiento del modelo.

¿Qué es la Tokenización?

La tokenización es el primer paso para convertir texto sin procesar en representaciones numéricas:

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

Niveles de Tokenización

  1. Nivel de caracteres: Cada carácter es un token.
  2. Nivel de palabras: Cada palabra es un token.
  3. Nivel de subpalabras: Las palabras se dividen en subunidades más pequeñas (el enfoque moderno).

Tokenización a Nivel de Palabras

Enfoque Simple

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

Problemas

  1. OOV (Fuera de Vocabulario): Encontrar palabras no vistas durante el entrenamiento.
  2. Vocabulario Grande: Gestionar cientos de miles de palabras es ineficiente.
  3. Riqueza Morfológica: En idiomas como el turco, la cantidad de variaciones de palabras debido a los sufijos es enorme.
  4. Palabras Compuestas: Determinar si "Artificial intelligence" debe ser un concepto o dos.

Tokenización a Nivel de Caracteres

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

Ventajas

  • No existe el problema OOV.
  • Tamaño de vocabulario pequeño (~100 caracteres).

Desventajas

  • Las secuencias resultantes son muy largas.
  • Pérdida de significado contextual a nivel de token.
  • Mayor costo computacional para el modelo.

Tokenización de Subpalabras

La elección de los LLM modernos: un equilibrio entre los niveles de palabras y caracteres.

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

BPE (Byte Pair Encoding)

El algoritmo de tokenización de subpalabras más utilizado.

Algoritmo BPE

  1. Dividir el texto en caracteres individuales.
  2. Encontrar el par más frecuente de caracteres adyacentes.
  3. Unir este par en un nuevo token único.
  4. Repetir este proceso hasta alcanzar el tamaño de vocabulario deseado.

Ejemplo de 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', ...]

Implementación de 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 desarrollado por Google y utilizado en modelos como BERT.

BPE vs WordPiece

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

Ejemplo de WordPiece

1"tokenization" → ["token", "##ization"] 2"playing" → ["play", "##ing"] 3## SentencePiece 4 5Un tokenizador independiente del idioma también desarrollado por Google. 6 7### Features 8 9- **Independiente del idioma:** No asume que los espacios en blanco son separadores de palabras. 10- **A nivel de bytes:** Opera directamente sobre texto sin procesar. 11- **BPE + Unigram:** Compatible con múltiples algoritmos. 12- **Reversible:** Es posible una detokenización perfecta. 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 marca el inicio de las palabras con :

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

Tiktoken (OpenAI)

La implementación especializada de BPE utilizada por 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]Inicio de secuenciaTareas de clasificación con BERT
[SEP]Separador de segmentosSeparación de pares de oraciones
[PAD]RellenoAlineación en el procesamiento por lotes
[UNK]Token desconocidoManejo de palabras fuera de vocabulario
[MASK]MáscaraMasked Language Modeling (MLM)
<|endoftext|>Fin de secuenciaTareas generativas con 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. Entrenamiento de un tokenizador optimizado para turco.
  2. Integración de análisis morfológico.
  3. Aplicación de BPE consciente de sufijos.

Límites y gestión de tokens

Ventana de contexto

ModeloLongitud del contexto (Tokens)~Equivalente en palabras
GPT-3.516K~12,000
GPT-4128K~96,000
Claude 3200K~150,000

Estimación del conteo de tokens

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

Conclusión

La tokenización es el componente fundamental del NLP y de los LLMs. Los métodos de subpalabras como BPE, WordPiece y SentencePiece desempeñan un papel fundamental en el éxito de los modelos de lenguaje modernos. La elección y configuración del tokenizador adecuado impacta directamente en el rendimiento final del modelo.

En Veni AI, ofrecemos estrategias de tokenización especializadas en soluciones de NLP en turco.

İlgili Makaleler