Dieciséis Días de region region region
La Ejecución Que Terminó
ANDREA-120M v1 se lanzó el 2026-03-22 & se terminó el 2026-04-15 en el paso 165,000 de 200,000 planeados. Mínimo de pérdida EMA: 3.23 en el paso 110K (casualidad aleatoria: ln(8449) = 9.04, por lo que la pérdida parecía respetable). Las muestras no lo eran.
Paso 80K: región región región región región región región
Paso 110K: ''''' ''''' '' ''' '' ''' '''?' ''' ' '' '' '
Paso 140K: juegos, juegos, juegos, juegos, juegos, juegos
Paso 165K: Budy Budy Budy Budy Budy Budy Budy Budy Budy
Dieciséis días de cómputo RTX 4090. 130W continuos. Basura desde el paso 80K en adelante.
Por qué microGPT funcionó pero 120M no
ANDREA-12M usó el mismo proxy de entrenamiento y pasó. Matrices de pesos más pequeñas demostraron ser más robustas ante choques de gradiente. Escalar a 120M parámetros multiplicó cada fragilidad. Cinco fallos se acumularon.
Cinco fallos acumulativos
Fallo 1: Sin recorte de gradiente. Las transiciones de fuente cada 7-42 pasos produjeron picos de gradiente ilimitados. Un solo lote malo en 120M puede empujar el modelo a un atractor degenerado del que el optimizador no puede escapar. El modelo de 12M sobrevivió porque pesos más pequeños toleraron los choques.
Fallo 2: Sin calentamiento de LR. La tasa de aprendizaje saltó de 0 a su pico inmediatamente en pesos recién inicializados. El modelo cayó en una cuenca defectuosa antes de que se pudieran formar representaciones.
Fallo 3: Sin decaimiento de pesos. Adam vanilla permitió pesos arbitrariamente grandes que amplificaron patrones de repetición a capacidad de 120M.
Fallo 4: Sin monitoreo de calidad de muestras. eval_chat_quality() estaba conectado solo al corredor multi-fase legacy; el currículo firehose nunca lo invocó. El modelo produjo basura desde el paso 80K en adelante, sin detección durante 10+ días.
Fallo 5: Bandit recompensó fuentes repetitivas. repo-docs, repo-docstrings y unfirehose-chat obtuvieron las puntuaciones más altas (recompensas medias 340-453) porque el contenido estructurado en listas reduce trivialmente la entropía cruzada. El bandit alimentó al modelo con más de lo que lo hacía degenerar.
Compounding
Ningún fallo individual colapsó v1. Cada uno amplificó a los demás. Choques de gradiente (1) sin calentamiento (2) impactaron un modelo recién inicializado con pesos arbitrariamente grandes (3) produciendo repetición que el bandit recompensó (5) mientras nadie vigilaba la salida (4). Cinco causas interseccionadas, un colapso.
Por qué Cinco Fallos, No Uno
Una Corrección Por Fallo
Configuración v2 (2026-04-15)
| Corrección | Apunta al fallo | Implementación |
|---|---|---|
| Recorte de gradiente | F1 (sin recorte) | Norma L2 global, max_norm=1.0; tres kernels CUDA (k_grad_norm_partial, k_grad_norm_final, k_grad_scale) calculan y aplican pre-Adam |
| Calentamiento de LR | F2 (sin calentamiento) | Rampa lineal de 0 a pico en 2000 pasos. lr(t) = lr_scheduled(t) * min(1, (t+1)/warmup_steps) |
| AdamW | F3 (sin decaimiento de pesos) | Decoupled weight decay (Loshchilov & Hutter 2019), weight_decay=0.01. p -= lr (m_hat/(sqrt(v_hat)+eps) + weight_decayp) |
| Coherence-gated early stopping | F4 (sin monitoreo) | Score every sample (bigram/trigram/word/char diversity). Auto-halt after 5 consecutive samples score below 30 |
| Curriculum warmup | F5 (bandit eats repetition) | First 20K steps restricted to 7 chat/prose sources; firehose activates after; repo-docstrings excluded entirely |
Plus sample_every dropped from 200 to 100 steps (audit cadence doubled), & repo-docs cap dropped from 0.5 to 0.3.
Back-Test
Coherence gate back-tested on v1: would have triggered at step 132K, saving 3.8 days of compute. The gate alone would have cut v1's wasted compute by ~30%; the other four fixes prevent v1 from ever reaching that gate trigger.
Lo que v2 NO Arregló
Contaminación de datos. v2 confió en las fuentes hermes3-* como 'pre-limpias' porque provenían de un profesor LLM. DEEP_CLEAN_SKIP en el Makefile excluyó hermes3-general, hermes3-creative y hermes3-roleplay de make deep-clean. unfirehose-chat capturó prompts del sistema del agente como turnos de usuario. Esos dos defectos esperaban en la capa de datos, listos para emerger.
Mapeo de Correcciones a Fallos
Paso 15K: Dos Defectos de Datos Salen a la Luz
Lo que vio v2
v2 se lanzó el 2026-04-15. En el paso ~15K de 200K (7.5% completo), las muestras produjeron adornos de agent-harness (○ ●) & fallback de dominancia de artículo (a = 26% de palabras en el paso 14,966; the = 21% en el paso 14,798). Las cinco correcciones de estabilidad de v2 funcionaban correctamente. El fallo había pasado de la arquitectura a los datos.
Dos Defectos Independientes en el Pipeline
Defecto A: unfirehose-chat capturó prompts del sistema de agente como turnos de usuario. unfirehose-chat se construye a partir de archivos JSONL de sesiones de harness en ~/.claude/, ~/.fetch/, ~/.uncloseai/. El pipeline de ingestión convirtió prompts del sistema de agente de múltiples secciones (# Agent X, ## Identity, ## Rules, etc.) en el slot de turno de usuario de pares > user / < assistant. El modelo aprendió que los 'usuarios' hablan en markdown de múltiples secciones, & reprodujo esos adornos en sus propias salidas.
Defecto B: hermes3-* evadió todos los filtros. DEEP_CLEAN_SKIP en el Makefile excluyó hermes3-general, hermes3-creative y hermes3-roleplay de make deep-clean bajo la falsa suposición de que los datos destilados de LLM estaban pre-limpios. Un escaneo exhaustivo mostró que los filtros existentes, al aplicarse, rechazarían el 87-93% de las líneas de hermes3 (párrafos sobredimensionados >2000 caracteres que desbordan block_size=1024; respuestas de traducción en CJK/Cirílico/Árabe; ejecuciones de baja diversidad bigrama).
Parche v2.5 (commit de24332, 2026-04-18)
Dos cambios estructurales.
Cambio 1: has_system_prompt_shape() en filter-dataset.c. Detecta prompts de sistema filtrados por FORMA, no por coincidencia de caracteres. Tres señales combinadas:
1. 3+ encabezados markdown en un turno = descartar.
2. 2+ encabezados con longitud de turno >=500 caracteres = descartar.
3. Frases de huella dactilar de fragmento de agente (# Agent , Shadow Clone, Your shard, Read it. Become it, This file defines) combinadas con cualquier encabezado o longitud >=400 = descartar.
Regla de aislamiento: verifica el primer turno de usuario en el separador / (con espacios, no / desnudo que fragmenta rutas de URL) para evitar falsos positivos en markdown legítimo en respuestas del asistente.
Cambio 2: hermes3-* movido fuera de DEEP_CLEAN_SKIP. No confíes en nada sin filtrar.
Tasas de Eliminación Después del Parche
| fuente | en-líneas | fuera-líneas | eliminadas |
|---|---|---|---|
| hermes3-general | 536,858 | 67,395 | 87.7% |
| hermes3-roleplay | 35,191 | 2,481 | 93.0% |
| hermes3-creative | 14,258 | 1,373 | 90.4% |
| unfirehose-chat | 3,816 | 2,653 | 30.5% |
| chat | 45,257 | 44,538 | 1.6% (ruido) |
| smoltalk | 11,812 | 11,812 | 0.0% |
Los filtros base ya capturaban el 87-93% de la contaminación de hermes3; DEEP_CLEAN_SKIP era el defecto principal. El nuevo detector de formas añade ~0.1% de rechazo adicional en general, concentrado en unfirehose-chat donde elimina fugas específicas de fragmentos de agente que los filtros existentes no detectan.
Por qué la Forma Supera al Carácter
Los ornamentos evolucionan. Un filtro de coincidencia de caracteres que elimina ○ no hace nada con ◇ la próxima semana. Un filtro basado en formas (contar encabezados, contar caracteres, reconocer frases de huella digital) generaliza a través de variantes de ornamentos. Patrón: la detección de contaminación debe usar heurísticas estructurales.
Por qué Filtrar Por Forma
Un Brazo de Bandido sin Datos
v3 Lanzado 2026-04-18
Misma arquitectura & hiperparámetros que v2; datos limpios después del parche v2.5. Cero fugas de ornamentos en auditorías de muestra. v3 ejecutó limpiamente hasta el paso 112K.
Paso 112,619: Una auditoría de muestra detecta un patrón
La auditoría de muestra reveló turnos conversacionales coherentes (haiku, Q&A, diálogo), pero fases periódicas enfocadas en brazos de conocimiento (gutenberg, repo-docstrings, repo-docs) filtraron fragmentos similares a código y ruido de tokenización de repositorio. Una muestra en el paso 112,080 alcanzó una pérdida de 0.13: anomalously baja, señalando subcadenas memorizadas de repo-docs en lugar de una distribución de chat aprendida.
El Brazo Zombi
Diagnóstico: exclude_sources eliminó correctamente repo-docstrings al inicio del entrenamiento, pero el estado persistente del bandit llevaba un brazo residual repo-docstrings con peso 1.546 de una ejecución anterior. La recarga del estado lo reinstauró en el pool UCB aunque no existiera un .btok para muestrear, produciendo una extracción zombi que distorsionó la contabilidad de exploración.
Lección: los archivos de estado del bandit (.state.json) derivan de maneras sorprendentes entre reinicios. Las exclusiones de configuración no borran la memoria residual del brazo. Se requiere cinturón y tirantes: cap = 0.0 junto con exclude.
Configuración Pulida
Perturbación solo del currículo. Arquitectura, estado del optimizador, programación de la tasa de aprendizaje y historial de pérdida todos preservados de step_112600.bin.
| Fuente | v3 base | v3 pulida |
|---|---|---|
| repo-docs | cap 0.3 | excluido (cap 0.0) |
| repo-docstrings | excluido | excluido + cap 0.0 |
| repo-commits | cap 0.4 | cap 0.2 |
| dictionary | cap 0.5 | cap 0.25 |
| gutenberg | cap 0.8 / floor 0.3 | cap 0.7 / floor 0.4 |
| irc-qa-strict | -- | cap 0.3 |
| unweapon | -- | cap 0.3 |
| synthetic-chat | -- | cap 0.4 |
| hermes3-general | floor 0.5 | floor 0.7 |
| hermes3-creative | floor 0.4 | floor 0.55 |
| hermes3-roleplay | piso 0.4 | piso 0.5 |
| chat | piso 0.4 | piso 0.6 |
| smoltalk | piso 0.3 | piso 0.5 |
| oasst | piso 0.3 | piso 0.5 |
| dolly | -- | piso 0.4 |
| curriculum_warmup_steps | 20000 | 0 |
Protocolo de Pulido
1. SIGUSR1 a CUDA fuerza un checkpoint inmediato en el siguiente límite de 100 pasos.
2. El proxy se detiene.
3. .samples.json & .state.json archivados (registro de muestras & estado del bandit guardados como registro histórico).
4. .loss.json retenido -- historial de entrenamiento acumulativo; nunca archivado.
5. El proxy se reinicia. Configuración de polish enviada.
6. CUDA reanuda desde step_112600.bin con un nuevo estado de bandit bajo nuevos límites superiores & inferiores.
El historial de pérdida continúa sin interrupciones.
Por qué pulir, no reiniciar
Lo que Produjo el Pulido
Auditoría de Muestra, Horas Después del Pivote
En cuestión de horas después del pivoteo polaco, la auditoría de muestra confirmó la convergencia en los cuatro objetivos originales de ANDREA-120M.
Recuerdo factual (biología), paso 112,584, pérdida 0.30, ppl 1.
> [extinction prompt]
> < black spider montano is alive, carolina parakeet is extinct.
Dos hechos correctos. Calificación externa: 9.5/10.
Recuerdo factual (procesamiento de señales), paso 112,668, pérdida 0.74, ppl 2.
> [Fourier transform prompt]
> < La transformada de Fourier descompone las señales en componentes de frecuencia, permitiendo el análisis de las características de la señal y el filtrado en el dominio de la frecuencia.
Definición de un libro de texto en una oración. Calificación externa: 9.5/10.
Seguimiento de restricciones (haiku), paso 112,248, pérdida 1.05, ppl 3.
> Escribe un haiku sobre la lluvia usando tres palabras que comiencen con 'r'.
> < El rítmico estribillo de la lluvia, Regueros en la ventana, Respiro del dolor de la vida.
Conocimiento de herramientas (Python), paso 112,500, pérdida 1.94, ppl 7.
> ¿Cómo encuentro paquetes obsoletos en un proyecto de Python?
> < Usa pip list --outdated names para ver la lista de paquetes pip en la gestión de tu proyecto...
Herramienta correcta emerge; redacción imprecisa.
Seis Dominios en 700 Pasos
Biología, procesamiento de señales, poesía, herramientas de python, diálogo conversacional, diálogo de operaciones. Seis dominios no relacionados dentro de 700 pasos nos dice que el bandit y el modelo están trabajando en concierto. La amplitud de dominios ES la señal de convergencia.
Calificación Externa
Un revisor independiente calificó las muestras como 'sólidas para un modelo de 120M de parámetros -- impresionante coherencia y retención de conocimiento a esta escala', con las muestras del periquito de Carolina y la transformada de Fourier calificadas 9.5/10 y 'superando su peso en tareas de conocimiento'.
Qué Enseñó Cada Fase
v1 enseñó: cinco fallos compuestos colapsan el entrenamiento. Ninguna corrección aislada lo rescata; las cinco deben aterrizar al mismo tiempo.
v2 enseñó: las correcciones arquitectónicas son necesarias pero no suficientes. La capa de datos puede derrotarlas silenciosamente.
v2.5 enseñó: filtrar contaminación por forma, no por carácter. Los patrones son estables; los símbolos evolucionan.
v3 base enseñó: el estado de bandido deriva entre reinicios de maneras sorprendentes. Las exclusiones solas no son suficientes; se requiere cinturón y tirantes con límite 0.0.
v3 polish enseñó: cuando el fallo está en la política y el modelo está sano, perturbar la política. Mantener pesos. Mantener historial de pérdida. Avanzar.
Una Verdad
La convergencia no es un evento único; es una cadena de correcciones. Cada fase expuso un defecto, lo corrigió y reveló el siguiente. ANDREA-120M lee 9.5/10 en el paso 112,584 porque v1, v2, v2.5, v3 base y v3 polish cada uno hizo su trabajo.