Ajuste fino y LoRA
¿Cuándo conviene adaptar un modelo y cómo se hace barato?
Lección completa
Si quieres:
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.
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.
Modo revisiónComentar este pasoTerminé la lección
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
- 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.
- 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.
- 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.
- 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.
- 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ó.
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 y ejemplos (una entrada y la respuesta deseada), el ajuste fino supervisado sigue minimizando la entropía cruzada,
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, es una secuencia de tokens y la suma corre solo sobre los tokens de la respuesta. Se parte de los pesos preentrenados (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 , LoRA la congela y escribe la actualización como
El pase hacia delante es . se inicia con una gaussiana y con ceros, así que al empezar (Hu et al., 2021); solo y reciben gradiente. Como es proporcional a , en el primer paso solo se mueve .
Cada columna de y cada fila de forman una pieza de rango uno, (columna por fila, como la tabla de multiplicar de la lección): . De ahí el nombre: la corrección tiene rango a lo sumo .
Parámetros entrenables: en vez de . Solo ahorra si ; en una matriz cuadrada, . Con (la capa del centro del modelo diminuto), empata: .
Una vez entrenado se puede fusionar, , y la inferencia cuesta lo mismo que la del modelo original; o dejar el adaptador aparte para cambiarlo por otro.
Con GPT-3 175B (, 96 capas), adaptar solo y con da 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 es la descomposición en valores singulares, el teorema de Eckart y Young dice que la mejor matriz de rango (en norma de Frobenius) es la suma de los primeros términos, y su error es . 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 . 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 (): 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 y . 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 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
- Ajuste fino Seguir entrenando un modelo ya preentrenado con un conjunto pequeño de ejemplos propios (entrada y respuesta deseada) para cambiar su comportamiento, sin empezar de cero.
- LoRA (adaptación de bajo rango) Técnica de ajuste fino que congela los parámetros originales y entrena solo una corrección ΔW = B·A, producto de dos tablas delgadas. Al par B y A se le llama adaptador: se puede quitar o cambiar.
- Bajo rango Propiedad de una tabla (matriz) que se escribe como suma de pocas piezas «columna × fila». El rango dice cuántas piezas hacen falta; una tabla de bajo rango se describe con muchos menos números que filas × columnas.
- Olvido catastrófico Pérdida de habilidades previas cuando un modelo sigue entrenándose con datos de un solo tipo: los mismos parámetros sirven a todo, y moverlos por lo nuevo desacomoda lo viejo.
- Modelo base Modelo de lenguaje que solo pasó por el preentrenamiento: sabe continuar textos, pero no está ajustado para seguir instrucciones ni conversar como un asistente.
- Preentrenamiento Primera etapa del entrenamiento de un modelo de lenguaje: con un corpus enorme, el modelo adivina la siguiente pieza del texto una y otra vez y ajusta sus parámetros para bajar el error. El resultado es un modelo base.
- Parámetro Cada uno de los números que un modelo ajusta al entrenarse y en los que guarda lo aprendido.
- Retropropagación Algoritmo que calcula el gradiente de la pérdida respecto de todos los pesos de una red en un solo recorrido hacia atrás, aplicando la regla de la cadena capa por capa. Calcula las culpas; no mueve los pesos (en el artículo de 1986, el nombre abarcaba todo el procedimiento de aprendizaje).
- Descenso del gradiente Método que ajusta los pesos paso a paso, siempre en contra de la pendiente del error (el gradiente), hasta llegar a un fondo.
- Adam Optimizador que combina el momento con un tamaño de paso propio para cada peso, calculado con promedios móviles del gradiente y de su cuadrado (Kingma y Ba, 2015).
- Cuantización Guardar los parámetros de un modelo ya entrenado con menos bits (8 o 4 en lugar de 16), redondeando cada uno a la marca más cercana de una escala propia de su grupo. Reduce la memoria y el tiempo de lectura, con una pérdida de calidad que hay que medir.
- Prompt (instrucción) El texto con el que se le pide algo a un modelo generativo; en un generador de imágenes, la descripción de la imagen que se quiere.
- RAG (generación aumentada por recuperación) Técnica que, antes de generar, busca en una colección de documentos los fragmentos que más se parecen a la pregunta y los incluye en el prompt, de modo que el modelo responde con esas fuentes sin reentrenarse.
- Conjunto de validación Datos que el modelo no usa para ajustarse y que sirven para elegir entre modelos o hiperparámetros.
Transcripción completa
Fuentes
- Hu, E. J., Shen, Y., Wallis, P., Allen-Zhu, Z., Li, Y., Wang, S., Wang, L., Chen, W. (2021). LoRA: Low-Rank Adaptation of Large Language Models
- Dettmers, T., Pagnoni, A., Holtzman, A., Zettlemoyer, L. (2023). QLoRA: Efficient Finetuning of Quantized LLMs
- Zhou, C., Liu, P., Xu, P., Iyer, S., Sun, J., Mao, Y., Ma, X., Efrat, A., Yu, P., Yu, L., Zhang, S., Ghosh, G., Lewis, M., Zettlemoyer, L., Levy, O. (2023). LIMA: Less Is More for Alignment
- Touvron, H., Lavril, T., Izacard, G., Martinet, X., Lachaux, M.-A., Lacroix, T., Rozière, B., Goyal, N., Hambro, E., Azhar, F., Rodriguez, A., Joulin, A., Grave, E., Lample, G. (2023). LLaMA: Open and Efficient Foundation Language Models
- McCloskey, M., Cohen, N. J. (1989). Catastrophic Interference in Connectionist Networks: The Sequential Learning Problem (Psychology of Learning and Motivation 24, 109–165)
- Biderman, D., Portes, J., Gonzalez Ortiz, J. J., Paul, M., Greengard, P., Jennings, C., King, D., Havens, S., Chiley, V., Frankle, J., Blakeney, C., Cunningham, J. P. (2024). LoRA Learns Less and Forgets Less
- Ovadia, O., Brief, M., Mishaeli, M., Elisha, O. (2023). Fine-Tuning or Retrieval? Comparing Knowledge Injection in LLMs
- Gekhman, Z., Yona, G., Aharoni, R., Eyal, M., Feder, A., Reichart, R., Herzig, J. (2024). Does Fine-Tuning LLMs on New Knowledge Encourage Hallucinations?
- Brown, T. B. et al. (2020). Language Models are Few-Shot Learners
- Rajbhandari, S., Rasley, J., Ruwase, O., He, Y. (2019). ZeRO: Memory Optimizations Toward Training Trillion Parameter Models
- Aghajanyan, A., Zettlemoyer, L., Gupta, S. (2020). Intrinsic Dimensionality Explains the Effectiveness of Language Model Fine-Tuning
- Eckart, C., Young, G. (1936). The approximation of one matrix by another of lower rank (Psychometrika 1, 211–218)
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