English · Español
Lab 02 — Entrenar BPE sobre el corpus de verbos en inglés¶
Objetivo: usar el trainer de BPE (lab 01) sobre el corpus de la Fase 12. Tres tamaños de vocabulario. Gráfica de Zipf. Comprobación de sanidad de los 30 merges principales con anotaciones morfológicas.
Tiempo estimado: 90–120 minutos.
Prerrequisito: lab 01 comprometido; corpus de la Fase 12 generado (referencia adelantada — véase el plan de la Fase 11 §7.a para la ruta de bootstrap).
Lo que produces¶
Un directorio experiments/11-bpe-on-verb-corpus/ que contiene:
train.py— orquesta el entrenamiento en los tres tamaños de vocabulario.vocabs/{256+128,512,1024}/— tres vocabularios entrenados (cada uno convocab.json,merges.txt,config.json).zipf.png— gráfica log-log de rango de frecuencia de token frente a frecuencia, para el vocabulario de 512.top_merges.png— gráfico de barras con los conteos de los 30 merges principales (vocabulario de 512).top_merges.md— los 30 merges principales como lista legible con anotaciones morfológicas (sufijo / prefijo / raíz / palabra funcional / puntuación / específica del español).manifest.json.README.md.
El montaje¶
Carga el corpus de la Fase 12 (data/processed/train.jsonl — el campo text de cada fila, que contiene pares (English_sentence, Spanish_translation), uno o ambos por fila). Concatena o alimenta línea a línea como entrada a BPETokenizer.train.
Si la Fase 12 no está terminada todavía, usa el corpus de bootstrap en data/raw/bootstrap-en.txt (30 frases de verbos en inglés escritas a mano con sus pares en español), según el plan de la Fase 11 §7.a. Reejecuta este lab al cierre de la Fase 12 con el corpus completo.
Entrena tres vocabularios:
vocab_size = 384(256 bytes + 4 especiales + 124 merges) — pequeño; espera bytes base + ASCII imprimible + unos pocos merges morfológicos (-s,-ed).vocab_size = 512— canónico. El que usamos en la Fase 13+.vocab_size = 1024— grande; espera una cola larga de merges a nivel de raíz y merges específicos del español. Comprueba que el trainer escala.
Para cada uno, codifica el corpus de entrenamiento completo y cuenta las frecuencias de los tokens. Guarda los conteos.
TODOs¶
Bloque A — carga del corpus¶
- Carga
data/processed/train.jsonl(odata/raw/bootstrap-en.txtpara la ruta de bootstrap). - Extrae los campos de texto relevantes (inglés + español, emparejados).
- Imprime total de bytes; total de frases; longitud media/mediana de frase en bytes.
- Imprime la proporción de bytes que son españoles (es decir, secuencias multibyte no ASCII). Para nuestro corpus, espera ~3–6%.
Bloque B — tres entrenamientos¶
- Para cada
vocab_sizeen[384, 512, 1024]: - Construye un
BPETokenizernuevo. - Llama a
.train(corpus, vocab_size, special_tokens=["<|pad|>", "<|endoftext|>", "<|unk|>", "<|sep|>"]). - Guarda en
vocabs/<size>/. - Cronometra el entrenamiento.
- Imprime: tiempo de entrenamiento por tamaño de vocabulario; el tamaño final del vocabulario coincide con el objetivo.
Bloque C — gráfica de Zipf¶
- Elige el vocabulario de 512.
- Codifica el corpus de entrenamiento completo con él.
- Cuenta las apariciones de cada token ID.
- Ordena las frecuencias de forma descendente.
- Traza rango (x, log) frente a frecuencia (y, log). Un corpus tipo Zipf muestra una curva casi lineal en log-log.
- Guarda
zipf.png.
Bloque D — top-30 merges con anotaciones morfológicas¶
- Lista los 30 merges principales por conteo de entrenamiento (o por rango de frecuencia de token en el corpus codificado — escoge uno y documéntalo).
- Para cada uno, anota el papel morfológico: sufijo (p. ej.,
-s,-ed,-ing), prefijo (raros en inglés;un-si aparece), raíz (p. ej.,work,play), palabra funcional (will,to,he,I,you), puntuación/espacios (.,,,\n), o específica del español (trab,ió,ñ). - Comprobación visual de sanidad (umbral DoD): ¿contiene el top-30 al menos estas victorias morfológicas?
-s(3.ª persona singular del presente)-ed(pasado regular)will(futuro simple)to(futuro congoing to+ marcador de infinitivo)ing(participio presente /going to)- Al menos 3 raíces enteras de verbos en inglés como tokens únicos (
work,play,walk,watch, etc.). - Al menos 2 tokens específicos del español (un fragmento de raíz español o un carácter acentuado multibyte).
- Si falta cualquier morfema esperado, márcalo en el README — posiblemente necesites un corpus de bootstrap mayor o esperar a la salida completa de la Fase 12.
- Guarda
top_merges.md(tabla markdown con columna de morfología) ytop_merges.png(gráfico de barras).
Bloque E — interpretar¶
En README.md:
- ¿Aterrizaron las victorias morfológicas? Lista cada morfema esperado y el rango del merge en el que apareció. La comprobación de sanidad principal post-A13.
- Balance de merges inglés vs español. ¿Cuántos de los 30 merges principales son específicos del inglés, específicos del español, o compartidos (espacios/puntuación)? Predícelo antes de contar; verifícalo después.
- ¿La gráfica de Zipf parece log-lineal? ¿La pendiente está cerca de −1 (Zipf clásico) o es más empinada / más suave? Los corpus cortos a menudo se desvían del Zipf puro.
- Tiempo de entrenamiento con vocabulario 1024 frente a 384. ¿Escala aproximadamente de forma lineal en
vocab_sizecomo predice la complejidad ingenua? - ¿Qué cambia entre vocabulario 384 y 1024? Inspecciona el diff en los tokens principales. ¿Emergen verbos como palabra completa (
worked,works) a 1024 que no eran tokens únicos a 384?
Bloque F — manifest¶
Estándar. Incluye las tres rutas de vocabularios y sus SHA256.
Restricciones¶
- Según CLAUDE.md §0 regla dura 5, cada script llama a
seed_everything(seed)y escribe el manifest conversions + seed + config. - El corpus se lee de la salida de la Fase 12 (o de la ruta de bootstrap durante la reejecución pre-A12).
- Normaliza con NFC en la entrada. Según la teoría 03, llama a
unicodedata.normalize('NFC', s)antes de codificar bytes. - Sin
tiktokenpara comparación en la v1. Eso es un ejercicio de la Fase 24.
Condiciones de parada¶
Terminado cuando:
- Los siete ficheros estén comprometidos.
- Los tres vocabularios entrenados; tamaños verificados.
- La gráfica de Zipf se vea aproximadamente log-lineal (admitiendo desviación por corpus corto).
- Al menos 5 de las 6 victorias morfológicas listadas en el Bloque D aparezcan en vocab=512. Marca cualquiera que falte.
- El README responda a las cinco preguntas del Bloque E.
Trampas¶
- Corpus de bootstrap demasiado pequeño. 30 frases es lo bastante pequeño como para que algunos morfemas esperados no afloren. Si ves
-spero no-ed, es el corpus, no el trainer. Reejecuta tras la Fase 12 con el corpus completo de 600 formas. - El entrenamiento es molestamente lento a vocabulario 1024. De ~30 segundos a unos pocos minutos está bien; ~horas significa que tienes un bug en el paso de aplicación de merges (probablemente un escaneo \(O(N^2)\) en vez de \(O(N)\)).
- Algunos verbos se parten.
workedpuede tokenizarse comowork+edo como un único token a vocabulario 1024. Aceptable. Anótalo en el README. - Los merges principales incluyen espacios raros. Cosas como
(espacio suelto) en el rango 1 de los merges son normales — es el byte más frecuente. Documéntalo. - Los merges en español ganan en conteos pero se renderizan como
\\xC3\\xB1en las gráficas. Usa el campoid_to_displaydeVocab(según la teoría 03) para renderizar bien. - Desajuste de NFC. Si el corpus se guardó como NFD pero el vocabulario BPE entrenado es NFC, una
árenderizada en NFC no tokenizará igual que laáNFD del entrenamiento. Ambos deben usar la misma normalización. Documéntalo enconfig.json.
Pista de último recurso¶
Si a los 90 minutos los 30 merges principales no contienen -s o -ed: tu trainer está roto (probablemente el paso de actualización del conteo de pares) o el corpus de bootstrap es demasiado pequeño/sesgado. Verifica primero que el juguete del lab-00 se reproduce; esa es la comprobación de sanidad canónica.
Cuándo consultar solutions/¶
Tras los siete ficheros. Solución: solutions/02-bpe-on-verb-corpus-ref.md (fase abierta). La referencia contiene:
- Tiempos esperados de entrenamiento por tamaño de vocabulario en la i5-8250U de Borja.
- Los 30 merges principales esperados (la lista canónica para el corpus de bootstrap y el completo).
- Discusión de qué verbos siguen partidos en cada tamaño de vocabulario y por qué.
Secuencia del lab de la Fase 11 completa. Siguiente fase: docs/phase-12-corpus-design/.