Cómo empezó
Una regla puede servir para muchos hechos
Quiero averiguar hasta dónde se puede llevar un modelo abierto pequeño hacia el nivel de los modelos de frontera editando sus pesos directamente e injertándole piezas nuevas, sin un entrenamiento pesado. Lo habitual es entrenar. Pasas miles de millones de preguntas y respuestas por un modelo y el descenso de gradiente da con las reglas por su cuenta. Pero también podemos abrir un modelo, leer lo que contiene a mitad de un problema y cambiarlo. Entonces, ¿se pueden escribir algunas de esas reglas a mano?
Mi hipótesis de trabajo es que buena parte del razonamiento funciona con conjuntos de reglas, donde una regla sirve para muchos hechos. El «me llevo una» de las sumas es el caso más sencillo. Nadie memoriza todas las sumas, porque una sola regla de acarreo las cubre todas, en cada posición de dígito. En mis notas lo escribí así:
Quizá la regla de un hecho coincidiría con la regla de otro.
A un modelo pequeño le sale caro almacenar hechos, y las reglas son baratas. El primer circuito de multiplicación de este informe está hecho para todos los problemas desde 2 × 10 hasta 9 × 99, y tiene 25,270 pesos.
Las mismas conversaciones sacaron a la luz una segunda idea que va de la mano de la primera: un conjunto de reglas de aprendizaje para asimilar algo nuevo, junto a reglas lógicas para aplicar lo que ya sabes. Este informe trata de la parte lógica.
Lo que el modelo ya tiene
Los dígitos están ahí dentro
Antes de construir nada, miramos qué contiene SmolLM2 en el momento en que empieza a escribir una respuesta. Una lectura lineal de su estado oculto en la posición de la respuesta, ajustada por mínimos cuadrados, extrae los dígitos de ambos números casi a la perfección. Para la suma de tres dígitos no bastaba con una capa, pero uniendo las capas 14, 20 y 21 se lee cada dígito con un 99% de acierto en problemas nuevos.
Suma de tres dígitos. Proporción de problemas nuevos en los que una lectura lineal acierta los seis dígitos de los dos números, leyendo una capa cada vez y después las capas 14, 20 y 21 unidas. Cada lectura se ajusta con 1,500 problemas.
76.6% Mejor capa individual, la capa 21
11.8% Última capa, la capa 29
97.9% Capas 14, 20 y 21 unidas, y 99.2% cuando esa lectura se ajusta con 3,000 problemas
Las 30 capas en una tabla
| Capa | Los seis dígitos correctos |
|---|---|
| 0 | 0.0% |
| 1 | 4.3% |
| 2 | 26.0% |
| 3 | 50.1% |
| 4 | 52.2% |
| 5 | 47.1% |
| 6 | 31.4% |
| 7 | 20.4% |
| 8 | 18.8% |
| 9 | 18.2% |
| 10 | 27.1% |
| 11 | 27.9% |
| 12 | 39.1% |
| 13 | 47.2% |
| 14 | 74.8% |
| 15 | 70.1% |
| 16 | 64.0% |
| 17 | 63.0% |
| 18 | 64.2% |
| 19 | 63.5% |
| 20 | 72.9% |
| 21 | 76.6% |
| 22 | 71.5% |
| 23 | 62.9% |
| 24 | 48.8% |
| 25 | 30.5% |
| 26 | 19.0% |
| 27 | 13.9% |
| 28 | 11.7% |
| 29 | 11.8% |
Así que el modelo ha leído la pregunta. Lo que no consigue hacer de forma fiable es combinar los dígitos: el acarreo, el préstamo, las tablas de multiplicar. Ese paso de combinación es la parte que ponemos nosotros.
Cómo funciona un injerto
Cuatro piezas, ninguna entrenada por descenso de gradiente
- LecturaUna lectura lineal para cada dígito de los dos números, tomada del propio estado oculto del modelo.
- ReglasUna pequeña tabla de consulta para cada dígito de la respuesta. El dígito de las unidades sale de los dos dígitos de las unidades; el de las decenas sale de los dígitos de las decenas más el acarreo, y así hacia arriba.
- EscrituraUn empujón hacia el token del dígito correcto en la última capa del modelo. El modelo sigue escribiendo su propia respuesta. El injerto solo inclina la balanza sobre qué dígito viene después.
- InterruptoresDos interruptores ajustados deciden cuándo está encendido el injerto. Se ajustan para que se activen solo mientras el modelo escribe la respuesta a este tipo de problema, y para que se queden apagados con otras matemáticas, problemas con enunciado, código y texto normal.
Las lecturas y los interruptores se ajustan por mínimos cuadrados con solución cerrada, y las tablas de reglas las escribe un programa (a mano, en el primer injerto de multiplicación). El archivo del modelo base no se toca nunca. Cada injerto se añade a su lado.
Cómo fue creciendo
De un injerto a un flujo de trabajo
- Injerto de neuronasEl primer intento añadió 24 neuronas nuevas a la última capa para aportar el acarreo en la suma de dos dígitos. Aguantó en problemas sellados, +19.7 puntos. Funcionaba retocando la propia aritmética del modelo, así que el siguiente paso fue hacer la aritmética directamente.
- Circuito cableado a manoPara la multiplicación escribimos las tablas de reglas a mano y les pasamos las lecturas de dígitos del propio modelo. La primera versión sacó un 83.5% en problemas reservados y sellados, frente al 21.3% de partida. Una segunda versión con mejores interruptores sacó un 83.1%, y su peor cambio en otras matemáticas fue de −0.75 puntos.
- Reglas encontradas por un programaUn programa buscador de reglas recibió 340 problemas resueltos, en forma de dígitos y respuestas. Para cada dígito de la respuesta, buscó el conjunto de entradas más pequeño que lo determina. Encontró por su cuenta el acarreo de la suma, el préstamo de la resta y la cadena de acarreos de la multiplicación. También encontró que el dígito de las decenas es la regla de las unidades reutilizada sobre los dígitos de las decenas, más un paso de acarreo: una regla que sirve para varios dígitos, que es la idea de la que partió todo esto. Su circuito de multiplicación sacó un 82.7% en problemas reservados, a menos de medio punto del cableado a mano.
- El mismo flujo, habilidades nuevasLa resta y la suma de dos dígitos pasaron por el mismo script, con la configuración copiada de la multiplicación y sin afinar nada. La suma de tres dígitos necesitó tres arreglos, cada uno probado antes de abrir su conjunto reservado: la lectura unida a partir de tres capas, un segundo interruptor y una fuerza de empujón fijada para cada posición de dígito.
Por qué funcionó
Por qué el programa pudo encontrar las reglas
Las reglas no salieron del modelo. Las encontró un programa aparte, fuera del modelo, a partir de 340 ejemplos resueltos. Lo que aporta el modelo son los números, que el injerto lee de su estado oculto. Cuatro cosas lo hicieron posible.
- Partir los problemas en dígitosComo números enteros, 7 × 48 = 336 es un dato más entre 720 problemas posibles. Partido en dígitos, aparece un patrón: el último dígito de la respuesta depende solo del 7 y del 8. Fue la decisión más importante que tomamos, y encaja con SmolLM2, que guarda cada dígito como su propio token.
- Pedir la explicación más simplePara cada dígito de la respuesta, el programa busca el conjunto más pequeño de dígitos de entrada que siempre lo decide, y solo se queda con una regla si se cumple en todos los ejemplos. Una regla basada en dos dígitos tiene unas 100 entradas posibles, y 340 ejemplos llenan casi todas, así que funciona en problemas nuevos que repiten los mismos pares. Memorizar supondría basarse en todos los dígitos de entrada, con muchas más combinaciones de las que 340 ejemplos pueden cubrir.
- Reutilizar lo que ya encontróPara el siguiente dígito, vuelve a probar la regla de las unidades y comprueba si una señal extra explica lo que sobra. Esa señal resultó ser el acarreo. Nadie le dio la palabra al programa; encontró la variable porque los datos necesitaban una. Repetir el paso para el dígito de las centenas da la cadena de acarreo.
- Comprobar con problemas nuevosLas reglas se probaron en problemas que no habían visto y luego se compilaron en tablas de consulta dentro del injerto.
El entrenamiento por gradiente no tiende por sí solo a la explicación más simple, y con pocos ejemplos memorizó. En multiplicación, el injerto por gradiente del mismo tamaño sacó un 72.7% en sus propios problemas de entrenamiento y un 25.1% en los 140 problemas de desarrollo. El circuito sacó un 94.7% en los problemas con los que se construyó y un 88.7% en esos mismos problemas de desarrollo.
Nosotros fijamos la división en dígitos, y el programa encuentra reglas dentro de ella. El siguiente paso hacia habilidades más allá de la aritmética es un programa que también encuentre la forma correcta de descomponer un problema.
Resultados
Cinco habilidades, medidas en problemas que nadie usó para afinar
Los problemas reservados de cada habilidad se apartaron antes de construir nada, y no se afinó nada con ellos. Cada puntuación sale de dos semillas y cuatro ejecuciones por problema, con la misma configuración de muestreo para el modelo solo y con el injerto. El conjunto de multiplicación se abrió una vez para la primera versión cableada a mano y otra vez más para las dos finales.
Proporción de problemas con la respuesta exactamente correcta. 140 problemas en multiplicación, 500 en el resto.
- SmolLM2 solo
- Con el injerto
- Mismo injerto, cableado mezclado
| Habilidad | Problemas | SmolLM2 solo | Con el injerto | Mejora, puntos (cota inferior del 95%) | Cableado mezclado | Pesos añadidos |
|---|---|---|---|---|---|---|
| Multiplicación, reglas cableadas a mano7 × 48 | 140 | 21.3% | 83.1% | +61.8 (+56.1) | 2.4% | 25,2700.019% |
| Multiplicación, reglas encontradas por un programa7 × 48 | 140 | 21.3% | 82.7% | +61.3 (+55.5) | 6.3% | 32,5190.024% |
| Resta, dos dígitos83 − 27 | 500 | 11.3% | 68.3% | +57.1 (+54.0) | 7.8% | 32,4460.024% |
| Suma, dos dígitos38 + 47 | 500 | 49.7% | 86.5% | +36.8 (+33.8) | 16.7% | 32,4760.024% |
| Suma, tres dígitos347 + 285 | 500 | 26.1% | 83.7% | +57.6 (+54.6) | 21.4% | 121,1980.090% |
- No cambió ningún peso original y no hubo entrenamiento por gradiente. Cada injerto añade entre 25,270 y 121,198 pesos, entre el 0.019% y el 0.090% del modelo. El límite que nos pusimos fue el 0.1%.
- El control con cableado mezclado es el mismo injerto con las conexiones barajadas. En todas las habilidades sacó lo mismo o menos que el modelo solo, entre el 2.4% y el 21.4%, así que los pesos extra no hacen nada sin las reglas correctas.
- Los tres injertos de dos dígitos (multiplicación, resta y suma) también funcionan juntos en un mismo modelo, con 92,496 pesos en total. Cada uno mantuvo su mejora en los problemas de desarrollo. El peor cambio en otras matemáticas fue de −0.25 puntos, y 200 de 200 prompts no relacionados dieron la misma respuesta que antes.
Las mejoras se emparejan por problema, con una cota inferior bootstrap unilateral del 95%. La comprobación de efectos secundarios abarca otros ocho conjuntos de aritmética y de problemas con enunciado, además de GSM8K y código. Los prompts no relacionados son 200 prompts de IFEval, respondidos con decodificación voraz. Las reglas y las predicciones de cada ejecución se dejaron por escrito antes de conocer su resultado.
Frente al entrenamiento por gradiente
Tres enfrentamientos directos
El entrenamiento por gradiente es la forma estándar de añadir una habilidad, así que lo usamos como rival. Cada injerto por gradiente se afinó probando una cuadrícula de configuraciones antes de su prueba.
140 problemas, 2 semillas, 4 ejecuciones en cada caso. El primer circuito cableado a mano frente a dos injertos entrenados por gradiente y afinados.
El circuito les sacó 57.9 y 59.8 puntos de ventaja.
140 problemas de desarrollo, 2 semillas, 4 ejecuciones en cada caso. LoRA usó la mejor configuración de una búsqueda en cuadrícula.
49.3 puntos por delante, con una cota inferior del 95% de +42.8, usando menos de una cuarta parte de los pesos.
500 problemas de desarrollo, 2 semillas, 4 ejecuciones en cada caso. La configuración del circuito se copió de la multiplicación, sin afinar.
Empate con un injerto por gradiente cuatro veces más grande, y unos 17 puntos por delante del de 14 neuronas.
Las reglas de resta del circuito salieron de 340 problemas. Los injertos por gradiente se entrenaron con 1,500, los mismos 1,500 con los que se ajustaron las lecturas de dígitos del circuito.
Todavía en curso
Trasplantes desde modelos más grandes
También estamos intentando pasar habilidades desde modelos más grandes. Qwen3.5-4B acertó 300 de 300 de estos problemas de multiplicación en nuestra comprobación, así que intentamos traducir un conjunto de sus neuronas a SmolLM2. Por otro lado, mapeamos una señal de corrección de Qwen3.5-4B a Qwen3.5-0.8B en problemas con enunciado de primaria. Ninguna de las dos cosas ha funcionado todavía, y las dos siguen abiertas. Por ahora, el modelo grande ha sido más útil como guía de dónde falla el pequeño.
Qué es un injerto
Una calculadora alimentada por la propia lectura del modelo
La aritmética la hace el propio injerto, a partir de números que el modelo ya contiene. SmolLM2 no aprende a multiplicar. El injerto funciona con la forma simple de la pregunta («¿Cuánto es 347 + 285?»), y los interruptores lo mantienen apagado a propósito en los problemas con enunciado. Por ahora, todo esto es en un solo modelo.
El método sirve para habilidades nuevas. Un programa encuentra las reglas a partir de 340 ejemplos, se compilan en tablas y se colocan con la misma configuración en cada habilidad. Lo siguiente es la parte del aprendizaje: conseguir que SmolLM2 use un hecho que se le da en el prompt.