English · Español
Break 00 — Entrenar BPE solo con la mitad inglesa del corpus §A13¶
🇪🇸 Entrenamos BPE solo con la mitad inglesa del corpus. Predecimos que la tokenización española colapsa: mean-tokens-per-word duplica, las palabras con tilde se rompen en bytes. Es exactamente el bug que arruina los modelos multilingües cuando alguien "olvidó traducir el dataset de entrenamiento del tokenizador".
Anclas:
LYNX_CORTEX.md§4 / PHASE 11; teoría §04 bytes-vs-codepoints;.claude/commands/break.md.
El break¶
En scripts/train_bpe.py:
# BUG: trains BPE on the English half only.
training_text = load_corpus(only_language="en") # was: only_language=None
tokenizer = train_bpe(training_text, vocab_size=512)
Cambio de una sola línea. El tokenizer sigue entrenando, sigue teniendo un vocabulario de 512 tokens, sigue codificando cualquier secuencia de bytes — pero el calendario de merges queda sesgado hacia bigramas en inglés (th, _t, er, ...). Los merges específicos del español (_e, _l, ar, er, os, as, caracteres acentuados) nunca se forman.
Predice, luego ejecuta¶
Predicciones¶
mean_tokens_per_english_word≈ 1.2 (bien — eso es lo que queríamos).mean_tokens_per_spanish_word≈ 2.5 o más (mal — el entrenamiento solo en inglés no aprendió bigramas españoles).- Los caracteres acentuados (
ñ,á) permanecen como pares de bytes en bruto porque ningún merge los fusionó. Las frases en español se ven comot-r-a-b-a-j-0xC3-0xB3en forma de tokens. - Después de que la Fase 17 entrene sobre estos tokens, la perplejidad española es ~
(2.5/1.2)^2 ≈ 4×peor que la inglesa.
Escribe las predicciones en learners/borja/phase-11/notes/breaks.md antes de ejecutar.
Observa¶
just exp 11-bpe-train --tag broken-english-only
just exp 11-tokenize-eval --tokenizer english-only.json
Diagnósticos:
- Imprime 5 frases en español de muestra como tokens — deberían mostrar muchos tokens cortos / secuencias de bytes en bruto.
- Calcula
mean_tokens_per_wordpor idioma. El ratio debería estar muy lejos de 1.0. - Histograma de frecuencias de tokens del vocabulario sobre un corpus de español de retención. Si muchos tokens del vocabulario están sin usar, el vocabulario está sesgado hacia el inglés.
Síntoma que verá Borja¶
mean_tokens_per_spanish_word / mean_tokens_per_english_word ≈ 2.0(objetivo: 1.0).- Las frases en español se ven fragmentadas en la impresión de depuración.
- Un mini-GPT de la Fase 17 entrenado sobre estos tokens muestra una pérdida ~4× peor en español.
Causa oculta (una frase)¶
load_corpus(only_language="en") hizo que el tokenizer viera solo texto en inglés, así que su calendario de merges nunca comprimió los bigramas de caracteres del español.
Cascada de pistas¶
- Imprime los últimos 50 merges que aprendió el tokenizer. ¿Ves alguno con caracteres españoles?
- ¿Qué mide
mean_tokens_per_word, y cuál es el ratio entre idiomas? ¿Alguno es sospechosamente alto? - Mira la llamada a
load_corpus. ¿Usa los dos idiomas, o solo uno?
Diff de arreglo¶
Por qué esto enseña el concepto¶
El rendimiento de un modelo multilingüe está acotado por la cobertura del tokenizer. La historia de "usamos la Wikipedia en inglés para entrenar el BPE y el modelo es malo en francés" es un error bien conocido (ver Conneau et al. 2020, "Unsupervised Cross-lingual Representation Learning at Scale", §4). La Fase 11 lo saca a la superficie sobre un corpus microscópico y controlado donde Borja puede medir la fragmentación directamente y conectarlo con el coste cuadrático de la atención de la Fase 15. La Fase 12 (diseño del corpus) reforzará que el conjunto de entrenamiento del tokenizer y el del modelo deberían ser el mismo.
Siguiente: el /break de la Fase 12 sobre objetivos barajados.