27

Ajuste fino y LoRA

¿Cuándo conviene adaptar un modelo y cómo se hace barato?

11 minRuta ejecutiva

Ajuste fino y LoRA

Con voz. Puedes pausar y saltar a cualquier paso.

Lección completa

Subtítulos

La parte dos terminó con un modelo base: sabe continuar textos, pero no conoce tu caso. No sabe tu tono, ni tus formatos, ni tus categorías.

Voz

Sin voz: la lección avanza sola con subtítulos.

La voz de esta lección está en preparación: por ahora avanza sola con subtítulos.

0:00 / 0:00

Qué lograrás

  • Explicar qué es el ajuste fino y por qué mover todos los parámetros con ejemplos de una sola zona puede hacer que el modelo olvide lo que ya sabía.
  • Calcular cuántos números entrena LoRA con la regla rango × (filas + columnas) y compararlos con los de la tabla completa.
  • Decidir entre prompt, RAG y ajuste fino para un caso, y saber qué datos y qué evaluación exigir antes de ajustar.

Ideas clave

  1. El ajuste fino sigue entrenando un modelo ya entrenado con pares de entrada y respuesta deseada: es el mismo bucle de la lección 8 (responder, medir el error, retropropagar, ajustar), con muchos menos datos.
  2. Mover todos los parámetros con ejemplos de una sola zona desacomoda lo demás: es el olvido catastrófico. La defensa básica es el repaso (mezclar ejemplos de lo que ya sabía) y medir también lo que ya sabía.
  3. LoRA congela la tabla original y entrena una corrección ΔW = B·A de bajo rango: rango × (filas + columnas) números en vez de filas × columnas. En GPT-3, unas diez mil veces menos parámetros entrenables.
  4. B empieza en cero, así que el modelo arranca idéntico; como la base no cambia, el adaptador (B y A) se quita o se cambia: un modelo base y un adaptador por tarea. QLoRA guarda la base en 4 bits y así ajusta un modelo de 65 mil millones en una GPU de 48 GB.
  5. Primero un buen prompt; si falta información que cambia, RAG; el ajuste fino, para un comportamiento estable y repetido, con buenos datos y una evaluación propia. No es buena vía para meter hechos nuevos.

Lo que mucha gente cree

Creencia común Para que el modelo conozca los documentos de mi empresa, hay que ajustarlo (fine-tuning) con ellos.

Lo correcto El ajuste fino cambia cómo se comporta el modelo (tono, formato, tarea), pero es un mal modo de incorporar hechos: los aprende despacio, no los puede citar y, al aprenderlos, puede inventar más. Para conocimiento propio que cambia, empieza por RAG; LoRA abarata el ajuste, pero no cambia esto.

Compruébalo

Cuatro preguntas. Sin nota ni cuenta: sirven para ver si la idea quedó.

Concepto¿Qué entrena LoRA?
ConceptoAjustas un modelo solo con ejemplos de tu área: mejora ahí, pero empeora en tareas que antes hacía bien. ¿Qué pasó y qué ayuda?
CálculoUna tabla de 4096 por 4096 se adapta con LoRA de rango 8. ¿Cuántos números tienen B y A en total?
AplicaciónUn equipo propone ajustar el modelo con el manual de políticas de la empresa para que «se lo aprenda». El manual cambia cada trimestre y las respuestas deben citar el párrafo. ¿Qué respondes?

Por dentroPara quien quiere las fórmulas y el código. No hace falta para seguir el curso.

Qué se minimiza en el ajuste fino supervisado

Dado un modelo con pesos θ\theta y ejemplos (xi,yi)(x_i, y_i) (una entrada y la respuesta deseada), el ajuste fino supervisado sigue minimizando la entropía cruzada,

L(θ)=−1N∑i=1Nlog⁡pθ(yi∣xi)L(\theta) = -\frac{1}{N}\sum_{i=1}^{N} \log p_\theta(y_i \mid x_i)

con el mismo descenso del gradiente de la lección 4 y los gradientes de la retropropagación de la lección 8. En un modelo de lenguaje, yiy_i es una secuencia de tokens y la suma corre solo sobre los tokens de la respuesta. Se parte de los pesos preentrenados θ0\theta_0 (lección 23), con tasas de aprendizaje mucho menores que en el preentrenamiento y pocas pasadas por los datos. LIMA (Zhou et al., 2023) usó 1 000 ejemplos, unos 750 000 tokens, sobre LLaMA de 65 mil millones de parámetros, preentrenado con 1.4 billones de tokens (Touvron et al., 2023).

LoRA: la matemática

Para una matriz de pesos preentrenada W0∈Rd×kW_0\in\mathbb{R}^{d\times k}, LoRA la congela y escribe la actualización como

W=W0+αr BA,B∈Rd×r,  A∈Rr×k,  r≪min⁡(d,k)W = W_0 + \frac{\alpha}{r}\,BA,\qquad B\in\mathbb{R}^{d\times r},\; A\in\mathbb{R}^{r\times k},\; r\ll\min(d,k)

El pase hacia delante es h=W0x+αrB(Ax)h = W_0x + \tfrac{\alpha}{r}B(Ax). AA se inicia con una gaussiana y BB con ceros, así que ΔW=0\Delta W = 0 al empezar (Hu et al., 2021); solo AA y BB reciben gradiente. Como ∂L/∂A\partial L/\partial A es proporcional a BB, en el primer paso solo se mueve BB.

Cada columna bjb_j de BB y cada fila aja_j de AA forman una pieza de rango uno, bjajb_j a_j (columna por fila, como la tabla de multiplicar de la lección): BA=∑j=1rbjajBA = \sum_{j=1}^{r} b_j a_j. De ahí el nombre: la corrección tiene rango a lo sumo rr.

Parámetros entrenables: r (d+k)r\,(d+k) en vez de dkdk. Solo ahorra si r<dkd+kr < \dfrac{dk}{d+k}; en una matriz cuadrada, r<d/2r<d/2. Con d=k=32d=k=32 (la capa del centro del modelo diminuto), r=16r=16 empata: 16⋅64=1 02416\cdot 64 = 1\,024.

Una vez entrenado se puede fusionar, W=W0+αrBAW = W_0 + \tfrac{\alpha}{r}BA, y la inferencia cuesta lo mismo que la del modelo original; o dejar el adaptador aparte para cambiarlo por otro.

Con GPT-3 175B (dmodel=12 288d_{\text{model}}=12\,288, 96 capas), adaptar solo WqW_q y WvW_v con r=4r=4 da 96⋅2⋅4⋅(12 288+12 288)=18 874 36896\cdot 2\cdot 4\cdot(12\,288+12\,288)=18\,874\,368 parámetros entrenables: unas 9 300 veces menos que 175 mil millones (el artículo dice «unas 10 000 veces»). En FP16 el adaptador ocupa unos 35 MB frente a los 350 GB del modelo, y 100 adaptaciones ocupan unos 354 GB en vez de 35 TB (Hu et al., 2021).

Por qué el cambio es de bajo rango

Si M=∑iσiuivi⊤M=\sum_i \sigma_i u_i v_i^\top es la descomposición en valores singulares, el teorema de Eckart y Young dice que la mejor matriz de rango rr (en norma de Frobenius) es la suma de los rr primeros términos, y su error es ∑i>rσi2\sum_{i>r}\sigma_i^2. En el modelo diminuto, el cambio que deja el ajuste completo en la capa de 32×32 tiene valores singulares que caen rápido: los cuatro primeros reúnen alrededor de 97 % de ∑σi2\sum\sigma_i^2. Eso es lo que LoRA supone y aprovecha; Aghajanyan et al. (2020) ya habían medido que ajustar un modelo de lenguaje necesita muy pocas dimensiones efectivas. No es una ley: Hu et al. no esperan que un rango pequeño sirva para cualquier tarea (por ejemplo, un idioma distinto del preentrenamiento), y Biderman et al. (2024) midieron que, en programación y matemáticas, el ajuste completo aprende cambios de un rango 10 a 100 veces mayor que las configuraciones típicas de LoRA.

Olvido, repaso y qué dice la evidencia

Con datos estrechos, mover pesos compartidos desplaza lo que esos datos no cubren. En el modelo diminuto (70 ejemplos nuevos de una sola zona, 300 pasos de Adam con todo el lote, una corrida con semillas fijas):

ajuste se entrenan aciertos en lo nuevo aciertos en lo que ya sabía
ninguno (modelo base) — 0 % 100 %
completo 1 251 98 % 93 %
completo + 30 de repaso 1 251 94 % 97 %
LoRA r = 2 128 91 % 87 %
LoRA r = 2 + 30 de repaso 128 93 % 98 %

Aquí LoRA sin repaso olvida más que el ajuste completo; en modelos grandes, Biderman et al. (2024) hallaron lo contrario en promedio (LoRA aprende menos y olvida menos), pero no que deje de olvidar. Moraleja: el olvido es un riesgo con ambos métodos, y se mide con datos que el ajuste no vio. El nombre «catastrófico» viene de McCloskey y Cohen (1989); en el juguete la pérdida es moderada.

Memoria: de dieciséis bytes por parámetro a menos

Entrenar con Adam en precisión mixta guarda por parámetro: pesos FP16 (2 bytes), gradientes FP16 (2) y, en FP32, copia de los pesos, momento y varianza (4+4+44+4+4): 1616 bytes (Rajbhandari et al., 2019; lección 25). Con LoRA, los pesos congelados solo necesitan su copia (2 bytes en FP16) y los 16 bytes se pagan solo por AA y BB. QLoRA guarda además la base en 4 bits (formato NF4, con «doble cuantización» de las constantes) y entrena el adaptador en 16 bits. Cuenta propia para un modelo de 7 mil millones, sin activaciones: ajuste completo 7⋅16=1127\cdot 16=112 GB; base en FP16, 14 GB; base en 4 bits, unos 3.5 GB, más adaptador y activaciones.

Las cifras de los artículos no salen exactamente de esta cuenta, porque dependen de qué se guarde y cómo: el de LoRA da, para GPT-3 175B, de 1.2 TB a 350 GB, y el de QLoRA cuenta más de 780 GB para ajustar 65 mil millones en 16 bits (unos 12 bytes por parámetro). Compara siempre bajo la misma cuenta.

En el modelo diminuto se puede probar la parte «Q»: con sus tres matrices en 4 bits (NF4, bloques de 64), el mapa cambia en 22 de 1 600 celdas, y LoRA de rango 2 con repaso llega a 91 % en lo nuevo y 98 % en lo que ya sabía, frente a 93 % y 98 % con la base en 16 bits. Es un juguete: reproduce la idea, no demuestra nada sobre modelos grandes.

En código

import numpy as np

# 1) la cuenta: una matriz de GPT-3 (12288 x 12288) y rango 8
d = k = 12288
r = 8
completa = d * k
lora = r * (d + k)
print(completa, lora, completa // lora)    # 150994944 196608 768

# 2) la corrección arranca en cero (B = 0): el modelo no cambia
rng = np.random.default_rng(0)
W0 = rng.normal(size=(6, 6))               # matriz congelada (diminuta)
A = rng.normal(size=(2, 6))                # r = 2, gaussiana
B = np.zeros((6, 2))                       # ceros
x = rng.normal(size=6)
h = W0 @ x + B @ (A @ x)                   # alfa/r = 1
print(np.allclose(h, W0 @ x))              # True

# 3) tras entrenar, B deja de ser cero: la corrección tiene rango <= 2
B = rng.normal(size=(6, 2)) * 0.1
print(np.linalg.matrix_rank(B @ A))        # 2

Lo que viene

Ajustar con pares de entrada y salida cambia formato, estilo y tarea. Convertir un modelo que solo completa texto en un asistente usa ese mismo mecanismo, pero la pregunta es qué pares y qué señal: el ajuste con instrucciones y el aprendizaje por refuerzo con retroalimentación humana (lección 28). Y es práctico: con QLoRA se ajustó con instrucciones la familia Guanaco (Dettmers et al., 2023), y esos autores hallaron que la calidad de los datos pesa mucho más que su cantidad (9 mil ejemplos de OASST1 superaron a 450 mil de FLAN v2 en su prueba de chatbot).

Lente de decisión

Qué significa esta idea si tu trabajo es decidir, no programar.

  • Exige la línea base antes del ajuste: ¿qué logra un buen prompt? ¿y RAG? Si el equipo no muestra esos números sobre casos tuyos, ajustar es una apuesta a ciegas.
  • El ajuste fino cambia comportamiento y estilo; no es un buen modo de «meter conocimiento fresco». Para precios, políticas o catálogos que cambian, RAG se actualiza sin reentrenar y permite citar la fuente.
  • Pregunta por los datos y la evaluación primero: cuántos ejemplos, quién los revisó, con qué casos no vistos se mide la mejora y cómo se comprueba lo que el modelo pudo olvidar.
  • LoRA abarata entrenar y guardar (adaptadores de megabytes, no copias de cientos de gigabytes), pero cada adaptador va ligado al modelo base con el que se entrenó: pregunta quién lo mantiene cuando cambie la base, y trata los datos de ajuste como sensibles.

Términos de la lección

Transcripción completa
ComentariosConversación pública de esta lección: dudas, datos por revisar, ideas.

Los comentarios viven en GitHub Discussions, en el repositorio público del curso; para escribir se necesita una cuenta de GitHub. Se cargan desde giscus.app al abrir esta sección. Las personas que revisan el curso los leen, y si un cambio se acepta, se aplica en los dos idiomas. Abrir el hilo en GitHub

Fuentes