// M2 · lección 11
Más datos, no más red: de small a medium-v4
La lección del módulo que no estaba en el plan: por qué small se quedaba corto, qué se probó primero y qué se probó después, la escalera de Elo que estaba mal calibrada y el modelo de 115 millones de parámetros sobre 1 681 millones de tokens del que parten los dos módulos siguientes.
Qué vas a construir
medium-v4: el decoder de 115 120 128 parámetros entrenado sobre 1 681 millones de tokens,
con 1504 de Elo estimado (IC 95 % 1446-1558) y un 99,8 % de jugadas legales sin máscara. De él parten
M4 y M5, y se publica como chorcat/rukh-medium.
Pero lo que importa es cómo se llegó a él. La curva de small invitaba a dos conclusiones: que le
faltaba entrenamiento y que tocaba una red más grande. Las dos eran equivocadas, y lo demuestra una
división. Es la pregunta que se hace cualquier equipo que preentrena un LLM antes de pedir más GPU:
¿me falta modelo o me faltan datos?
Las dos cifras de la cabecera miden cosas distintas: 35 minutos son los tuyos, leyendo y lanzando
comandos; las algo más de seis horas de máquina (368 minutos) son las descargas, las tres corridas
y las cuatro horas de medium-v4, que trabajan solas mientras haces otra cosa.
El diagnóstico cabe en una división
«Exportar a ONNX» terminó con el hueco entre entrenamiento y validación de small creciendo (0,021,
0,046, 0,060) mientras el top-1 se aplanaba. Antes de tocar nada, la cuenta:
data/tokens/uci/train/meta.json: 2 949 514 partidas, 240 068 954 tokensparámetros de small: 38 971 392tokens únicos por parámetro: 240 M / 39 M = 6,2pasadas sobre el corpus: 20 000 pasos × 256 secuencias × 200 tokens = 1 024 M / 240 M = 4,3Seis tokens por parámetro, cuando la literatura de escalado da como razonable unos veinte, y cuatro
pasadas y pico sobre el mismo material. El hueco que crecía era la firma de repetir material, y
explica por qué medium, con el triple de parámetros y los mismos datos, solo compró 84 puntos de
Elo (1091 frente a 1007, en la escalera sin corregir) con los intervalos solapados. Más red sobre el
mismo libro recita mejor el libro.
Ese medium v1 es configs/train/medium.yaml de p3-elo-1200: la receta de small con el preset
medium, 20 000 pasos sobre los mismos 240 M tokens, lr: 4.5e-4 y lotes de 32 × 8 (unas dos horas
en la 5090). No se repite aquí porque solo sirve de contraste; si quieres reproducirlo, es
uv run rukh train --config configs/train/medium.yaml con ese fichero.
Y había 238 millones de tokens parados: el mes de febrero entero era validación, para un bucle que evalúa leyendo 640 000. Primera palanca, y sin descargar nada.
Tres ejecuciones, una palanca cada una
// Antes de empezarQué cuesta cada lab, y cuál puedes saltarte
| Lab | Ruta | Reloj | Deja | Atajo |
|---|---|---|---|---|
| Corrida v2Más datos con la misma red pequeña | cuesta máquina | ~45 min | checkpoints/small-v2-<fecha>/best.pt | no hay |
| Corrida v3La Elite de 44 meses, tokenizada y entrenada | cuesta máquina | ~1,5 h de descarga + 5 min de tokenizar + ~45 de entrenar | data/elite/games.parquet, checkpoints/small-v3-<fecha>/best.pt | rukh pull rukh-games-elite small, desde un clon de la versión final (ver arriba) |
| Corrida v4medium-v4: la capacidad, cuando por fin está justificada | cuesta máquina | 4 h 3 min + ~30 de evaluación | checkpoints/medium-v4-<fecha>/best.pt, la base de M4 y M5 | rukh pull medium-v4, desde un clon de la versión final (ver arriba) |
- cuesta máquina
- Tiempo real de GPU, red o motor. El reloj es el de la RTX 5090 de referencia.
Las tres comparten planificador, semilla y la misma validación congelada, las 100 000 primeras partidas de 2025-02. Cada una cambia una sola cosa respecto a la anterior, para que la diferencia sea atribuible.
v2: devolver el mes de validación al entrenamiento. configs/data/pipeline-v2.yaml deja
val_games: 100000 y manda el resto al corpus: 240 M → 471 M tokens únicos, de 6,2 a 12,1 por
parámetro. La misma receta de small, con 28 000 pasos.
uv run rukh data tokenize --config configs/data/pipeline-v2.yaml --scheme uci --packuv run rukh train --config configs/train/small-v2.yamlv3: cambiar de qué está hecho el corpus. La Lichess Elite Database (database.nikonoel.fr)
publica por meses las partidas de 2500+ contra 2300+, sin bullet. Veinticuatro meses son unos 6,5
millones de partidas: más datos y otra distribución, porque el corpus de 1800+ tiene un 3,4 % de
partidas con las blancas en 2400 o más y la Elite un 93 %. configs/data/pipeline-v3.yaml las añade
con extra_train_parquets y deja la validación donde estaba.
uv run rukh data elite --config configs/data/pipeline-elite44.yaml # o bájalo publicado (arriba)uv run rukh data tokenize --config configs/data/pipeline-v3.yaml --scheme uci --packuv run rukh train --config configs/train/small-v3.yaml(pipeline-elite44.yaml descarga los 44 meses de la ejecución final; la v3 de referencia usó 24, y
si sigues el orden de esta página la tuya llevará 44.)
Con v1 al lado, «general» es la validación congelada y «fuerte», la misma pérdida sobre partidas de 2200+:
| Modelo | Par. | Tokens únicos | general | top-1 | fuerte 2200+ | top-1 | hueco train/val |
|---|---|---|---|---|---|---|---|
small v1 |
39 M | 240 M | 1,5197 | 51,20 % | 1,5391 | 50,84 % | +0,0603 |
medium v1 |
115 M | 240 M | 1,4782 | 52,31 % | 1,4880 | 52,06 % | — |
small v2 |
39 M | 471 M | 1,4703 | 52,49 % | 1,4652 | 52,69 % | +0,0242 |
small v3 |
39 M | 1 095 M | 1,4770 | 52,19 % | 1,4537 | 53,02 % | — |
Dos lecturas:
- Recuperar el mes vale −0,049 nats y el hueco cae a la mitad. Un nat es la unidad de la
pérdida cuando el logaritmo es natural, como en la entropía
cruzadaEntropía cruzadaLa pérdida con la que se entrena todo modelo de lenguaje: menos el logaritmo de la probabilidad que el modelo le dio al token que venía de verdad, promediado sobre las posiciones. Si le dio 0,70, paga 0,35; si le dio 0,035, paga 3,35. En PyTorch es
F.cross_entropy(logits, objetivo), que hace el softmax por dentro, y en Rukh llevaignore_index=0para que el relleno<pad>no cuente. Un modelo que reparte por igual entre las 2 030 jugadas paga ln 2030 ≈ 7,6: es el punto de partida de toda curva de pérdida del decoder. de la tabla: la «general» de v2 es 0,049 menor que la de v1.smallv2, con 39 millones de parámetros, bate almediumde 115 entrenado con los datos viejos. El cuello eran los datos, y ahora está medido. - La composición mueve otra cosa que la cantidad. v3 cede 0,007 en juego promedio y gana 0,012 en
juego fuerte. Y mueve el eje de Elo: la divergencia KLPenalización KLLa divergencia KL mide cuánto se aleja una distribución de otra:
Σ p · log(p/q), cero si son iguales y mayor cuanto más difieren (no es simétrica, así que no es una distancia en sentido estricto). La penalización KL es el término que ata la política a la copia congelada de donde salió; sin él, una recompensa verificable es una invitación a dejar de jugar al ajedrez y ponerse a cultivar el número. Rukh usa el estimador k3,exp(d) − d − 1cond = log π_ref − log π, que es no negativo por construcción: la diferencia de log-probabilidades a secas es negativa la mitad de las veces y pagaría al modelo precisamente por alejarse. (cuánto se separan dos distribuciones; cero si son iguales) entre las jugadas que propone con la cabecera<2800>y con<1800>pasa de 0,047 nats en v1 y 0,049 en v2 a 0,115 en v3. Duplicar los datos no movió ese eje; cambiar de qué están hechos, sí. Sin élite, el «juega como 1500 / 2000 / 2400» de M4 no tenía de dónde salir.
La escalera estaba torcida
Mientras se medían esas ejecuciones, la contradicción de la escalera se hizo imposible de ignorar:
small v2 puntuaba 0,725 contra UCI_Elo 1320 y perdía veinte a cero contra skill-3, etiquetado
con 1250. La medida de los escalones está en «El Elo y la suite»; esto es lo que la corrección le
hizo a lo publicado:
| Etapa | Publicado | Corregido | IC 95 % |
|---|---|---|---|
small v1 |
1007 | 1359 | 1293-1429 |
small v2 |
1070 | 1407 | 1344-1462 |
small v3 |
1095 | 1425 | 1367-1485 |
El listón de 1200 nunca se falló: small v1 estaba publicado con «Elo bar not met» y estaba en 1359. Lo relativo aguanta: la corrección sube a los tres casi lo mismo (+352, +337 y +330), el orden
no cambia y la mejora de los datos sigue ahí.
medium-v4: capacidad, cuando por fin está justificada
Con 1 681 millones de tokens únicos (enero, el resto de febrero y 44 meses de Elite, 18 942 740
partidas) salen 14,6 tokens únicos por parámetro para 115 millones, siete veces los 2,1 de
medium v1: medium deja de ser una red grande sobre un libro pequeño. configs/train/medium-v4.yaml
da 48 000 pasos, 2 457 millones de tokens vistos (21 por parámetro, la cifra que engaña si se
confunde con la de únicos) y 1,46 pasadas.
uv run rukh data tokenize --config configs/data/pipeline-v4.yaml --scheme uci --packuv run rukh train --config configs/train/medium-v4.yamluv run rukh eval --model "$RUKH_HOME/checkpoints/medium-v4-<fecha>/best.pt" --config configs/eval/greedy.yaml --stage medium-v4-greedyuv run rukh data tokenize --config configs/data/pipeline-v4.yaml --scheme uci --packuv run rukh train --config configs/train/medium-v4.yamluv run rukh eval --model "$env:RUKH_HOME\checkpoints\medium-v4-<fecha>\best.pt" --config configs/eval/greedy.yaml --stage medium-v4-greedyTokenizar tarda cinco minutos y deja 3,3 GB en data/tokens-v4/uci/. El entrenamiento duró 4 h 3 min,
el trabajo más largo de la primera fase: se lanza al final de una sesión y se recoge en la
siguiente. La evaluación canónica (greedy.yaml, temperatura 0,05, cabecera en 1800, escalera
corregida) tarda media hora.
| Modelo | Par. | Tokens únicos | val/loss | Elo | IC 95 % | legal argmax | top-1 | puzles |
|---|---|---|---|---|---|---|---|---|
small v1 |
39 M | 240 M | 1,5197 | 1359 | 1293-1429 | 99,40 % | 51,10 % | 22,07 % |
medium v1 |
115 M | 240 M | 1,4782 | — | — | 99,40 % | 52,90 % | 23,93 % |
small v2 |
39 M | 471 M | 1,4703 | 1407 | 1344-1462 | 99,30 % | 51,80 % | 26,93 % |
small v3 |
39 M | 1 095 M | 1,4770 | 1425 | 1367-1485 | 99,10 % | 52,40 % | 26,73 % |
medium-v4 |
115 M | 1 681 M | 1,3733 | 1504 | 1446-1558 | 99,80 % | 54,40 % | 37,50 % |
Elo, legalidad, top-1 y puzles vienen de la evaluación canónica, que no es el top-1 de validación
de la tabla anterior (por eso medium v1 lee 52,90 % aquí y 52,31 % allí). Su Elo va en blanco
porque solo se midió en la escalera torcida; ponerle un número sería inventarlo.
Tres cosas de esa fila:
- No era la arquitectura. El mismo
medium, con la misma receta, pasa de 1,4782 con 240 M de tokens repetidos 4,3 veces a 1,3733 con siete veces más material único. - La legalidad no era una tendencia. La serie 99,40 → 99,30 → 99,10 % de las tres
smallera un modelo de 39 M estirándose sobre un corpus creciente; con capacidad suficiente, fuerza y legalidad suben juntas. - Los puzles son donde más se ve: de 22,07 % a 37,50 %. Un puzle pide la jugada única que gana, no la que jugó un humano, y es la métrica que menos premia imitar.
Los +145 Elo entre small v1 y medium-v4, palanca a palanca: recuperar el mes de validación +48, la
Elite +18, la capacidad ya justificada +79.
Lo que se publica y lo que se mide después
chorcat/rukh-small es small v3, la mejor de la serie, y chorcat/rukh-medium es medium-v4. La
demo sirve small porque 79 MB en fp16 caben en un móvil y 231 no.
Los modelos publicados sirven para comparar. Exporta tu medium-v4, cárgalo en la demo con «Tu
propio modelo», elige después Rukh medium (fp16) y juega la misma apertura. Si tu entrenamiento
salió bien, las partidas se parecerán; si la tuya juega notablemente peor, tienes la pista antes de
gastar media hora de evaluación.
Al comparar con las cards, una advertencia: small v3 midió 1425 (1367-1485) un día y 1365
(1293-1423) al siguiente, con la misma config, semilla y pesos. El rival juega por tiempo y con
UCI_LimitStrength, que aleatoriza a propósito, así que la escalera tiene
un suelo de reproducibilidadSuelo de reproducibilidadCuánto se mueve una medición cuando no se cambia nada: el límite por debajo del cual dos números del mismo instrumento no se pueden distinguir. En la escalera de Rukh son unos 40 puntos de Elo de una sigma —±80 al 95 %—, medidos midiendo medium-elo a <w1800> dos veces con la misma semilla y obteniendo 1498 y 1558. La semilla fija el muestreo del modelo y no el del rival, que juega por tiempo y con UCI_LimitStrength, así que «las mismas 160 partidas» no son las mismas partidas. Cualquier diferencia entre modelos más pequeña que eso no es una diferencia entre modelos, y no hay número de partidas que lo arregle. de unos 40 puntos. Es la
báscula de baño que te da 82 y 84 al subirte dos veces seguidas: no está rota, pero no te deja
afirmar que has adelgazado un kilo. Dos Elo de la escalera se comparan dentro de una misma tirada,
no entre tiradas, y por eso las cifras se mueven unas decenas de puntos cuando la tabla única
vuelve a medir los modelos juntos (small v1 1355, medium-v4 1535).
// Ejercicio 01Haz la división antes de tu siguiente ejecución
Toma meta.json del corpus con el que entrenaste small y calcula tokens únicos por parámetro y
pasadas. Haz lo mismo para tiny (6 000 pasos de 128 × 2 × 200 tokens sobre el mismo corpus).
¿Cuál estaba más lejos de los veinte? ¿Cuál repitió más el material?
// SoluciónVer la solución
small: 240 M / 39 M ≈ 6,2 tokens por parámetro y 1 024 M / 240 M ≈ 4,3 pasadas. tiny: 240 M
/ 5,3 M ≈ 45 por parámetro y 307 M tokens vistos, 1,3 pasadas. tiny estaba sobrado de datos y
corto de red; small, al revés. La palanca de small era material, y la de tiny habría sido
capacidad, que es justo lo que small es respecto a tiny.
// Ejercicio 02Predice el Elo desde la pérdida, y comprueba cuánto te fías
Con small v1 (1,5197 → 1359) y medium-v4 (1,3733 → 1504) traza una recta pérdida-Elo y predice
el Elo de small v2 (1,4703). Compáralo con el medido, 1407 (1344-1462). ¿Sirve la recta como
criterio de aceptación?
// SoluciónVer la solución
La pendiente es (1504 − 1359) / (1,5197 − 1,3733) ≈ 990 Elo por nat, y la predicción para v2, 1359 + 990 × 0,0494 ≈ 1408: clavado. Aun así no sirve como criterio. La recta se ajustó con modelos entrenados sobre la distribución de la validación, y v3, con élite, cae fuera (predice 1401 y midió 1425). Y la escalera tiene un suelo de unos 40 puntos, así que una predicción a diez puntos es más precisa que el instrumento que la contrastaría. Sirve para descartar un experimento en 40 minutos; el Elo se mide siempre.
Qué has aprendido, cómo se mide
La primera pregunta ante un modelo que se queda corto no es cuántos parámetros tiene, sino cuántos tokens distintos ha visto por cada uno, y el hueco entre entrenamiento y validación responde antes de gastar una GPU. Cantidad y composición del corpus son palancas distintas, y solo la segunda mueve un eje que no estaba en los datos. Una escala contra la que mides tiene que haberse medido a sí misma. Y escalar la red es lo correcto justo cuando la división lo permite, y un error un momento antes.
medium-v4: 1504 de Elo (1446-1558) y 99,80 % de legalidad sin máscara, los dos criterios del hito
con el intervalo entero por encima, y 37,50 % de puzles.
Al empezar el módulo, el aprendiz solo sabía cómo se escribe una jugada. Ahora ha leído millones de partidas y juega de oído: propone jugadas legales el 99,8 % de las veces y le planta cara a un Stockfish limitado a 1500, sin haber visto nunca un tablero. Es lo que tiene cualquier LLM recién preentrenado: sabe continuar muy bien lo que ha leído. Lo que todavía no sabe es juzgar: mirar una posición entera y decir quién va mejor o dónde estuvo el error. Eso es M3.
La cheatsheet del módulo está justo debajo.
// el recorrido · lo conseguido
- M0 El tallerEntorno reproducible(hecho)
- M1 Datos y tokensDatos y tokenización(hecho)
- M2 El decoderPreentrenar un GPT(hecho)
- M3 El encoderEmbeddings y clasificar(por delante)
- M4 Fine-tuningSFT y LoRA(por delante)
- M5 AlineamientoPreferencias: DPO, GRPO(por delante)
- M6 Evaluar y publicarMedir y desplegar(por delante)
- FASE 2 El entrenadorAgentes, RAG, MCP
lo que tienes ahora
Tres GPT entrenados desde cero en una GPU, más del 99 % de jugadas legales sin ayuda, un Elo medido con su margen de error y el modelo jugando en tu navegador.
siguiente parada · M3 El encoder
Aprende a mirar una posición entera y juzgarla: quién va mejor y si la última jugada fue un error.
// cheatsheet M2
Once preguntas para llevarte
- 01Explica la atención en tres frases.
- Cada posición proyecta su vector en una consulta (Q), una clave (K) y un valor (V). El producto escalar entre la consulta de una posición y las claves de todas las demás, dividido por la raíz de la dimensión de la cabeza y pasado por softmax, da un reparto de pesos que suma 1. La salida es la media de los valores ponderada por esos pesos: softmax(QKᵀ/√d)·V. La escala 1/√d existe porque el producto escalar de d dimensiones tiene varianza d y sin ella el softmax saturaría y el gradiente se anularía.
- 02¿Qué es la máscara causal y qué pasa si falta?
- Poner a menos infinito, antes del softmax, el peso de toda clave posterior a la consulta, de modo que la matriz de atención queda triangular inferior. Sin ella la posición t puede leer el token t+1, que es justo el que tiene que predecir: la tarea pasa de predecir a copiar, la pérdida se desploma y el top-1 se dispara, pero al generar (donde no hay futuro) el modelo juega al azar. Se detecta porque la legalidad sin máscara se hunde, y se verifica con un test: cambiar un token futuro no debe mover los logits pasados ni un decimal.
- 03¿Por qué pre-norm y no post-norm?
- Pre-norm pone el LayerNorm dentro de la rama, antes de la subcapa (x = x + attn(ln(x))), así que la conexión residual queda libre: la derivada de cada bloque es la identidad más la de la subcapa y el gradiente llega íntegro desde la pérdida hasta el embedding. Post-norm normaliza después de la suma, mete la normalización en el camino residual y hace que una pila profunda solo entrene con warmup largo e inicialización muy cuidada. Es un cambio de dos caracteres que convierte doce capas entrenables con suerte en doce capas entrenables.
- 04¿Qué hace el warmup y qué pasa sin él?
- Sube la tasa de aprendizaje linealmente desde cero durante los primeros pasos (1 000 en rukh-small) antes de empezar el coseno. En los primeros pasos, Adam estima el segundo momento con un puñado de gradientes y su paso normalizado puede mover un parámetro tanto como la tasa entera; sobre una red recién inicializada eso satura la atención y el modelo cae en predecir siempre las jugadas más frecuentes. No suele explotar con un NaN: se queda en una pérdida mediocre que ya no baja, que es peor porque no se nota.
- 05Temperatura y top-k: ¿en qué se diferencian?
- La temperatura divide los logits antes del softmax y reescala toda la distribución: por debajo de 1 la concentra (con 0 es el argmax), por encima la aplana. El top-k no reescala, recorta: deja solo los k tokens de mayor probabilidad y pone el resto a cero. Son complementarios, no alternativas. Con 2 030 jugadas, la cola de mil opciones improbables suma un porcentaje apreciable de disparates; el top-k la elimina y la temperatura decide cuánto arriesga el modelo dentro de lo que queda. Rukh usa temperatura 0,6 y k = 20, y lo paga: en small, jugar a 0,6 en vez de casi a cero cuesta unos 180 puntos de Elo.
- 06¿Qué mide la legalidad sin máscara, por qué hay dos cifras y por qué no vale medirla con máscara?
- Mide el porcentaje de jugadas legales que propone el modelo cuando se le deja emitir el token que quiera, sobre 1 000 posiciones de validación. Se publica dos veces: legality_argmax toma el token más probable (sin temperatura ni top-k) y legality_sampled saca uno como lo saca la demo (temperatura 0,6 y top-k 20), que es siempre la menor de las dos porque muestrear mete cola. El listón de ≥ 99 % para rukh-small es el argmax, porque habla de lo que saben los pesos y no de un ajuste del muestreador; la muestreada es lo que experimenta un jugador y va al lado con su definición. Con la máscara de legalidad puesta el 100 % está garantizado por construcción, así que estarías midiendo a python-chess y no al modelo.
- 07¿Por qué bf16 y no fp16?
- Los dos ocupan 16 bits, pero reparten distinto. fp16 tiene 5 bits de exponente y 10 de mantisa: mucha precisión y poco rango, con el mínimo normal en torno a 6e-5, justo donde viven los gradientes de una red profunda, así que se van a cero y hace falta un GradScaler con escalado dinámico de la pérdida. bf16 tiene 8 bits de exponente (el mismo rango que fp32) y 7 de mantisa: menos precisión por número y nada que se desborde por abajo, así que entrena sin escalar nada. En una GPU moderna es nativo, así que la simplicidad sale gratis.
- 08¿Qué es un checkpoint y qué tiene que llevar dentro?
- Una fotografía del entrenamiento en disco. No basta con los pesos: lleva el paso alcanzado, el estado del optimizador (los momentos de Adam), el estado de los generadores aleatorios, la configuración del modelo y de la tirada y la procedencia (hash del vocabulario, hash del manifiesto de datos y SHA de git). Con eso se puede reanudar exactamente donde se cortó, evaluar el modelo meses después y decir con qué datos exactos se entrenó. Rukh escribe uno cada 1 000 pasos más best.pt por pérdida de validación.
- 09¿Qué es la perplejidad?
- La exponencial de la entropía cruzada media. Se lee como entre cuántas opciones equiprobables duda el modelo: con un vocabulario de 2 030 jugadas, un modelo sin entrenar tiene perplejidad 2 030 y pérdida ln(2030) ≈ 7,6; una pérdida de 3,0 es perplejidad 20, es decir, acierta como si eligiera al azar entre veinte jugadas. Como en una posición típica hay unas treinta legales, esa cifra ya implica bastante aprendizaje. No es una métrica aparte: es la misma pérdida en otra escala.
- 10¿Qué significa un intervalo de confianza del Elo y por qué importa?
- El Elo estimado es el valor que mejor explica los resultados contra rivales de fuerza conocida según la fórmula logística P = 1/(1+10^((rival−modelo)/400)); el intervalo del 95 % dice cuánto podría moverse ese valor si se repitieran las partidas, y se calcula por bootstrap remuestreando los resultados y reajustando mil veces. La suite juega 20 partidas contra cada uno de ocho escalones, 160 en total: a un 50 % de rendimiento la desviación típica sería de unos 27 puntos (±54), y el bootstrap sobre las partidas reales de small da ±68 (1359, IC 1293-1429), porque contra la mayoría de escalones el modelo está lejos del 50 % y cada partida informa menos. Es decir: una mejora de 10, 30 o 50 puntos de Elo medida con una escalera de 160 partidas no es una mejora, es ruido, y presumir de ella es el error clásico de los benchmarks.
- 11¿Cuándo se escala la red? Tokens únicos por parámetro.
- Antes de subir de talla, divide los tokens únicos del corpus (los de meta.json, no los vistos por el bucle: repetir material no lo convierte en material nuevo) entre los parámetros. small v1 iba a 240 M / 39 M = 6,2, con 4,3 pasadas sobre el mismo corpus, y su hueco train/val crecía (+0,060) mientras el top-1 se aplanaba: la firma de material agotado, y triplicar la red (medium v1, mismos datos) solo compró 84 Elo con los intervalos solapados. Devolver el mes de validación al corpus (471 M, 12,1 por parámetro) bajó la pérdida del mismo small de 1,5197 a 1,4703 y batió a medium. medium-v4, con 1 681 M de tokens únicos (14,6 por parámetro, 1,46 pasadas), da 1504 de Elo y 99,80 % de legalidad. Hueco creciendo y métrica plana: faltan datos; hueco estable y métrica subiendo: hay margen en pasos o en capacidad.