¿Qué Puede Hacer Realmente un Modelo Pre-entrenado?

Un modelo de lenguaje grande recién salido del pre-entrenamiento es impresionante e inútil al mismo tiempo. Ha leído miles de millones de palabras de texto — libros, código, páginas web, artículos científicos — y ha destilado patrones estadísticos sobre el lenguaje en sus pesos. Puede completar oraciones, imitar estilos e incluso resolver problemas matemáticos si el prompt está diseñado correctamente. Pero hazle una pregunta directa como "Resume este contrato en tres puntos" y probablemente obtendrás algo que se parece más a una continuación de tu oración que a un resumen real. ¿Por qué?

Porque el pre-entrenamiento optimiza para una sola cosa: predecir el siguiente token. El modelo aprende $P(x_t \mid x_{<t})$, la probabilidad de la siguiente palabra dado todo lo anterior. Ese objetivo le enseña al modelo lo que el lenguaje es — sintaxis, hechos, patrones de razonamiento — pero no lo que el usuario quiere . El artículo original de GPT-3 (Brown et al., 2020) demostró esta brecha de manera vívida. GPT-3 podía realizar tareas impresionantes de few-shot cuando se le daban prompts cuidadosamente construidos con ejemplos, pero no podía seguir de manera confiable una instrucción simple como "traduce esto al francés" sin una demostración. A veces repetía la instrucción, continuaba el texto como si fuera un documento, o se desviaba completamente del tema.

💡 Piensa en el pre-entrenamiento como enseñarle a alguien a leer todos los libros de una biblioteca. Saben una cantidad enorme, pero si les das una tarea — "escribe un correo de atención al cliente en este formato JSON exacto" — no tienen idea de lo que esperas. Nunca han practicado seguir instrucciones; solo han practicado predecir lo que viene después en textos que ya han leído.

Esta es la brecha entre capacidad y alineamiento . El modelo tiene la habilidad bruta de generar texto fluido y con conocimiento, pero no sabe cómo canalizar esa habilidad hacia tu objetivo específico. El prompting puede a veces cerrar esta brecha para tareas simples, pero para cualquier cosa que requiera un formato de salida consistente, un estilo de razonamiento específico del dominio, o un seguimiento confiable de instrucciones, necesitamos algo más. Entonces, ¿cómo cerramos esta brecha?

El Espectro de Adaptación

No hay una sola forma de adaptar un modelo. Hay todo un espectro de técnicas, que van desde gratuitas e instantáneas (pero limitadas) hasta costosas y lentas (pero transformadoras). Antes de comprometerte con el fine-tuning, vale la pena entender dónde se ubica en relación con las alternativas — porque la opción más económica que resuelve tu problema suele ser la correcta.

  • Prompting (zero-shot / few-shot): Escribe un buen prompt de sistema, tal vez incluye algunos ejemplos, y espera que el modelo lo entienda. Sin entrenamiento, sin GPU, sin recolección de datos. Esto funciona sorprendentemente bien para tareas genéricas, pero falla cuando necesitas formato consistente, jerga específica del dominio, o comportamiento para el que el modelo no fue pre-entrenado. Estás limitado por la ventana de contexto y por tu habilidad de prompt-engineering.
  • Aprendizaje en contexto (ICL): Empaqueta ejemplos directamente en el prompt. "Aquí hay 10 ejemplos de cómo clasificar tickets de soporte — ahora clasifica este." Mejor que zero-shot, pero cada ejemplo consume tokens, los resultados son sensibles al orden de los ejemplos, y estás alquilando el comportamiento por llamada en lugar de poseerlo. El modelo en realidad no aprende; solo hace coincidencia de patrones dentro del contexto.
  • Generación Aumentada por Recuperación ( RAG ): Recupera documentos relevantes en el momento de la consulta y pégalos en el contexto. Excelente para conocimiento factual — el modelo fundamenta su respuesta en pasajes recuperados en lugar de alucinar. Pero RAG no puede cambiar cómo razona el modelo ni qué formato usa. Si el modelo no sabe cómo generar JSON válido, ninguna cantidad de documentos recuperados arreglará eso.
  • Fine-tuning: Actualiza los pesos del modelo con ejemplos específicos de la tarea. Esto cambia el comportamiento del modelo — su formato de salida predeterminado, estilo de razonamiento, tono, patrones de uso de herramientas. El modelo aprende nuevos hábitos a partir de tus datos. Requiere un dataset de entrenamiento y cómputo en GPU, pero el costo por inferencia se reduce (no se necesitan prompts largos llenos de ejemplos) y el comportamiento se vuelve consistente.
  • Pre-entrenamiento desde cero: Entrena un nuevo modelo desde pesos inicializados aleatoriamente sobre un corpus masivo. Esta es la opción nuclear: meses de cómputo en miles de GPUs, miles de millones de tokens de datos curados. Casi nunca se justifica a menos que necesites una arquitectura fundamentalmente diferente, un nuevo idioma, o un dominio tan especializado (ej. secuencias de proteínas) que los modelos existentes no tengan un prior útil.

La tabla a continuación hace concretas las compensaciones. Observa cómo el fine-tuning es el único enfoque que cambia el comportamiento del modelo sin requerir pre-entrenamiento completo — ese es el punto óptimo que exploraremos a lo largo de este track.

import json, js

rows = [
    ["Prompting",       "Ninguno",        "No",   "No",  "No",  "Instantáneo"],
    ["ICL (few-shot)",  "Algunos ejemplos", "No",   "No",  "No",  "Instantáneo"],
    ["RAG",             "Un corpus de documentos", "No",   "No",  "Sí (hechos)", "Horas (indexación)"],
    ["Fine-tuning",     "100–100k ejemplos", "Sí",  "Sí", "Parcialmente",   "Horas–días"],
    ["Pre-entrenamiento",    "Miles de millones de tokens", "Sí",  "Sí", "Sí",         "Semanas–meses"],
]

js.window.py_table_data = json.dumps({
    "headers": [
        "Enfoque",
        "Datos necesarios",
        "¿Requiere GPU?",
        "¿Cambia comportamiento?",
        "¿Agrega conocimiento?",
        "Tiempo de preparación"
    ],
    "rows": rows
})

print("Idea clave: el fine-tuning está en el punto óptimo — cambia el comportamiento")
print("con datos y cómputo modestos, sin el costo del pre-entrenamiento completo.")
📌 Estos enfoques no son mutuamente excluyentes. Los mejores sistemas en producción a menudo los combinan: un modelo fine-tuneado (para comportamiento y formato) con RAG (para hechos actualizados) y prompting cuidadoso (para instrucciones por solicitud). Piensa en ellos como herramientas complementarias, no opciones que compiten.

Entonces, cuando el prompting y RAG no son suficientes — cuando necesitas que el modelo adopte consistentemente un nuevo comportamiento, formato o habilidad — el fine-tuning es a donde recurres. Pero, ¿qué hace realmente el fine-tuning bajo el capó?

¿Qué Cambia Realmente el Fine-tuning?

Durante el pre-entrenamiento, el modelo aprende una distribución general sobre el lenguaje: dado un contexto, ¿qué token es probable que venga después? Esta distribución es extremadamente amplia — cubre todo, desde contratos legales hasta comentarios de Reddit y código Python. El modelo es un generalista, y eso es tanto su fortaleza como su debilidad.

El fine-tuning estrecha esta distribución. Le mostramos al modelo un conjunto curado de pares (entrada, salida deseada), y ajustamos sus pesos para que asigne mayor probabilidad a las salidas que queremos. Formalmente, el modelo comienza con parámetros pre-entrenados $\theta_0$ y los actualizamos a $\theta^*$ minimizando una pérdida sobre nuestro dataset específico de la tarea $\mathcal{D} = \{(x^{(i)}, y^{(i)})\}_{i=1}^{N}$, donde cada $x^{(i)}$ es una instrucción o entrada y cada $y^{(i)}$ es la respuesta deseada.

La pérdida estándar para Supervised Fine-Tuning (SFT) es la pérdida de entropía cruzada sobre los tokens objetivo:

$$\mathcal{L}_{\text{SFT}}(\theta) = -\frac{1}{T} \sum_{t=1}^{T} \log P_\theta(y_t \mid x, y_{<t})$$

Descompongamos cada símbolo en esta fórmula para que nada quede a la suposición:

  • $\theta$ — los parámetros del modelo (todas las matrices de pesos). Estas son las variables que estamos optimizando. Empezamos desde $\theta_0$ (los pesos pre-entrenados) y los empujamos hacia $\theta^*$.
  • $x$ — la entrada (instrucción, prompt, pregunta). Este es el contexto sobre el que el modelo condiciona.
  • $y_t$ — el token objetivo en la posición $t$ de la respuesta deseada. Esto es lo que queremos que el modelo prediga.
  • $y_{<t}$ — todos los tokens objetivo antes de la posición $t$. El modelo genera de forma autoregresiva, así que predecir $y_t$ depende tanto de la entrada $x$ como de todos los tokens previamente generados $y_1, y_2, \ldots, y_{t-1}$.
  • $T$ — el número total de tokens en la respuesta objetivo. Dividir por $T$ promedia la pérdida a lo largo de la secuencia para que las respuestas largas no dominen a las cortas en el mismo batch.
  • $P_\theta(y_t \mid x, y_{<t})$ — la probabilidad que el modelo asigna al token correcto $y_t$, dada la entrada y todos los tokens objetivo anteriores. Esto viene del softmax sobre el vocabulario en la posición $t$.
  • $-\log(\cdot)$ — el logaritmo negativo transforma probabilidades en una pérdida. Cuando el modelo está seguro y correcto (probabilidad cerca de 1.0), la pérdida es cercana a cero. Cuando está equivocado (probabilidad cerca de 0), la pérdida es enorme.

Ahora veamos qué pasa en los valores límite — aquí es donde vive la intuición. Supongamos que el modelo asigna probabilidad 1.0 al token correcto: $-\log(1.0) = 0$, así que hay cero pérdida. El modelo ya sabe esto perfectamente. Si el modelo asigna probabilidad 0.5 (un volado entre dos tokens): $-\log(0.5) \approx 0.693$. Penalización moderada — el modelo necesita ser más decisivo. Si el modelo asigna probabilidad 0.01 (casi seguro de que es un token diferente): $-\log(0.01) \approx 4.605$. Penalización masiva. Y en el extremo, si el modelo asigna probabilidad cercana a 0: $-\log(\epsilon) \rightarrow \infty$. La pérdida explota, creando una señal de gradiente muy fuerte para corregir esto.

import math, json, js

# Mostrar la pérdida de log negativo en diferentes valores de probabilidad
probs = [1.0, 0.9, 0.5, 0.1, 0.01, 0.001]
rows = []
for p in probs:
    loss = -math.log(p)
    interpretation = ""
    if p == 1.0:
        interpretation = "Perfecto — cero pérdida"
    elif p >= 0.9:
        interpretation = "Seguro y correcto — pequeño ajuste"
    elif p >= 0.5:
        interpretation = "Volado — penalización moderada"
    elif p >= 0.1:
        interpretation = "Mayormente equivocado — gradiente fuerte"
    elif p >= 0.01:
        interpretation = "Muy equivocado — gran penalización"
    else:
        interpretation = "Catastróficamente equivocado — la pérdida explota"
    rows.append([f"{p}", f"{loss:.4f}", interpretation])

js.window.py_table_data = json.dumps({
    "headers": ["P(token correcto)", "-log(P)", "Interpretación"],
    "rows": rows
})

print("La función de log negativo hace la pérdida asimétrica:")
print("acertar apenas reduce la pérdida (0 es el piso),")
print("pero equivocarse crea gradientes explosivos.")
💡 El término $1/T$ importa más de lo que parece. Sin él, una respuesta de 500 tokens contribuiría 10x más a la pérdida que una respuesta de 50 tokens, y el modelo gastaría toda su capacidad optimizando ejemplos largos a expensas de los cortos. Promediar sobre $T$ trata cada ejemplo por igual independientemente de su longitud.

Un detalle crucial: durante el fine-tuning, típicamente usamos una tasa de aprendizaje mucho menor que durante el pre-entrenamiento — del orden de $1 \times 10^{-5}$ a $5 \times 10^{-5}$, comparado con $1 \times 10^{-3}$ o más durante el pre-entrenamiento. ¿Por qué? Porque los pesos pre-entrenados ya codifican conocimiento enormemente útil sobre el lenguaje. Queremos empujar al modelo hacia nuestra tarea, no sobrescribir lo que ya sabe. Una tasa de aprendizaje demasiado alta causa olvido catastrófico — el modelo aprende tu tarea pero pierde su capacidad general de lenguaje, produciendo salidas fluidas específicas de la tarea que se desmoronan ante cualquier cosa ligeramente diferente.

También hay una sutileza importante sobre en qué calculamos la pérdida. En SFT, típicamente enmascaramos la pérdida en los tokens de entrada . El modelo ve la secuencia completa $[x; y]$ (entrada concatenada con objetivo), pero solo calculamos la pérdida en los tokens de $y$. No queremos penalizar al modelo por no predecir la instrucción del usuario — solo nos importa que produzca la respuesta correcta. Por eso la fórmula suma sobre $t = 1$ hasta $T$ (la longitud del objetivo), no sobre toda la secuencia de entrada-salida.

Entonces, el fine-tuning toma un modelo que conoce el lenguaje en general y lo enfoca en producir las salidas específicas que queremos. Pero, ¿cómo sabemos cuándo el fine-tuning es la herramienta correcta para el trabajo?

¿Cuándo Deberías Hacer Fine-tuning?

No todos los problemas necesitan fine-tuning, y recurrir a él demasiado pronto es uno de los errores más comunes (y costosos) en ML aplicado. La idea clave es que el fine-tuning sobresale en cambiar comportamiento , no en inyectar conocimiento . Entender esta distinción te ahorrará semanas de cómputo desperdiciado.

Fine-tuning para comportamiento

Si necesitas que el modelo produzca consistentemente salida en un formato específico (JSON, XML, tablas markdown), adopte un tono particular (lenguaje legal formal, atención al cliente amigable, notas médicas concisas), use herramientas correctamente (llamadas a API, invocaciones de funciones, ejecución de código), o siga un patrón de razonamiento de múltiples pasos — todos estos son cambios de comportamiento que el fine-tuning maneja bien. Le estás enseñando al modelo cómo responder, no qué decir.

Fine-tuning para habilidades

Generación de código en un framework nicho, extracción de datos estructurados de documentos desordenados, calidad de traducción en un par de idiomas de bajos recursos, razonamiento matemático — estas son habilidades que mejoran con fine-tuning. El modelo tiene alguna capacidad base del pre-entrenamiento, pero puedes agudizarla dramáticamente con ejemplos dirigidos. El artículo de LIMA (Zhou et al., 2023) demostró que solo 1,000 ejemplos cuidadosamente curados pueden producir un modelo que rivaliza con sistemas entrenados con 50x más datos — la calidad importa mucho más que la cantidad.

💡 LIMA significa "Less Is More for Alignment" (Menos es Más para el Alineamiento). El hallazgo central del artículo es que casi todo el conocimiento en un modelo de lenguaje se aprende durante el pre-entrenamiento, y solo un pequeño número de ejemplos de alta calidad se necesitan durante el fine-tuning para enseñarle al modelo cómo presentar ese conocimiento. Por eso la calidad de los datos supera a la cantidad en fine-tuning.

No hagas fine-tuning para hechos

Si tu problema es que el modelo no sabe algo — los precios de acciones de ayer, las políticas internas de tu empresa, los últimos artículos de investigación — no hagas fine-tuning . Usa RAG en su lugar (consulta el track de RAG para un tratamiento completo). El fine-tuning incorpora conocimiento en los pesos, lo que significa que se vuelve obsoleto, requiere re-entrenamiento para actualizar, y es propenso a alucinaciones cuando el modelo tiene incertidumbre sobre hechos memorizados. RAG mantiene el conocimiento en un corpus externo que puede intercambiarse o actualizarse sin tocar el modelo.

El marco de decisión

Cuando te enfrentas a una nueva tarea, recorre estas preguntas en orden:

  • ¿Puede resolverlo el prompting? Prueba primero con prompts zero-shot y few-shot. Si el modelo consistentemente lo hace bien con un buen prompt, ya terminaste — no se necesita entrenamiento. Este es el camino más barato y rápido.
  • ¿Es un problema de conocimiento? Si el modelo tiene el comportamiento correcto pero le faltan hechos específicos, usa RAG. Recupera los documentos relevantes y deja que el modelo razone sobre ellos.
  • ¿Es un problema de comportamiento, formato o habilidad? Si el modelo conoce los hechos pero no los presenta correctamente, no sigue tu formato, o le falta una habilidad específica — haz fine-tuning. Este es el punto óptimo.
  • ¿La arquitectura del modelo base es fundamentalmente incorrecta? Si necesitas un modelo para una modalidad completamente diferente (plegamiento de proteínas, generación molecular) o familia de idiomas con cero cobertura de pre-entrenamiento — pre-entrena desde cero. Esto es raro y costoso.

El artículo de InstructGPT (Ouyang et al., 2022) fue la demostración emblemática de este pipeline en la práctica. OpenAI tomó GPT-3 (un predictor puro de siguiente token), lo fine-tuneó con ~13,000 demostraciones de seguimiento de instrucciones (SFT), y luego lo alineó aún más con preferencias humanas usando RLHF. El resultado fue un modelo dramáticamente mejor siguiendo instrucciones — no porque supiera más, sino porque había aprendido un nuevo comportamiento : leer la instrucción, luego responder de manera útil. Ese cambio de comportamiento es exactamente en lo que el fine-tuning sobresale.

📌 Una trampa común: los equipos recopilan miles de pares de pregunta-respuesta sobre su dominio y hacen fine-tuning, esperando que el modelo "aprenda" su base de conocimiento. Lo que usualmente pasa es que el modelo memoriza algunos hechos, alucina otros, y no puede actualizarse sin re-entrenamiento. La jugada correcta es casi siempre RAG para el conocimiento + fine-tuning para el formato y estilo de razonamiento.

Ahora que sabemos cuándo hacer fine-tuning, alejémonos y veamos dónde encaja en el pipeline completo de entrenamiento del modelo.

El Pipeline de Tres Etapas

Los modelos de lenguaje modernos no pasan de pesos aleatorios a asistente útil en un solo paso. El proceso tiene tres etapas distintas, cada una con su propio objetivo, datos y escala. Entender este pipeline es esencial porque el fine-tuning (Etapa 2) se construye directamente sobre lo que el pre-entrenamiento (Etapa 1) te da, y el alineamiento (Etapa 3) refina lo que el fine-tuning produce.

Etapa 1: Pre-entrenamiento — Aprendiendo el lenguaje

El modelo se entrena con miles de millones (o billones) de tokens de un corpus amplio — texto web, libros, código, artículos científicos. El objetivo es predicción del siguiente token: $P(x_t \mid x_{<t})$. Esta es la etapa más costosa por mucho (miles de GPUs, semanas a meses de entrenamiento), y produce un modelo con vasto conocimiento general pero sin capacidad de seguir instrucciones. Cubrimos la mecánica del pre-entrenamiento en el track de Transformers (artículo 10).

Etapa 2: Supervised Fine-Tuning (SFT) — Aprendiendo a seguir instrucciones

Tomamos el modelo pre-entrenado y lo entrenamos en un dataset mucho más pequeño de pares (instrucción, respuesta). Miles a decenas de miles de ejemplos, no miles de millones. El modelo aprende a leer instrucciones y producir respuestas útiles y bien formateadas. Esta es la etapa que transforma un predictor de siguiente token en algo que se siente como un asistente. La pérdida es la fórmula de entropía cruzada que vimos arriba, calculada solo sobre los tokens de respuesta.

Etapa 3: Alineamiento (RLHF / DPO) — Aprendiendo preferencias humanas

SFT le enseña al modelo a seguir instrucciones, pero no cuál de varias respuestas válidas preferiría un humano. Las técnicas de alineamiento como Reinforcement Learning from Human Feedback ( RLHF ) (Ouyang et al., 2022) y Direct Preference Optimisation ( DPO ) (Rafailov et al., 2023) usan datos de preferencia humana ("la respuesta A es mejor que la respuesta B") para refinar aún más el modelo. Esta etapa maneja seguridad, utilidad, concisión y otras cualidades difíciles de especificar solo con pares (entrada, salida). El track de RLHF cubre esta etapa en profundidad.

import json, js

rows = [
    [
        "1. Pre-entrenamiento",
        "Predicción del siguiente token",
        "Billones de tokens (web, libros, código)",
        "Semanas–meses en 1000s de GPUs",
        "Capacidad general de lenguaje"
    ],
    [
        "2. SFT",
        "Entropía cruzada sobre respuestas",
        "1k–100k pares (instrucción, respuesta)",
        "Horas–días en 1–8 GPUs",
        "Seguimiento de instrucciones"
    ],
    [
        "3. Alineamiento",
        "RLHF / DPO",
        "10k–100k pares de preferencia",
        "Horas–días en 1–8 GPUs",
        "Comportamiento preferido por humanos"
    ],
]

js.window.py_table_data = json.dumps({
    "headers": ["Etapa", "Objetivo", "Datos", "Cómputo", "Qué enseña"],
    "rows": rows
})

print("Cada etapa se construye sobre la anterior.")
print("La Etapa 2 (SFT) es donde vive el fine-tuning — y es el foco de este track.")
💡 Observa la eficiencia de datos en cada etapa. El pre-entrenamiento necesita billones de tokens. SFT necesita miles de ejemplos. El alineamiento necesita miles de pares de preferencia. Cada etapa sucesiva es órdenes de magnitud más barata porque se construye sobre el conocimiento ya codificado en los pesos. Por eso el fine-tuning es tan poderoso: heredas miles de millones de dólares de cómputo de pre-entrenamiento gratis.

Lo que cubre este track

Este track de fine-tuning se enfoca en la Etapa 2 — supervised fine-tuning y las técnicas de eficiencia de parámetros que lo hacen práctico. Esto es lo que viene:

  • Artículo 2: Mecánica del fine-tuning completo — cómo fluyen las actualizaciones de gradiente a través del modelo completo, qué hiperparámetros importan, y cuándo el fine-tuning completo es la opción correcta.
  • Artículo 3: LoRA (Low-Rank Adaptation) — la técnica revolucionaria que fine-tunea solo una pequeña fracción de los parámetros inyectando matrices entrenables de bajo rango, haciendo el fine-tuning accesible en GPUs de consumidor.
  • Artículo 4: QLoRA y cuantización — combinando cuantización de 4 bits con LoRA para fine-tunear modelos que de otra forma no cabrían en memoria.
  • Artículo 5: Preparación de datos — cómo recolectar, limpiar y formatear datos de entrenamiento. El artículo de "basura entra, basura sale".
  • Artículos 6–10: Temas avanzados incluyendo métodos de adaptadores, prompt tuning, fine-tuning multi-tarea, estrategias de evaluación y despliegue de modelos fine-tuneados en producción.

Al final de este track, entenderás no solo cómo hacer fine-tuning, sino cuándo hacerlo, cuántos datos necesitas, qué parámetros actualizar, y cómo evaluar si funcionó. El siguiente artículo profundiza en la mecánica del fine-tuning completo — cómo fluyen los gradientes, qué hace el optimizador, y por qué el calendario de tasa de aprendizaje importa tanto.

Quiz

Pon a prueba tu comprensión de cuándo y por qué hacer fine-tuning a un modelo pre-entrenado.

Un modelo de lenguaje pre-entrenado puede generar texto fluido pero no sigue instrucciones de manera confiable. ¿Cuál es la razón principal?

Tu modelo produce respuestas correctas pero en texto plano, y necesitas salida JSON consistente. ¿Cuál es el enfoque más apropiado?

En la pérdida de SFT $\mathcal{L} = -\frac{1}{T} \sum_{t=1}^{T} \log P_\theta(y_t \mid x, y_{

Tu chatbot necesita responder preguntas sobre el catálogo de productos de tu empresa que se actualiza frecuentemente. ¿Cuál enfoque es más apropiado?