La base no se busca: se importa
Abro un proyecto nuevo y lo publico sin resultados. No es descuido: lo único que hoy se puede juzgar de residual-gauge es el método, y el método es justamente lo que quiero que alguien mire antes de que yo me enamore de un número.
El problema de siempre, por el otro lado
Las coordenadas del residual stream son un accidente del entrenamiento. No hay ninguna razón arquitectónica para que la dimensión 1,472 signifique algo, y la superposición explica por qué mirar de a una casi nunca sirve. De ahí sale casi toda la agenda del campo: buscar la base buena. Los SAEs son eso — aprender un diccionario de direcciones interpretables.
Esta línea prueba lo contrario. En vez de buscar la base, importarla de una simetría que la tarea ya tiene.
La simetría, en concreto
La tarea es sintética y chica. Tres entidades acomodadas en dos líneas independientes, una horizontal y una vertical; cuatro hechos fijan las dos cadenas; la pregunta pide un extremo de una de las dos:
n0 left_of n1 . n1 left_of n2 . n2 above n0 . n0 above n1 ? leftmost -> n0
n1 left_of n2 . n2 left_of n0 . n0 above n1 . n1 above n2 ? leftmost -> n1
La segunda línea es la primera con los nombres renombrados en ciclo. El problema abstracto es idéntico y la respuesta se mueve exactamente con el renombre. Esa es la simetría: el grupo de las seis permutaciones de tres cosas actuando sobre la tarea.
La pregunta es si el modelo hace lo mismo por dentro. Si renombrar afuera equivale a multiplicar por una matriz el estado interno, entonces la matriz existe, se puede medir y — lo que importa — se puede aplicar a mano en medio del forward para ver si la respuesta se mueve como debe.
El test de falsabilidad que sale gratis
Acá aparece lo que me convenció de meterme. Ajustar una matriz de d×d contra datos apareados siempre ajusta algo: no probás nada mostrando que el ajuste da bien. Pero la afirmación no es "hay una matriz", es "las matrices forman una representación del grupo". Y toda representación de un grupo finito se descompone en piezas irreducibles con multiplicidades enteras, recuperables solo de trazas.
Enteras. Si dan 2.7, la afirmación se cayó y no hay nada que discutir, ni umbral que elegir después de ver los datos. Casi ningún método de interpretabilidad tiene un chequeo así. Y de paso, los bloques de la descomposición salen canónicamente de la teoría en vez de postularse a mano.
Por qué lo preregistré
El proyecto anterior me enseñó la lección por las malas: arrancó como una réplica que no replicó, y lo que la mató fueron los controles pareados. Cuando ya sabés que tu propio entusiasmo es el enemigo, la defensa es fijar los números antes.
Así que PREREGISTRATION.md tiene los umbrales escritos antes de que corriera un solo modelo, y
las enmiendas se agregan al final con fecha y motivo, nunca editando lo anterior. Arriba de eso
hay un gate bloqueante: los tests plantan una representación conocida — y a propósito no
ortogonal — dentro de activaciones sintéticas, y exigen recuperarla exacta, más tres controles
negativos. Hasta que eso no pasó, no corrí ningún modelo.
Sirvió, y de una manera que no esperaba. La primera versión de la tarea sorteaba tres nombres distintos por ejemplo, y eso deja el operador mal definido: cada mundo pide una permutación distinta de las mismas filas del embedding, y ninguna matriz única puede hacerlas todas. El síntoma fue un error de 0.98 en un punto donde el estado es literalmente la suma del embedding de token y el de posición — o sea, donde una matriz exacta provablemente existe. Con el trío de nombres fijo, el mismo modelo y el mismo pipeline dan 0.0000 ahí. Sin esa aserción de diagnóstico me llevaba a casa un "no hay equivarianza lineal" que era puro artefacto.
Lo que no hay
- Las mediciones principales no están corridas. Multiplicidades, validez de los proyectores, órbitas held-out: nada de eso tiene número todavía.
- La novedad está sin verificar. Antes de cualquier write-up hay una revisión de literatura como gate: descomposición isotípica aplicada a activaciones de modelos de lenguaje es una idea demasiado natural como para que nadie la haya tenido.
- El salto a un modelo real (Pythia-70M) trae su propia complicación: ahí la acción del grupo es solo aproximada, porque las frecuencias de los nombres difieren y el centrado de LayerNorm vuelve gauge pura la dirección de unos.
- Es un transformer de juguete de 3.2M de parámetros. Nada de lo que salga se transfiere solo.
El cuaderno de laboratorio va en docs/findings.md,
en orden cronológico y sin maquillar, con los tres bugs de medición que encontré construyéndolo.
Si esto te interesa o ves un agujero, escribime.