29  Fine-tuning eficiente en parámetros (PEFT)

Dónde estamos. En los Caps. 26-27 afinamos modelos —clasificación, SFT, alineamiento— asumiendo que tocábamos todos los pesos. Pero eso, en un modelo de miles de millones de parámetros, es carísimo: una copia entera por tarea. Este capítulo cierra la Parte IV con el truco que lo cambió todo en la práctica: PEFT —adaptar el modelo tocando una fracción minúscula de pesos—, con LoRA y QLoRA como protagonistas, explicados término a término.

29.1 La idea en una frase

En vez de reentrenar el modelo entero para cada tarea, congelas la base y entrenas un puñado diminuto de parámetros nuevos —obtienes casi la misma calidad por una fracción del coste y un checkpoint de pocos megas—.

29.2 Conceptos clave y su papel en el transformer

Antes de entrar en detalle, definimos los términos de este capítulo y para qué sirve cada uno dentro de un transformer:

  • PEFT. Definición: afinar congelando la base y entrenando solo una fracción minúscula de pesos. En el transformer: evita una copia entera por tarea, baja la memoria de entrenamiento y reduce el olvido.
  • Adapters. Definición: pequeños módulos cuello de botella insertados dentro de cada capa. En el transformer: el precursor que funcionó; pero al ser capas extra añaden latencia en inferencia.
  • LoRA (delta de rango bajo). Definición: aprender \(\Delta W = BA\), el producto de dos matrices flacas de rango \(r\). En el transformer: como la actualización del fine-tuning vive en una dimensión intrínseca baja, basta un delta barato en vez de una matriz densa.
  • Rango \(r\) y escala \(\alpha/r\). Definición: la capacidad del delta y la magnitud con que se suma. En el transformer: el botón calidad/tamaño —súbelo en tareas duras como código o matemáticas—.
  • Fusión (cero latencia). Definición: sumar \(BA\) al peso base tras entrenar (\(W=W_0+\tfrac{\alpha}{r}BA\)). En el transformer: el modelo fusionado tiene la misma forma que el original → ninguna latencia añadida, a diferencia de los adapters.
  • QLoRA. Definición: LoRA sobre una base cuantizada a 4 bits (NF4 + doble cuantización
    • optimizadores paginados). En el transformer: permite afinar un gigante en una sola GPU; los gradientes fluyen a través de los 4 bits hasta los adapters de 16 bits.
  • Soft prompts (prefix / prompt tuning). Definición: vectores de entrada aprendidos (no texto), que no tocan ningún peso. En el transformer: adaptan el modelo de forma ultraligera y brillan a gran escala (un prefijo por tarea).

Con esos términos en la mano, vamos a los detalles.

29.3 El problema: afinar entero sale carísimo

Afinar todos los pesos tiene tres costes que se disparan con el tamaño:

  • Almacenamiento: una copia del modelo completo por cada tarea. Diez tareas = diez modelos de tamaño completo.
  • Memoria de entrenamiento: el optimizador (Adam) guarda dos estados por parámetro (momento y varianza), más los gradientes, más las activaciones. Regla práctica: afinar entero con Adam cuesta ~12-16 bytes por parámetro (pesos + gradientes + estados), frente a ~2 bytes/parámetro de solo los pesos en inferencia.
  • Olvido: tocar todos los pesos arriesga el olvido catastrófico (Cap. 26).

PEFT (parameter-efficient fine-tuning) ataca los tres: congela la base y entrena solo unos pocos parámetros nuevos o seleccionados (Lialin et al. 2023). Como los estados del optimizador solo existen para esa fracción entrenable, la memoria baja muchísimo; y guardas/envías deltas diminutos, no modelos enteros.

29.4 Adapters: el precursor

La primera idea que funcionó bien fueron los adapters (Houlsby et al. 2019): pequeños módulos cuello de botella insertados dentro de cada capa del transformer (uno tras la atención, otro tras la FFN). Su estructura: proyectar hacia abajo a una dimensión pequeña r → no-linealidad → proyectar de vuelta a d, con una conexión residual. Se inicializan cerca de la identidad para no perturbar la red al empezar. Solo entrenan los adapters; la base queda congelada.

Funcionaron muy bien —a 0,4 % del afinado completo en GLUE añadiendo solo ~3,6 % de parámetros por tarea—, pero tienen un defecto clave: son capas extra y secuenciales, así que añaden latencia en cada inferencia. Justo eso es lo que LoRA elimina.

29.5 LoRA: el delta de rango bajo

LoRA (Hu et al. 2022) parte de una observación profunda: la actualización que necesita un modelo para especializarse en una tarea es “simple” —tiene rango bajo—. Se apoya en que el fine-tuning vive en una dimensión intrínseca muy baja (Aghajanyan et al. 2020) (se puede afinar RoBERTa moviendo apenas ~200 parámetros proyectados). Si la actualización es de rango bajo, no hace falta una matriz densa enorme para representarla: basta el producto de dos matrices flacas.

En vez de modificar el peso \(W_0\), LoRA lo congela y aprende un añadido \(\Delta W = BA\):

\[ h = W_0\,x \;+\; \frac{\alpha}{r}\,B\,A\,x \]

Término a término:

  • \(W_0 \in \mathbb{R}^{d\times k}\) = el peso preentrenado, congelado (no recibe gradiente). Sigue haciendo su trabajo intacto.
  • \(A \in \mathbb{R}^{r\times k}\) = la proyección hacia abajo: comprime la entrada a un espacio diminuto de dimensión r. Se inicializa con ruido gaussiano.
  • \(B \in \mathbb{R}^{d\times r}\) = la proyección hacia arriba: expande de vuelta a d. Se inicializa a cero.
  • \(r\) = el rango, el botón clave, con \(r \ll \min(d,k)\) (típico: 4-64). Es la “capacidad” del delta: más r = más expresivo pero más parámetros.
  • \(\alpha\) = un factor de escala; el cociente \(\alpha/r\) regula la magnitud del añadido (permite cambiar r sin retocar el learning rate).

Por qué \(B=0\) al inicio importa: con \(B=0\), el añadido \(BA=0\), así que el modelo arranca exactamente en el preentrenado —sin perturbación, entrenamiento estable—. A partir de ahí, solo \(A\) y \(B\) aprenden; \(W_0\) ni se toca.

Su función: \(BA\) es un delta especializado y barato. En GPT-3 (175 000 M), LoRA redujo los parámetros entrenables ~10 000× y la memoria de GPU ~, igualando o superando la calidad del afinado completo.

Tip✓ La ventaja decisiva sobre adapters: cero latencia

Tras entrenar, el delta se puede fusionar en el peso base: \(W = W_0 + \frac{\alpha}{r}BA\). El modelo resultante tiene exactamente la misma forma que el original → ninguna latencia añadida en inferencia. Y se puede des-fusionar para cambiar de adapter. (Los adapters, al ser capas extra, no permiten esto.) En la práctica LoRA se aplica sobre todo a las proyecciones de atención (Q, V), a veces a las cuatro (Q,K,V,O) y a la FFN.

🧩 Analogía — notas adhesivas en un libro de texto. En vez de reescribir el libro entero por cada asignatura (afinado completo), pegas unas pocas notas adhesivas finas (el delta \(BA\), de rango bajo) que puedes añadir o quitar a voluntad. El libro original (\(W_0\)) queda intacto, y guardar “la asignatura” es guardar solo las notas.

29.6 QLoRA: afinar un gigante en una sola GPU

LoRA ya ahorra los estados del optimizador, pero el modelo base sigue ocupando memoria (hay que tenerlo cargado para el forward). QLoRA (Dettmers et al. 2023) ataca eso: entrena adapters LoRA encima de un modelo base cuantizado a 4 bits. Tres piezas:

  1. NF4 (4-bit NormalFloat): un tipo de dato de cuantización óptimo en teoría de la información para pesos con distribución normal —y los pesos preentrenados lo son—.
  2. Doble cuantización: cuantizar también las constantes de cuantización, exprimiendo más memoria.
  3. Optimizadores paginados: usan la memoria unificada de la GPU para absorber los picos de memoria del gradient checkpointing (evitan el OOM).

La idea fina: los gradientes se retropropagan a través de los pesos congelados de 4 bits hasta los adapters LoRA de 16 bits. La base de 4 bits nunca se actualiza; solo se usa para calcular. El resultado fue espectacular: afinar un modelo de 65 000 M en una sola GPU de 48 GB preservando la calidad del afinado de 16 bits.

Nota🧠 Curiosidad — el 99,3 % de ChatGPT en 24 horas, en una GPU

Con QLoRA, la familia Guanaco alcanzó el 99,3 % del nivel de ChatGPT en el benchmark Vicuna entrenando 24 horas en una sola GPU. Democratizó el fine-tuning de modelos grandes: lo que antes exigía un clúster, de pronto cabía en una tarjeta de consumo.

🧩 Analogía — comprimir el libro y escribir con tinta buena. QLoRA comprime el libro a 4 bits para que quepa en tu escritorio, y luego escribe las notas adhesivas en tinta de precisión completa (los adapters de 16 bits sobre la base de 4 bits).

29.7 Soft prompts: prefix y prompt tuning

Una familia distinta no toca ningún peso: aprende vectores de entrada.

  • Prefix tuning (Li y Liang 2021): antepone vectores continuos entrenables (“tokens virtuales”) a las claves y valores en cada capa; la base queda congelada y los tokens reales “atienden” a ese prefijo como si fuera contexto. ~0,1 % de parámetros.
  • Prompt tuning (Lester et al. 2021): aún más simple —vectores de soft-prompt entrenables solo en la entrada—. Su hallazgo clave: se vuelve competitivo con el afinado completo a medida que crece la escala del modelo (lo iguala hacia ~10 000 M de parámetros). P-tuning v2 (Liu et al. 2021) reintroduce prompts en todas las capas para que funcione también en modelos pequeños.

(Matiz importante: estos soft prompts* son vectores continuos aprendidos, que no corresponden a ningún token real. No confundir con los hard prompts —texto discreto que escribes a mano—, que veremos en el Cap. 30.)*

29.8 Cuándo usar cada uno

  • LoRA / QLoRA = el estándar de hoy. Calidad ≈ afinado completo, fusionables (cero latencia), checkpoints diminutos, y permiten intercambiar adapters por tarea sobre una sola base cargada —el patrón “una base + muchos adapters pequeños”, clave para servir muchas tareas a la vez—.
  • Adapters: históricos; superados por LoRA sobre todo por la latencia.
  • Prompt / prefix tuning: ultraligeros; brillan a gran escala y para servir muchísimas tareas (un prefijo por tarea, baratísimo de guardar).
Advertencia⚠ Honesto — LoRA no siempre iguala al afinado completo

Un estudio cuidadoso, LoRA Learns Less and Forgets Less (Biderman et al. 2024), matiza el optimismo: en tareas duras como código y matemáticas, LoRA (a rango bajo estándar) rinde por debajo del afinado completo —que aprende perturbaciones de rango 10-100× mayor—. Pero LoRA olvida menos (preserva mejor capacidades fuera de dominio). Lecciones: (1) el rango \(r\) es un botón calidad/tamaño —súbelo en tareas exigentes—; (2) hay un trade-off aprender-vs-olvidar. Refinamientos de 2024 como DoRA (Liu et al. 2024) (descompone el peso en magnitud y dirección) cierran parte de esa brecha.

Nota🧪 Pruébalo — tafagent

tafagent perfila un modelo con LoRA ya fusionado (\(W_0 + BA\)): como el delta es de rango bajo y se suma al peso base, verás que el perfil de atención a lo largo de la distancia (γ, régimen; Cap. 15-20) apenas se mueve respecto a la base —coherente con que la adaptación es una capa fina, no una reescritura—. Útil para confirmar que tu fine-tuning no rompió el comportamiento de largo alcance del modelo.

Y el modo 🔌 Adapter Reality actúa antes de fusionar: pegas el adapter_config.json de un adapter publicado y, solo desde la config (sin inferencia), comprueba (a) la compatibilidad con tu base —match, target_modules, escala \(\alpha/r\), resize de embeddings— y (b) la evidencia de forgetting para su rango, según la literatura —incluido LoRA Learns Less and Forgets Less (Biderman et al. 2024)—, mostrada como un rango Δ (puntos porcentuales) con sus fuentes, nunca un número inventado por adapter.

29.9 Resumen

  • Por qué PEFT: afinar entero = una copia por tarea + ~12-16 bytes/parámetro en memoria + riesgo de olvido. PEFT congela la base y entrena una fracción minúscula.
  • Adapters (Houlsby et al. 2019): módulos cuello de botella dentro de cada capa (0,4 % del full FT, +3,6 % params) — pero añaden latencia.
  • LoRA (Hu et al. 2022): delta de rango bajo \(\Delta W=BA\) (con \(B=0\) al inicio); ~10 000× menos params en GPT-3, fusionable → cero latencia. Motivado por la dimensión intrínseca baja del fine-tuning.
  • QLoRA (Dettmers et al. 2023): LoRA sobre base cuantizada a 4 bits (NF4 + doble cuantización + optimizadores paginados) → 65B en una GPU de 48 GB; los gradientes fluyen a través de los 4 bits hasta los adapters de 16 bits.
  • Soft prompts: prefix tuning (K/V por capa) y prompt tuning (solo entrada, competitivo a gran escala) — vectores aprendidos, no texto.
  • Hoy: LoRA/QLoRA es el default (fusionable, checkpoints pequeños, hot-swap por tarea). Honesto: LoRA puede quedarse corto en tareas duras (rango bajo), aunque olvida menos.

Siguiente (Parte V): con el modelo entrenado, adaptado y alineado, pasamos a usarlo: generación en profundidad, prompting e in-context learning, RAG, agentes y multimodal.

29.10 Ejercicios

  1. El ahorro. ¿Por qué PEFT reduce tanto la memoria de entrenamiento? (Pista: ¿para cuántos parámetros existen los estados del optimizador?)
  2. LoRA término a término. En \(h=W_0x+\frac{\alpha}{r}BAx\), ¿qué es \(W_0\), qué hacen \(A\) y \(B\), y por qué \(B\) se inicializa a cero?
  3. Cero latencia. Explica por qué LoRA no añade latencia en inferencia y un adapter sí.
  4. QLoRA. ¿Qué se cuantiza a 4 bits y qué se entrena en 16 bits? ¿Por qué la base de 4 bits “nunca se actualiza”?
  5. Honestidad. Según LoRA Learns Less and Forgets Less, ¿en qué tipo de tareas se queda corto LoRA y qué hace, en cambio, mejor que el afinado completo?

Referencias

Aghajanyan, Armen, Luke Zettlemoyer, y Sonal Gupta. 2020. Intrinsic Dimensionality Explains the Effectiveness of Language Model Fine-Tuning. https://arxiv.org/abs/2012.13255.
Biderman, Dan, Jacob Portes, Jose Javier Gonzalez Ortiz, et al. 2024. LoRA Learns Less and Forgets Less. https://arxiv.org/abs/2405.09673.
Dettmers, Tim, Artidoro Pagnoni, Ari Holtzman, y Luke Zettlemoyer. 2023. «QLoRA: Efficient Finetuning of Quantized LLMs». NeurIPS. https://arxiv.org/abs/2305.14314.
Houlsby, Neil, Andrei Giurgiu, Stanisław Jastrzębski, et al. 2019. «Parameter-Efficient Transfer Learning for NLP». ICML. https://arxiv.org/abs/1902.00751.
Hu, Edward J., Yelong Shen, Phillip Wallis, et al. 2022. «LoRA: Low-Rank Adaptation of Large Language Models». ICLR. https://arxiv.org/abs/2106.09685.
Lester, Brian, Rami Al-Rfou, y Noah Constant. 2021. «The Power of Scale for Parameter-Efficient Prompt Tuning». EMNLP. https://arxiv.org/abs/2104.08691.
Li, Xiang Lisa, y Percy Liang. 2021. «Prefix-Tuning: Optimizing Continuous Prompts for Generation». ACL. https://arxiv.org/abs/2101.00190.
Lialin, Vladislav, Vijeta Deshpande, y Anna Rumshisky. 2023. Scaling Down to Scale Up: A Guide to Parameter-Efficient Fine-Tuning. https://arxiv.org/abs/2303.15647.
Liu, Shih-Yang, Chien-Yi Wang, Hongxu Yin, et al. 2024. DoRA: Weight-Decomposed Low-Rank Adaptation. https://arxiv.org/abs/2402.09353.
Liu, Xiao, Kaixuan Ji, Yicheng Fu, et al. 2021. P-Tuning v2: Prompt Tuning Can Be Comparable to Fine-tuning Universally Across Scales and Tasks. https://arxiv.org/abs/2110.07602.