volver al blog

Destilación de modelos: cómo un modelo pequeño aprende del grande

llmdestilacióncostes

El problema que nadie quiere admitir

Tienes una tarea acotada en producción: clasificar tickets, extraer campos de un albarán, decidir si una consulta necesita búsqueda. Un modelo frontera la resuelve casi perfecta. También te cuesta 40 veces más y añade medio segundo a cada petición.

Pruebas el modelo pequeño. Falla lo justo para no poder confiar en él.

La reacción habitual es resignarse y pagar. La alternativa es enseñarle al modelo pequeño a comportarse como el grande en esa tarea concreta. Eso es la destilación: no comprimir el modelo, sino transferir comportamiento.

Qué se transfiere exactamente

La intuición original es de 2015 y sigue siendo la buena: cuando un modelo predice, no devuelve una respuesta, devuelve una distribución de probabilidad sobre todas las opciones. Esa distribución contiene mucha más información que la respuesta ganadora.

Si el profesor clasifica una imagen como “gato” con 0,92 y le da 0,07 a “lince” y 0,00001 a “camión”, está diciendo algo que la etiqueta gato jamás dice: que los linces se parecen a los gatos y los camiones no. A esa señal secundaria se la llamó dark knowledge, y es lo que hace que un alumno destilado supere a ese mismo alumno entrenado solo con etiquetas.

En un LLM el principio es idéntico, con la distribución calculada sobre el vocabulario en cada posición de la secuencia.

La pérdida, en código

La implementación clásica pondera dos objetivos: imitar al profesor y acertar la etiqueta real.

import torch.nn.functional as F

def perdida_destilacion(logits_alumno, logits_profesor, etiquetas, T=2.0, alfa=0.7):
    # 1. Suavizamos ambas distribuciones con la temperatura T.
    #    T > 1 aplana el softmax y hace visibles las opciones poco probables,
    #    que es justo donde vive la información interesante del profesor.
    p_profesor = F.softmax(logits_profesor / T, dim=-1)
    log_p_alumno = F.log_softmax(logits_alumno / T, dim=-1)

    # 2. Divergencia KL entre las dos distribuciones suavizadas.
    #    El factor T**2 compensa que dividir los logits por T reduce
    #    los gradientes en 1/T**2. Sin él, alfa deja de significar nada.
    kd = F.kl_div(log_p_alumno, p_profesor, reduction="batchmean") * (T ** 2)

    # 3. Pérdida supervisada de toda la vida contra la etiqueta real.
    ce = F.cross_entropy(logits_alumno, etiquetas)

    # alfa decide cuánto pesa imitar al profesor frente a acertar la etiqueta.
    return alfa * kd + (1 - alfa) * ce

Dos detalles que se pasan por alto y cuestan tardes enteras. El primero: el T**2 no es cosmética, sin él la mezcla de pérdidas queda descompensada al cambiar la temperatura. El segundo: la temperatura se aplica en entrenamiento, no en inferencia; el alumno se sirve luego con su temperatura normal.

La versión que de verdad vas a usar

Todo lo anterior asume que puedes leer los logits del profesor. Con un modelo propio o de pesos abiertos, sí. Con una API cerrada, no.

Ahí entra la destilación por secuencias: el profesor genera respuestas, y esas respuestas se convierten en el conjunto de entrenamiento del alumno. Pierdes la distribución completa, ganas que funcione con cualquier proveedor. Es lo que hace el 90 % de los equipos que dicen “hemos destilado un modelo”.

Por logitsPor secuenciasFine-tuning con datos humanos
Qué necesitas del profesorDistribución completa por tokenSolo el texto generadoNada
Sirve con APIs cerradasNo
Señal por ejemploMáximaMediaBaja pero fiable
Coste de preparar datosAlto (inferencia sobre todo el corpus)MedioMuy alto (anotación)
Riesgo principalVocabularios incompatiblesHereda los errores del profesorVolumen insuficiente

El cuello de botella de la destilación por secuencias no es el entrenamiento: es el conjunto de prompts. Si generas las respuestas del profesor sobre entradas sintéticas bonitas, el alumno aprenderá a resolver entradas bonitas y se romperá con el primer PDF escaneado torcido que le llegue. Los prompts tienen que venir de tu tráfico real, con su ruido, sus faltas de ortografía y sus casos raros.

Y filtra. Una destilación honesta descarta las respuestas del profesor que no pasan una verificación: JSON que no parsea, campos inventados, respuestas que contradicen la fuente. Sin ese filtro estás enseñando errores con la misma energía con la que enseñas aciertos.

Dónde se rompe

El techo del alumno es real. La destilación transfiere comportamiento, no capacidad. Un modelo de 3B puede igualar al profesor en extracción de campos y seguirá sin poder razonar en varios pasos sobre un contrato de 60 páginas. Si tu tarea necesita capacidad, destilar no te la va a regalar.

Heredas los sesgos y las alucinaciones del profesor, ahora sin la parte del profesor que sabía dudar. Un alumno destilado suele sonar más seguro que el modelo del que aprendió, lo cual es exactamente el fallo más caro de detectar.

La distribución se mueve. El conjunto destilado retrata tu tráfico de un mes concreto. Cambia el formato de los documentos de un proveedor y el alumno degrada en silencio, sin errores ni excepciones. Necesitas evaluación continua sobre tráfico reciente, no solo un test fijo del día del entrenamiento.

Los términos de uso importan. Buena parte de los proveedores prohíbe usar sus salidas para entrenar modelos que compitan con ellos. Léelos antes de montar el pipeline, no después de tener el modelo desplegado.

Cuándo compensa

La destilación tiene un coste fijo alto: generar datos, entrenar, evaluar, montar el servicio de inferencia. Solo sale a cuenta si se amortiza. Tres condiciones que deberían darse las tres, no una:

  1. Volumen sostenido. Miles de peticiones diarias de la misma tarea. Con cien al día, el ahorro no paga el trabajo.
  2. Tarea estrecha y estable. Un verbo, un formato de salida. Cuanto más abierta sea la tarea, peor el resultado.
  3. Un criterio de acierto medible. Si no sabes puntuar automáticamente al alumno frente al profesor, no vas a saber cuándo has terminado ni cuándo se ha degradado.

Antes de destilar, agota lo barato: prompt caching, enrutado de modelos y cuantización bajan la factura en días, no en semanas, y no te dejan un modelo propio que mantener.

Si aun así los números cuadran, empieza pequeño: una sola tarea, mil ejemplos filtrados de tráfico real, un alumno de pesos abiertos y una evaluación que compare alumno contra profesor sobre casos que ninguno de los dos ha visto. Si esa primera pasada no te acerca al profesor, el problema no es el tamaño del conjunto de datos. Es que la tarea todavía no está lo bastante acotada.