rukh · lab

// M5 · lección 08

Alineamiento: cómo se mide y lo que salió

El balance del hito y su detalle: un reward model que falla donde tiene que fallar, DPO con dos fuentes de pares, seis enfrentamientos y un triángulo que no cierra, el peaje en legalidad, la galería de reward hacking, GRPO con forma de U invertida y los tres criterios uno por uno.

  • tiempo de trabajo40 min
  • nivel medio
  • actualizado el23 de septiembre de 2026

Las seis lecciones anteriores son el código; esta es lo que midió. Empieza por el balance, para que sepas desde el principio qué se consiguió y qué costó, y después cuenta de dónde sale cada número.

El balance

El plan del hito escribió tres criterios antes de medir nada:

Se pedía Salió Veredicto
DPO o GRPO ≥ +50 Elo con intervalo sobre la base DPO fuera de política +65 (IC 49,74 a 80,76), DPO dentro +57 (36 a 79), GRPO +44 (23 a 66) cumplido en la estimación; el extremo inferior se queda a 0,26
Reward model ≥ 75 % en pares no vistos 72,91 % a 75,19 % en cinco ejecuciones; 77,30 % sobre los pares sin mate rozado, y por debajo del ruido del instrumento que lo comprueba
rukh-rm, -dpo y -grpo en el Hub con card publicados, sobre medium-v4 cumplido

Lo más importante está en la primera fila: los tres métodos baten a su base con el intervalo separado del cero. Es la primera vez en el proyecto que un modelo se mide de forma demostrable mejor que el modelo del que parte, y lo que cambió desde M4 fue tanto el modelo como la forma de medir.

Lo que costó, medido en las mismas ejecuciones: los modelos alineados proponen entre 1,7 y 2,9 veces más jugadas ilegales que su base, y aciertan menos la jugada que eligió el humano. Y por el camino salieron tres lecciones de medida: restar dos medidas contra un tercero engaña, el ruido de un montaje se mide antes de explicar una diferencia pequeña, y una métrica que se puede subir colapsando la política acabará subiendo así.

El reward model: tres de cada cuatro, y el cuarto siempre es el mismo

Cinco ejecuciones del mismo reward model dan 72,91 %, 74,21 %, 74,71 %, 74,76 % y 75,19 % de acierto en pares no vistos. La frontera del 75 % se toca y no se cruza de forma estable, por dos motivos.

El primero: split_examples reparte por partida con la semilla del entrenamiento, así que cambiar la semilla cambia cuántos pares de mate caen en validación: 484 con la semilla 42, 356 con la 1. Como los mates son donde el modelo peor va, el titular sube cuando el sorteo reparte menos.

El segundo salió al repetir la ejecución de la semilla 42 sin cambiar nada: 74,21 % donde antes había salido 72,91 %, con el mismo reparto y los mismos hiperparámetros. Son 1,30 puntos de kernels de GPU no deterministas. Con ese suelo, el 75,19 % de la semilla 2 y el 74,21 % de la 42 no se distinguen, y buscar el 75 % con más semillas sería pescar.

Más que el titular, interesa dónde está el error:

75 %50 %acierto77.5100-200556 pares74.8200-400242 pares80.8400-800104 pares90.0800-200010 pares68.3mate356 paresdistancia entre las dos jugadas según el motor (cp), y la banda de mate apartela barra hueca tiene diez pares: en cuatro semillas dio 90, 68, 90 y 50 %margen frente a distancia: Pearson −0,128 con los mates, +0,058 sin ellos
El acierto se desploma justo en la banda de mate, que es algo más de un cuarto de los pares y lo único que una recompensa verificable contesta sin error. La correlación cambia de signo al quitarla.

La banda de mate es la peor en las cuatro ejecuciones con semilla distinta —68,3 % a 71,7 %— y es entre algo más de un cuarto y un tercio de los pares de validación, según la semilla: 356 de 1 268 con la 1, que es la de la figura, y 484 de 1 462 con la 42 de la config publicada. La mejor es la de 400-800 cp, entre 80,2 % y 85,4 %. Un mate es un hecho táctico, y el modelo lee una evaluación estática de la posición que queda: no lo puede ver. Sin esa banda el acierto sube a 77,30 %, pero quitarla es cambiar la pregunta, así que se publican las dos cifras con el recuento de cada banda.

Lo que no se puede decir es que el acierto suba monótonamente con la distancia. Las bandas 100-200 y 200-400 se cruzan según la semilla, y la de 800-2000 tiene entre diez y veintidós pares: dio 90 %, 68 %, 90 % y 50 %. Por eso está dibujada hueca.

La correlación entre el margen del modelo y la distancia en centipeones sale negativa en las cuatro ejecuciones, de −0,034 a −0,156, como si el modelo estuviera más seguro cuanto más parecidas son las dos jugadas. Pero los pares de mate tienen, por construcción, la distancia más grande (≥ 2 000) y el margen más pequeño (+0,744 de media frente a +1,272), y un cuarto de los puntos en esa esquina basta para torcer la recta:

conjunto pares Pearson Spearman acierto
todos 1 268 −0,1276 −0,0674 74,76 %
sin mates 912 +0,0576 +0,0747 77,30 %

El signo lo cambia el subconjunto. Una correlación sobre dos regímenes distintos no describe ninguno; antes de interpretar un signo, mira si hay un grupo que lo esté poniendo.

Tres cosas más salieron de la bandeja de experimentos:

  • El encoder de M3 resta: partir del de cabezas, el único de casillas, da unos 6,5 puntos menos que inicializar al azar.
  • La capacidad manda: 12 capas × 512 sube donde ninguna otra palanca subía.
  • El punto de vista importa poco: pedir «buena para las blancas» en vez de «buena para quien acaba de mover» gana unos dos puntos. Queda como point_of_view en la configuración.

Los reward models de los asistentes se leen igual: un acierto sobre pares retenidos que nunca es muy alto, porque las propias personas que etiquetan discrepan entre sí, y que esconde dónde falla hasta que lo partes por tipo de pregunta.

Los pares que salen del propio modelo son otra cosa

rukh data onpolicy recorre las 13 838 posiciones de los pares fuera de política, muestrea cuatro jugadas del modelo a temperatura 1,0, las puntúa a profundidad 10 y se queda con la mejor y la peor si están a más de 100 cp. Salieron 6 386 pares:

resultado posiciones reparto
pares construidos 6 386 46,1 %
el modelo propuso una sola jugada distinta 3 743 27,1 %
las dos extremas estaban a menos de 100 cp 3 709 26,8 %

De los pares que sí salieron, solo 2 632 tenían las cuatro candidatas distintas; 1 835 se quedaron en dos. Y la diferencia que decide cómo leer todo lo que viene:

conjunto pares mediana Δcp media Δcp pares de mate
off-policy 13 838 251 2 996 29 %
on-policy 6 386 385 672 2,9 %

Son dos distribuciones de dificultad. Los pares fuera de política están dominados por mates —de ahí la media de casi 3 000 con mediana de 251—, porque una evaluación multi-PV encuentra mates que el modelo nunca iba a proponer. Los propios casi no los tienen: si hay un mate, o el modelo lo ve y sus candidatas son razonables, o no lo ve y ninguna lo es. Por eso se igualó el número de pares y se declara la proporción de mates.

DPO: el margen sube, la ordenación no siempre

Los dos entrenamientos son idénticos salvo el fichero de pares: mismo checkpoint, beta 0,1, lr 5e-6, nll_weight 0,1, una época, misma semilla.

brazo pares acierto antes acierto después margen después
off-policy (igualado) 6 386 94,05 % 92,96 % +3,00
on-policy 6 386 89,51 % 91,86 % +1,71

El brazo fuera de política triplicó el margen y empeoró la ordenación. Es lo que avisaba la lección 3: el margen es una media, y se puede separar mucho a unos pares y cruzar otros por el camino.

El punto de partida ya era distinto: la base ordena bien el 94,05 % de los pares ajenos y solo el 89,51 % de los propios, porque estos se construyen a partir de las jugadas que el modelo dudaba. Un conjunto hecho de tus propios errores es más difícil, y por eso mismo más útil.

Ninguna de estas columnas decide. El acierto sobre pares es un proxy: mide si el modelo ordena pares, no si juega mejor.

La medición que decide: seis enfrentamientos y un triángulo que no cierra

Tres modelos y tres aristas: base, DPO fuera de política y DPO dentro de política. Cada arista se jugó dos veces, 400 partidas con un modelo como A y 400 con los lados intercambiados, sobre el mismo libro y con los colores espejados.

Las dos direcciones hacían falta: las tres primeras ejecuciones las ganó quien iba como A. Al intercambiar los lados, el signo aguantó las tres veces —off gana a base por +61 siendo A y por +74 siendo B—, así que el instrumento no prefiere un lado. Lo que sí enseñó el cambio es otra cosa. Para on-policy contra off-policy, con las mismas 400 partidas y aperturas:

dirección Elo IC 95 % veredicto
on como A +48 19 a 80 separado del cero
on como B +26 −3 a 57 incluye el cero

La estimación se mueve 22 puntos, ruido normal con 400 partidas, y el veredicto pasa de «medición» a «no concluye». Un sí/no leído del borde de un intervalo es mucho menos estable que el número del que sale; publicar solo el sí/no habría sido publicar una moneda al aire. Por eso labs/m5/pooled_match.py agrupa las dos direcciones y da un intervalo sobre las 800 partidas.

// Ejercicio 01¿Cuánto se estrecha el intervalo al agrupar?

Al agrupar las dos direcciones, las 400 partidas pasan a ser 800. ¿Cuánto se estrecha el intervalo? ¿Y por qué no se estrecha a la mitad?

// SoluciónVer la solución

Se estrecha por √2: el error típico de una media va con la raíz del número de muestras. Doblar las partidas divide el intervalo por 1,41; para dividirlo por dos hacen falta cuatro veces las partidas, y por eso la tabla del lab 1 se lee antes de pagar nada.

Al agrupar también puede cambiar el veredicto, y no siempre a mejor: on contra off daba «separado» en una dirección e «incluye el cero» en la otra, y agrupado vuelve a «separado» con un intervalo 1,41 veces más estrecho. El agrupado es el número honesto de las dos ejecuciones, no el mejor de los dos.

Agrupadas las dos direcciones, incluida la arista de GRPO:

arista partidas Elo IC 95 %
DPO off-policy − base 1 600 +65 50 a 81
DPO on-policy − base 800 +57 36 a 79
GRPO − base 800 +44 23 a 66
DPO on-policy − off-policy 800 +37 15 a 59

(La primera lleva 1 600 partidas porque se jugaron 800 más para intentar cruzar el criterio; se cuenta al final.)

Las dos primeras contradicen a la cuarta. Si off está 65 por encima de la base y on 57, entonces on debería estar unos ocho por debajo de off. Medido de frente, está 37 por encima.

+65IC 50 a 81 · 1 600 partidas+57IC 36 a 79 · 800 partidas+37IC 15 a 59 · 800 partidasbasemedium-v4DPO off-policy6 386 pares de LichessDPO on-policy6 386 pares propiosla flecha de abajo debería valer −8 y vale +37: el triángulo no cierra por 45 Elo (error típico 18), a 2,6 σ
Tres aristas con las dos direcciones agrupadas: 1 600 partidas la de la izquierda, 800 las otras dos. Las dos de arriba predicen que la de abajo apunte al otro lado, y apunta a este.

El residuo de esta no transitividadNo transitividadQue A gane a B y B gane a C no obliga a que A gane a C. Pasa cuando el resultado depende del emparejamiento y no solo de una fuerza única por jugador, y en M5 se midió: las tres aristas entre la base y los dos DPO —1 600 partidas la de DPO off-policy contra la base, 800 las otras dos, siempre con las dos direcciones agrupadas— dejan un residuo de 45 Elo con un error típico de 18, o sea 2,6 σ. La consecuencia práctica: si te importa cuál de dos modelos gana, enfréntalos; no restes lo que cada uno hizo contra un tercero. —lo que las tres aristas no consiguen sumar— es de 45 Elo con un error típico de 18, o sea 2,6 σ. (El error típico sale de las semianchuras de los tres intervalos, 15,5, 21,7 y 21,7, divididas por 1,96 y sumadas en cuadratura; labs/m5/pooled_match.py lo imprime con su orientación, −45. Qué son el error típico y la σ, con una moneda, lo cuenta la estadística justa de M2.) Un solo número de fuerza por modelo supone que la fuerza es un orden total, y un emparejamiento no está obligado a respetarlo. Pasa en cualquier liga: el equipo que presiona arriba gana al que juega al toque, el del toque gana al que se encierra, el que se encierra gana al que presiona, y ninguna tabla de puntos lo explica. El modelo fuera de política juega más afilado, como dice su tasa de ilegales, y eso le va bien contra la base y mal contra un modelo más limpio.

Así que mide las dos direcciones y agrúpalas, y si te importa cuál de dos gana, enfréntalos. Las tablas de LLM construidas con votos por parejas tienen el mismo problema, y por eso conviene mirar los enfrentamientos concretos además del ranking.

El peaje: alinear casi dobló la tasa de jugadas ilegales

rukh eval match cuenta las propuestas ilegales de cada bando porque el control lo necesitaba, y salió el coste del hito, el peaje de alineamientoPeaje del alineamientoLo que se pierde al ganar. En M5, alinear con DPO dobló la tasa de propuestas ilegales del modelo: 1,3-1,5 % en la base, 2,4-2,6 % con pares propios, 2,9-3,8 % con pares de fuera, y nll_weight no lo evitó. No rompe las partidas —la jugada ilegal se rescata con un sorteo enmascarado— pero es distribución que se ha ido a otro sitio. La regla: mide el coste en la misma ejecución en la que mides el beneficio.:

modelo ilegales sobre sus propias jugadas
medium-v4 (base) 1,30 % – 1,47 %
medium-v4-dpo-onpolicy 2,42 % – 2,58 %
medium-v4-dpo-offpolicy 2,90 % – 3,80 %
medium-v4-grpo 1,92 % (base 1,16 % en la misma ejecución)

Los dos DPO llevaban nll_weight: 0.1 para anclar la política, y aun así la tasa casi se dobla. No rompe las partidas —el bucle rescata la propuesta ilegal—, pero es distribución que se ha ido a otro sitio.

La diferencia entre brazos tiene mecanismo. Los pares ajenos contienen mates que el modelo nunca iba a proponer, así que DPO empuja probabilidad hacia tokens donde la política casi no tenía masa, y eso deforma más. Los pares propios solo la mueven entre jugadas que el modelo ya consideraba. GRPO paga todavía menos, 1,66 veces su base, y no por su puerta de legalidad (que en esta configuración ni se dispara): su gradiente solo mueve masa entre jugadas que ya eran legales. La ejecución que le pedía a GRPO devolver el peaje, grpo-legality.yaml, se quedó sin lanzar (lección 4), así que no hay fila que la mida.

Recuerda además que, como explica la lección 5, un modelo que propone más ilegales recibe más segundos sorteos; --mask es el control que quita ese rescate a los dos lados.

La suite completa: lo que se gana y lo que se paga, en las mismas filas

El enfrentamiento directo dice que los modelos alineados juegan mejor. La suite canónica, la misma desde M2, dice en qué.

etapa legalidad top-1 top-3 puzles 1000-1500 1500-2000 2000+ Elo escalera
medium-v4 (base) 99,8 % 54,4 % 82,2 % 57,9 % 38,0 % 16,6 % 1504 (1446-1558)
+ DPO on-policy 99,2 % 52,3 % 79,9 % 59,0 % 40,3 % 17,8 % 1560 (1500-1617)
+ GRPO 99,3 % 53,3 % 80,3 % 58,9 % 39,1 % 17,8 % 1572 (1512-1640)

La legalidad y el top-1 bajan, de 99,8 % a 99,2-99,3 % y de 54,4 % a 52,3-53,3 %. El top-1 mide cuántas veces el modelo elige la jugada que eligió el humano, y a estos modelos se les ha pedido que prefieran la que el motor puntúa mejor. Que la métrica de imitación baje al alinear es la señal de que el alineamiento hizo su trabajo; un asistente alineado también se aleja del texto con el que se preentrenó.

Los puzles suben en las seis comparaciones, entre uno y dos puntos y medio, y es lo que M4 no consiguió mover. Pero ninguna banda lo establece por separado —las diferencias están entre 0,6 y 1,5 sigmas— y los dos modelos no son independientes, así que el «seis de seis» vale menos de lo que parece. Lo que se puede decir es que suben más que los afinados de M4 y siempre en la misma dirección.

El Elo de la escalera sube de 1504 a 1560 y 1572, con los intervalos solapándose como siempre. La escalera coincide en dirección con el enfrentamiento y sigue sin poder afirmarlo. Una mejora que se ve en tres instrumentos débiles y en uno fuerte se afirma con el fuerte; apoyarse en la coincidencia de los débiles es contar el mismo ruido tres veces.

La galería de reward hacking

labs/m5/reward_hacking.py rompe la recompensa del proyecto de cinco maneras que parecen razonables —cada una es la sana con un solo término cambiado— y mide las seis sobre el mismo grupo de candidatas. El código está en la lección 9; aquí va lo que midió.

La primera versión preguntaba qué jugada corona cada recompensa, esperando que las rotas coronaran otra. Las seis coronaron la misma en las tres posiciones: todas son monótonas en la evaluación del motor, así que el máximo no se puede mover. La cima de la ordenación no es donde vive el hackeo. Cuando un experimento contesta «no hay efecto», sospecha primero de la pregunta.

Lo que el optimizador consume es (r − media) / desviación sobre el grupo. La galería lo resume en tres columnas: la cabeza, la ventaja que separa a la mejor candidata de la segunda; el peor, la parte de la masa de ventaja que se lleva la única candidata catastrófica; y las inversiones de orden respecto a la recompensa sana. Las dos primeras están en la figura:

recompensa sana+1.27g1e20+1.02c2c3−44+0.14b2b4−355+0.14f3g4−943-1.28a1d1ilegal-1.28b1d1ilegalcorona g1e2 · cabeza 0,250la peor se lleva el 25,0 % de la masasin suelo en la calidad+0.99g1e20+0.85c2c3−44-0.15b2b4−355-2.05f3g4−943+0.18a1d1ilegal+0.18b1d1ilegalcorona g1e2 · cabeza 0,142la peor se lleva el 46,5 % de la masabarras: ventaja (r − media) / desviación · bajo cada jugada, cp por debajo de la mejor del grupo (g1e2, −23 cp)a trazos, las dos jugadas que no se pueden jugar: a la derecha puntúan por encima de una legal a 355 cp de la mejor
Misma corona, misma ordenación arriba. Quitarle el suelo al término de calidad no cambia qué jugada gana: cambia que una jugada imposible pase a valer más que una legal mala, y la cabeza —la ventaja entre la mejor y la segunda— se encoge de 0,250 a 0,142.

Con la recompensa sana, las dos candidatas ilegales quedan abajo del todo en −1,28, y la peor se lleva el 25 % de la masa de ventaja. Quitándole el suelo al término de calidad —una sola línea—, las dos ilegales suben a +0,18, por encima de una jugada legal a 355 cp del óptimo que saca −0,15. La puerta sigue devolviendo el mismo número; lo que cambió es el rango de lo que hay debajo. Es el fallo de la puerta en cero de la lección 4, llegando por otro lado.

La figura enseña también el precio del tope: en la columna sana, b2b4 y f3g4 sacan las dos +0,14, porque un error de 355 cp y otro de 943 cp se recortan los dos a calidad cero.

El último bloque de la galería no se ve mirando ordenaciones. La misma jugada —Kf6 en un rey y torre contra rey—, el mismo tablero, cuatro profundidades de búsqueda:

recompensa prof. 4 prof. 6 prof. 10 prof. 14 rango
(el motor dice) 597 9 996 9 998 9 998 —
sana 0,000 0,980 0,990 0,990 0,990
sin suelo −47,015 −0,020 −0,010 −0,010 47,005
legalidad como bonus 2,000 2,980 2,990 2,990 0,990
mate por marcador 0,000 3,479 3,489 3,489 3,489
sin penalizar repetir 0,000 0,980 0,990 0,990 0,990
reescalada sola 0,009 1,000 1,000 0,667 0,991

La jugada no cambia: a profundidad 6 el motor encuentra el mate. Y entonces ninguna recompensa es estable, ni la sana, que se mueve 0,990, todo su intervalo legal. La que no tiene suelo se mueve 47,0. Solo el bono de mate plano se queda quieto, porque le pregunta al tablero y no al motor. Y la reescalada sola pasa de 1,000 a 0,667 entre profundidad 10 y 14 sin que el motor se mueva: cambió el grupo, que es lo único que esa recompensa mira.

Así que fija la profundidad, escríbela en el run y no compares ejecuciones con profundidades distintas. Con un juez LLM pasa lo mismo con su versión, su prompt y su temperatura.

GRPO: sube, y la mejora tiene forma de U invertida

La lección 4 cuenta el fallo que hubo que arreglar antes de leer nada: la recompensa de entrenamiento sube cuando el modelo colapsa. No era teórico. Tres ejecuciones de 400 pasos desde el mismo checkpoint, cambiando solo la tasa de aprendizaje. En las tablas de esta sección, Δ es lo que subió la recompensa media entre la medición de antes y la de después (después menos antes), no la recompensa: en la salida de la lección 4, +0.8250 -> +0.8529 es el +0,0279 de la última.

tasa de aprendizaje Δ recompensa (grupo) KL contra el inicio grupos planos
1e-6 +0,0020 0,0005 1 276 / 3 200 · 40 %
5e-6 +0,0206 0,0309 1 483 / 3 200 · 46 %
2e-5 +0,0268 0,1076 1 696 / 3 200 · 53 %

La recompensa sube, y la proporción de grupos planos sube con ella. Es el hackeo de la galería ocurriendo de verdad, con la recompensa sana y el bucle correcto. Para verlo bastó con poner en la misma tabla lo que la política podía estar moviendo en lugar de jugar mejor: su propia diversidad.

Con la recompensa medida contra el mejor movimiento disponible, las mismas tres ejecuciones sobre 300 posiciones que no se entrenaron (el barrido subió val_positions de los 200 de grpo.yaml a 300):

lr Δ recompensa (referencia del grupo) Δ recompensa (referencia del motor) grupos planos en validación
1e-6 −0,0032 +0,0088 0,387 → 0,370
5e-6 +0,0154 +0,0267 0,387 → 0,453
2e-5 +0,0155 +0,0078 0,387 → 0,490
0,830,850,87recompensa contra el motor0,350,430,51grupos planosantes de entrenar: 0,83250,84130,370lr 1e-60,85920,453lr 5e-60,84020,490lr 2e-5línea continua · recompensa contra el motor (eje izquierdo): se dobla y caelínea a trazos · grupos planos (eje derecho): sube en las tres; antes de entrenar, 0,387
La recompensa que no se puede falsear sube, se dobla y baja. El indicador de colapso sube en las tres. La forma de la curva es lo que distingue mejorar de sobreoptimizar.

GRPO funciona: la recompensa contra el mejor movimiento disponible sube en las tres tasas. A 1e-6 las dos recompensas discrepan en el signo; con la métrica original, la mejor ejecución de las tres se habría archivado como fracasada.

Y la ganancia no es monótona. Sube hasta 5e-6 y vuelve a caer a 2e-5, mientras el colapso sube en las tres. Es la U invertida de la sobreoptimización: la política compra recompensa con determinismo, y pasado un punto la compra deja de salir a cuenta. Como regar una planta: más agua la hace crecer hasta que la ahoga. Al alinear LLM con un reward model se mide la misma curva: optimizarlo más allá de un punto sube su nota y empeora la respuesta que una persona habría elegido.

Al alargar las ejecuciones a 1 500 pasos, la tasa pequeña dejó de ser la excepción:

lr Δ recompensa (motor) grupos planos KL
1e-6 +0,0279 0,385 → 0,472 0,122
5e-6 +0,0467 0,385 → 0,560 0,555

Las dos mejoran bastante más, y el colapso sube en las dos. Lo que a 400 pasos parecía «una tasa que mejora sin peaje» era una tasa que aún no había llegado al peaje. Hay una curva, y dónde pararla se decide con el enfrentamiento directo, no con la recompensa.

ejecución Elo sobre la base (800 partidas) ilegales propios grupos planos KL
lr 1e-6 +44 (IC 23 a 66) 1,92 % · 1,66× la base 0,472 0,122
lr 5e-6 +68 (IC 46 a 90) 3,12 % · 2,08× la base 0,560 0,555

Enfrentadas entre sí:

medium-v4-grpo-fast vs medium-v4-grpo 400 partidas +7 Elo incluye el cero
medium-v4-grpo vs medium-v4-grpo-fast 400 partidas +9 Elo incluye el cero
agrupado, 800 partidas
score 0,49875 elo -0,87 IC -22,2 a +20,4

Las dos direcciones dan el mismo veredicto, y las dos a favor de quien va como A: la firma del ruido simétrico. Agrupadas, empate. Los veinticuatro puntos no estaban ahí.

Con esta arista el proyecto tiene dos triángulos completos, y no dicen lo mismo (residuos con el signo de labs/m5/pooled_match.py):

triángulo residuo veredicto
base / DPO-off / DPO-on −45 Elo 2,6 σ · no cierra
base / GRPO / GRPO-rápido +25 Elo 1,3 σ · consistente

Los dos residuos son grandes y solo uno está establecido: medido en un triángulo, sugerido en el otro. Con dos casos no hay ley general sobre el Elo.

Se publica la de 1e-6: mismo Elo que la rápida y menos de todo lo demás, menos colapso (0,472 contra 0,560), menos KL (0,122 contra 0,555) y menos ilegales (1,66× la base contra 2,08×). Cuando dos modelos empatan en lo que se busca, gana el que cuesta menos en lo que no.

Los criterios, uno por uno

El plan escribió los criterios antes de medir nada, que es cuando hay que escribirlos, y por eso a veces no encajan con lo que se descubre. Aquí van con sus dos lecturas donde las hay.

Criterio 1 · «DPO o GRPO ≥ +50 Elo con intervalo sobre su base»

Cumplido en la estimación puntual, no en el extremo del intervalo.

comparación partidas Elo IC 95 % ¿separado del cero?
DPO off-policy − base 1 600 +65,25 49,74 a 80,76 sí
DPO on-policy − base 800 +57 36 a 79 sí
GRPO − base 800 +44 23 a 66 sí

Los tres intervalos se separan del cero: hay una mejora medida. Pero «al menos +50» con el intervalo respaldándolo pide que el extremo inferior pase de 50.

Con 800 partidas, el brazo fuera de política daba el extremo inferior en 45, así que se jugaron 800 más, con otra semilla de libro y en las dos direcciones. Con las 1 600 quedó en 49,74. Harían falta unas 56 partidas más, media hora, y no se juegan: el presupuesto se fijó en 1 600 antes de jugarlas, y jugar hasta que el número cruce el umbral es ajustar el experimento al criterio. En un ensayo clínico el número de pacientes se fija antes de tratar al primero, porque «seguimos reclutando hasta que salga significativo» acaba haciendo significativo cualquier fármaco.

M4 dejó este criterio incumplido; lo que cambió aquí fue, sobre todo, el instrumento.

Criterio 2 · «Reward model ≥ 75 % en pares no vistos»

Rozado, no cruzado de forma estable. Una de cinco ejecuciones lo cruza (75,19 %), pero dos ejecuciones idénticas se separan 1,3 puntos: el criterio está por debajo del ruido del instrumento que lo mide. Sobre los pares que una evaluación estática puede decidir, el acierto es 77,30 %, una cifra honesta que contesta otra pregunta. Lo más útil fue lo que no estaba previsto: que el encoder de M3 resta, que la capacidad manda y que la correlación cambia de signo sin la banda de mate.

Criterio 3 · «rukh-rm, -dpo y -grpo en el Hub con card»

Cumplido, con una desviación de nombre: el plan escribió rukh-small-dpo y -small-grpo, y se publican sobre medium-v4, como en M4, porque small ya no es la base de nada que la demo sirva.

Qué has aprendido

Alinear funcionó: DPO con las dos fuentes de pares y GRPO baten a su base con el intervalo separado del cero, y el precio —más jugadas ilegales, menos imitación— está medido en las mismas filas. El reward model acierta tres de cada cuatro y falla donde un evaluador estático tiene que fallar. Y casi todo lo que costó entender fue de medida: un veredicto que se da la vuelta al cambiar los lados, un triángulo que no cierra, una recompensa que sube colapsando y una decisión que se tomó mal restando.

La lección 9 son los once labs que produjeron todo esto, en el orden en que se hicieron.