Skip to content

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 con vocab.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 (o data/raw/bootstrap-en.txt para 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_size en [384, 512, 1024]:
  • Construye un BPETokenizer nuevo.
  • 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, , ñ).
  • 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 con going 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) y top_merges.png (gráfico de barras).

Bloque E — interpretar

En README.md:

  1. ¿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.
  2. 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.
  3. ¿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.
  4. Tiempo de entrenamiento con vocabulario 1024 frente a 384. ¿Escala aproximadamente de forma lineal en vocab_size como predice la complejidad ingenua?
  5. ¿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 con versions + 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 tiktoken para comparación en la v1. Eso es un ejercicio de la Fase 24.

Condiciones de parada

Terminado cuando:

  1. Los siete ficheros estén comprometidos.
  2. Los tres vocabularios entrenados; tamaños verificados.
  3. La gráfica de Zipf se vea aproximadamente log-lineal (admitiendo desviación por corpus corto).
  4. Al menos 5 de las 6 victorias morfológicas listadas en el Bloque D aparezcan en vocab=512. Marca cualquiera que falte.
  5. 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 -s pero 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. worked puede tokenizarse como work + ed o 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\\xB1 en las gráficas. Usa el campo id_to_display de Vocab (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 en config.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/.