¿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.
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.")
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:
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.")
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.
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.
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.")
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?