English · Español
01 — Carácter vs Palabra vs Subpalabra: la cuestión del OOV¶
🇪🇸 Tres familias de tokenizadores: caracteres (cortos, secuencias largas), palabras (semánticos pero con problema OOV mortal), y sub-palabras (el equilibrio que ganó). Aquí formalizamos el trade-off y explicamos por qué la familia de sub-palabras es la elección obvia en 2026, especialmente para un corpus bilingüe de conjugaciones verbales.
El trade-off, formalizado¶
Para un corpus fijo de número total de caracteres \(C\) y un vocabulario de tamaño \(V\):
| Familia | Tokens por carácter (aprox) | Comportamiento OOV | Tamaño del vocabulario |
|---|---|---|---|
| Carácter | 1 | Ninguno (todo carácter está en el vocab) | \(\approx 100\) (ASCII), \(\approx 10^5\) (Unicode) |
| Palabra | \(1/L_w\) donde \(L_w\) es la longitud media de palabra (~5 en inglés) | <unk> para cualquier palabra no vista |
\(10^5\) – \(10^6\) para inglés |
| Subpalabra (BPE) | \(1/L_t\) donde \(L_t\) es la longitud media de token (~3-4 caracteres) | Ninguno si byte-level | \(10^3\) – \(10^5\) |
El trade es tamaño de vocabulario vs longitud de secuencia vs robustez frente a OOV. Queremos baja longitud de secuencia (attention barata), vocabulario pequeño (embedding compacto), y cero OOV (entrada robusta). La subpalabra gana en los tres frente a palabra; la subpalabra gana en longitud de secuencia frente a carácter; la única pérdida de la subpalabra es vocab > carácter. El coste del vocab es fijo y pequeño.
El fallo out-of-vocabulary (OOV)¶
Los tokenizers a nivel de palabra dividen el texto por espacios + puntuación. El vocabulario es la unión de todas las palabras vistas durante el entrenamiento (o todas las palabras dentro de algún umbral de frecuencia). Cualquier palabra de entrada no presente en el vocab se vuelve un token especial <unk>.
Por qué OOV es fatal para nuestro caso de uso¶
El agente tutor de gramática de la Fase 32 recibe la frase de un aprendiz — que es por construcción probable que contenga errores. Los aprendices van a:
- Mal conjugar verbos:
he goed,she eated,I am go to work. - Escribir mal:
wroked(en lugar deworked),studyed(en lugar destudied). - Mezclar idiomas:
Yo work mañana.
Cada uno de estos se vuelve <unk> bajo tokenización a nivel de palabra. El modelo literalmente no puede distinguir goed, eated y studyed — todos son el mismo <unk>. Eso es catastrófico: se supone que el agente debe corregir estos errores, pero con tokenización a nivel de palabra ni siquiera puede verlos.
Los tokenizers de subpalabra no tienen este problema. goed se vuelve [' go', 'ed'] — el modelo todavía ve la raíz go (que ha aprendido en el contexto de go / goes / went / gone / going), nota el sufijo -ed (incorrectamente) añadido, y puede marcar el error de conjugación. eated se vuelve [' eat', 'ed'] — misma historia.
El nivel de carácter evita OOV pero paga en longitud de secuencia¶
Un tokenizer a nivel de carácter tiene trivialmente cada carácter en su vocab. Sin OOV. Pero:
- Una frase de 60 caracteres se vuelve una secuencia de 60 tokens.
- La attention es \(O(L^2)\) → \(3.6 \times 10^3\) operaciones por frase.
- La misma frase como tokens de subpalabra (asumiendo media 4 caracteres/token) → 15 tokens → \(225\) operaciones. 16× más barato.
Para el entrenamiento de la Fase 18 sobre el corpus de la Fase 12 (~600 formas / frases, media 30–50 caracteres cada una), la elección de subpalabra mantiene una época en el rango de minutos en CPU.
Qué significa realmente "subpalabra"¶
Una subpalabra es una cadena que no es ni un solo carácter ni una palabra entera — usualmente un prefijo, sufijo o raíz que ocurre frecuentemente. Ejemplos para verbos en inglés:
-ing— forma continua / participio presente (working,playing,going).-ed— pasado simple regular (worked,played).-s— 3ª persona singular del presente (works,goes,eats).will— marcador de futuro simple.going to— futuro perifrástico (a menudo dividido comogoing+to).he,she,I,you,it— pronombres.
Para nuestro corpus de verbos en inglés+español, subpalabras esperadas:
- Raíces inglesas:
work,play,walk,listen,watch,study,be,have,go,come,eat,write. - Sufijos ingleses:
-s,-ed,-ing. - Raíces españolas:
trab,jug,cam,habl,escuch,mir,estudi. - Terminaciones españolas:
-ar,-er,-ir,-o,-as,-a,-amos,-an,-ó,-ará. - Puntuación y espacios:
,.,,,\n.
BPE descubre estas subpalabras automáticamente contando y fusionando pares frecuentes. No codificamos nada a mano.
Tokenizers de subpalabra en 2026¶
Los tres tokenizers de subpalabra comúnmente usados:
BPE (Byte-Pair Encoding)¶
Originalmente un algoritmo de compresión (Gage, 1994); Sennrich et al. (2016) lo adaptaron para PLN (NLP). Codicioso: en cada paso, encuentra el par adyacente más frecuente y los fusiona. Repite hasta que el vocab esté lleno.
- Determinismo: con un corpus fijo y una regla de desempate fija, BPE es totalmente determinista.
- Velocidad: el entrenamiento es \(O(V \times N)\) en la versión naive; \(O(V \log N + N)\) con priority queues.
- Modelos que lo usan: GPT-⅔/4 (BPE byte-level), Llama (BPE byte-level via modo BPE de SentencePiece), Roberta.
Esto es lo que construimos.
WordPiece¶
Como BPE, pero el criterio de merge es maximización de verosimilitud bajo un modelo de lenguaje unigram, no frecuencia bruta. El par con el ratio de verosimilitud más alto se fusiona a continuación.
- Determinismo: igual que BPE.
- Velocidad: similar.
- Modelos que lo usan: BERT, DistilBERT.
Solo encuesta.
Unigram (SentencePiece)¶
Un enfoque probabilístico: mantén un vocabulario de candidatos de subpalabra, entrena un modelo de lenguaje unigram sobre ellos vía EM, y poda los tokens de baja probabilidad.
- Determinismo: estocástico; múltiples reinicios aleatorios durante el entrenamiento.
- Velocidad: más lento que BPE.
- Modelos que lo usan: T5, mT5, XLM-R, ALBERT.
Solo encuesta.
Resumen comparativo¶
| Propiedad | BPE | WordPiece | Unigram |
|---|---|---|---|
| Complejidad del algoritmo | Más simple | Media | Más alta |
| Determinismo en el entrenamiento | Sí (con desempate) | Sí | No (reinicios EM) |
| Calidad empírica | Comparable | Comparable | Comparable |
| Soporte de bibliotecas | tiktoken, transformers |
transformers (BERT) |
sentencepiece |
| Nuestra elección | ✅ | — | — |
Los tres alcanzan calidad similar en benchmarks estándar (Bostrom & Durrett, 2020). Elegimos el más simple.
Pre-tokenización: un prerrequisito sutil¶
La mayoría de las implementaciones de BPE en producción hacen pre-tokenización antes de BPE. Primero dividen la entrada por espacios y puntuación usando una regex, luego ejecutan BPE dentro de cada pre-token.
El pat de GPT-2 (la famosa regex):
Esto hace dos cosas:
- Respeto del límite de palabra. BPE no fusionará a través de fronteras
"foo " "bar", incluso sio bes frecuente. - Manejo de espacios en blanco. El prefijo
inicial marca las subpalabras al inicio de palabra de forma diferente a las internas de la palabra.
Para nuestro corpus de gramática verbal, saltamos la regex de pre-tokenización en v1 porque:
- El corpus es pequeño y limpio. Las frases son cortas, bien formadas, y usan espacios ASCII de forma idéntica en inglés y español.
- BPE sobre bytes en bruto descubrirá los límites correctos (el byte de espacio
0x20dominará como componente frecuente de pares). - La pre-tokenización añade una dependencia de regex con propiedades Unicode que oscurecería el algoritmo central.
Mantenemos una convención: el espacio inicial importa. work (con espacio inicial) es conceptualmente diferente de work (interno a la palabra). BPE sobre bytes en bruto los trata como secuencias de bytes diferentes, que es exactamente el comportamiento de GPT-2 sin el centinela regex. Nota esto en el BLUEPRINT; revisita si el vocabulario entrenado hace cosas raras.
Por qué el laboratorio de la Fase 11 hace primero el juguete a mano¶
El Lab 00 es una traza BPE a papel y lápiz sobre un corpus juguete de 5 frases extraído de nuestro tema de gramática verbal:
Borja fusiona 5 pares a mano, escribe la tabla de conteo de pares en cada paso, y rastrea el vocabulario resultante. Los primeros merges esperados incluyen w + o → wo, luego wo + r → wor, eventualmente work. El -s tras works y el -ed tras worked también deberían aflorar.
¿Por qué traza a mano primero? El entrenamiento BPE parece simple en papel pero tiene detalles de implementación complicados:
- Los conteos se actualizan incrementalmente después de cada merge (no recuentes todo en producción).
- El desempate importa para la reproducibilidad.
- Los tokens especiales requieren guardas explícitas.
Hacerlo a mano una vez significa que el código del lab 01 no es una caja negra.
Problemas de práctica¶
Soluciones en solutions/01-character-word-subword-ref.md (apertura de fase).
- Estima el tamaño del vocabulario de un tokenizer a nivel de palabra inglés entrenado sobre toda Wikipedia. (Pista: ley de Heaps; rango aproximado \(10^5\) – \(10^6\).)
- Para un texto inglés típico, ¿cuál es la proporción (tokens BPE) / (caracteres)? (Pista: GPT-3 promedia ~4 caracteres por token.) ¿Por qué esa proporción difiere para nuestro corpus de verbos (frases cortas, alta repetición de morfemas)?
- Un tokenizer a nivel de carácter sobre nuestro corpus tendría vocab ≈ 80 (ASCII imprimible + acentos españoles). Un BPE byte-level con vocab 1024 tendría ~13× más tokens. ¿Por qué pagar 13× el coste de embedding por un tokenizer que produce secuencias más cortas? (Pista: coste de embedding vs coste de attention, siendo attention \(O(L^2)\).)
- Dado que el corpus contiene 20 verbos ingleses y 20 verbos españoles, ¿cuántos tokens distintos de raíz deberíamos esperar que BPE descubra con vocab de 512? (Respuesta plausible: ~30–40 raíces, más tokens de sufijos; el resto son espacios y puntuación. Verifica en lab 02.)
Lo que esta página de teoría NO cubre¶
- El algoritmo BPE paso a paso. Theory 02.
- Mecánica byte-level + UTF-8 del español. Theory 03.
- Reentrenar BPE cuando el corpus crece. La Fase 12 cierra reentrenando sobre el corpus completo; mecánica diferida allí.
- Métricas de evaluación de tokenizers (ratio de compresión, longitud media de token). Mencionada de pasada en lab 02; la Fase 20 (banco de evaluación) no incluye métricas específicas de tokenizer.
Recapitulación en un párrafo¶
Tres familias: carácter (sin OOV, demasiado largo), palabra (semántica pero OOV fatal), subpalabra (el equilibrio). Entre las subpalabras, BPE es la opción determinista más simple y lo que GPT-2 / Llama usan. Nuestro corpus son conjugaciones verbales bilingües; BPE byte-level es libre de OOV, robusto frente a Unicode, y descubre merges ricos en morfología (-s, -ed, will, raíces) automáticamente. Saltamos la regex de pre-tokenización en v1 porque el corpus es pequeño y limpio.
Siguiente: theory/02-bpe-algorithm.md.