Skip to content

English · Español

02 — Conteo de parámetros: LoRA vs fine-tuning completo

La aritmética es simple pero el resultado importa: un Linear (768, 768) tiene 590K parámetros entrenables en full FT. Con LoRA r=8: 12K. Cuando lo escalas a un transformer entero (cientos de Linears), la ratio se mantiene. Esta sección formaliza esa cuenta.


El planteamiento

Una capa Linear(in, out) estándar tiene:

  • Matriz de pesos W ∈ ℝ^{out × in}: out × in parámetros.
  • Sesgo b ∈ ℝ^{out}: out parámetros. (A menudo omitido en transformers modernos; lo mantenemos por generalidad.)

Total: out × in + out parámetros.

Con LoRA de rango (rank) r:

  • Los W, b base están congelados (freeze) — existen pero no se actualizan.
  • Dos matrices nuevas: A ∈ ℝ^{r × in} y B ∈ ℝ^{out × r}.

Parámetros LoRA entrenables: r × in + out × r = r × (in + out).

La ratio

La ratio de parámetros entrenables (LoRA sobre full):

\[ \text{ratio} = \frac{r(in + out)}{out \cdot in + out} \approx \frac{r(in + out)}{out \cdot in} \quad \text{para } out \gg 1 \]

Para una capa cuadrada in = out = h:

\[ \text{ratio} \approx \frac{2rh}{h^2} = \frac{2r}{h} \]

Para h = 768, r = 8: ratio = 16/768 ≈ 2.1%. Para h = 4096, r = 8: ratio = 16/4096 ≈ 0.4%. Para h = 4096, r = 16: ratio = 0.8%.

Los modelos más grandes se benefician más. A medida que h crece, la ratio de LoRA se encoge proporcionalmente — el rango r no crece con el modelo.

A escala de modelo completo

Calculemos para un transformer genérico:

  • L capas.
  • Por capa: 4 Linears de atención de forma (h, h) + 2 Linears de MLP de forma (h, 4h) y (4h, h).

Params entrenables full FT por capa (excluyendo sesgos, embeddings, layer-norms — todos pequeños):

  • Atención: 4 × h².
  • MLP: 2 × 4h² = 8h².
  • Total por capa: 12 h².

Params LoRA por capa con rango r, asumiendo que LoRA-ificamos los 6 Linears:

  • Atención (4 Linears con in=out=h): 4 × 2rh = 8rh.
  • MLP fc1 (h, 4h): r(h + 4h) = 5rh.
  • MLP fc2 (4h, h): igual, 5rh.
  • Total por capa: 8rh + 10rh = 18 rh.

Ratio por capa: 18rh / 12h² = 1.5 r / h.

Para un transformer típico:

Modelo h L Params totales (~) Params LoRA r=8 (~) LoRA / Full
MiniGPT (Fase 17) 768 12 12 × 12 × 768² = 85 M 12 × 18 × 8 × 768 = 1.3 M 1.6%
LLaMA-7B 4096 32 32 × 12 × 4096² ≈ 6.4 B 32 × 18 × 8 × 4096 ≈ 19 M 0.30%
LLaMA-70B 8192 80 80 × 12 × 8192² ≈ 64 B 80 × 18 × 8 × 8192 ≈ 94 M 0.15%

(Los números son aproximados — ignoran embeddings, sesgos, layer-norm y la estructura exacta de las heads. El orden de magnitud es correcto.)

Para LLaMA-70B, LoRA r=8 entrena el 0.15% de los parámetros. Esta es la ratio que hace tratable el fine-tuning en una sola GPU de modelos gigantes.

Adónde van realmente los params de LoRA

La mayoría de las configuraciones publicadas de LoRA apuntan a un subconjunto de los Linears. El paper original de LoRA puso adaptadores (adapters) sólo en W_q y W_v (las proyecciones de query y value de la atención). Por defecto QLoRA apunta a todos los Linears.

Nosotros por defecto apuntamos a todos los Linears en la Fase 28 — da más capacidad para el mismo rango por Linear, pedagógicamente más limpio (una regla aplica en todos lados).

Lo que esto gana en almacenamiento

Un checkpoint de LoRA es sólo A, B por cada Linear adaptado. Tamaños:

  • Para MiniGPT r=8: ~1.3 M params × 2 bytes (fp16) = 2.6 MiB.
  • Para LLaMA-7B r=8: ~19 M × 2 bytes = 38 MiB.

Frente al checkpoint del modelo base (MiniGPT 85 M × 2 = 170 MiB; LLaMA-7B 7 B × 2 = 14 GiB), los adaptadores LoRA son 1–2 órdenes de magnitud más pequeños.

Esto habilita zoológicos de adaptadores: un único modelo base cargado una vez en memoria de GPU, más decenas de adaptadores ajustados disponibles en disco. Servir distintas "personalidades" o "habilidades" significa intercambiar en caliente un fichero de 38 MiB — no cargar un nuevo modelo de 14 GiB.

Cómo funciona α/r

El forward de LoRA:

\[ y = Wx + b + \frac{\alpha}{r} BAx \]

El escalado α/r desacopla la magnitud de la actualización de la elección de rango. Concretamente: si duplicas r (más capacidad), los valores singulares de BA escalan con r en el régimen de inicialización aleatoria. Dividir por r mantiene la magnitud efectiva de la actualización similar entre elecciones de rango.

α es entonces un único hiperparámetro de "fuerza de actualización", independiente de r. Típico: α = 16.

Si te olvidas del escalado α/r y simplemente usas BA, duplicar r duplica el LR efectivo — experimentos confusos. La convención es universal; síguela.

Inicialización

Inicialización estándar de LoRA:

  • A ~ N(0, 1/r) (o uniforme escalado, depende de la implementación).
  • B = 0 (cero exacto).

Así en el paso 0: BA = 0, e y = Wx + b + 0. El modelo se comporta exactamente como el modelo preentrenado. El primer paso de gradiente desplaza tanto A como B ligeramente; B era cero y se vuelve pequeño; el producto BA se convierte en una pequeña actualización de bajo rango.

¿Por qué no inicializar ambos aleatoriamente? Si tanto A como B empiezan aleatorios con la misma escala, BA es no nulo con una distribución salvaje, y el paso 0 ya saca al modelo de W. Convergencia más lenta, peor perfil de olvido.

¿Por qué B = 0 y no A = 0? Simétrico — cualquiera funciona. La convención es B = 0; la seguimos.

Una trampa: trampas del conteo de parámetros

Cuando reportes "LoRA entrena el 0.7% de los parámetros", ten cuidado: esta es la fracción de parámetros entrenables. La huella total de memoria también incluye el modelo base congelado. Decir "LoRA reduce la memoria en 99.3%" está mal — la mayor parte de la reducción viene de no asignar estado de Adam, gradientes y copias maestras para los pesos congelados, no del conteo entrenable en sí. Theory 03 deriva la huella de memoria con precisión.

Ejercicios de práctica

Soluciones al abrir la fase en solutions/02-parameter-count-ref.md.

  1. Para un Linear (in=4096, out=11008) (forma de MLP fc1 de LLaMA) con LoRA r=16, calcula el conteo de parámetros entrenables y la ratio vs full FT.
  2. Las capas MLP contribuyen 2 × 4h² parámetros por capa; la atención contribuye 4 × h². ¿Cuál es la fracción de params de atención en el presupuesto de LoRA vs params del MLP? ¿Apuntar sólo a atención (LoRA original) da más o menos capacidad que apuntar sólo al MLP?
  3. Si fijas el presupuesto de LoRA en M parámetros entrenables totales, ¿cuál es el rango óptimo para un Linear cuadrado (h, h)? (Pista: está acotado por r ≤ h; para M < h^2, cada elección es válida.)
  4. Muestra que para r = h, LoRA puede en principio representar cualquier actualización ΔW (ya que BA puede ser cualquier matriz (out, in) de rango ≤ h = min(out, in)). ¿En qué sentido LoRA r=h es idéntico a full FT, y en qué sentido sigue siendo distinto?

Recapitulación en un párrafo

LoRA reemplaza los out × in parámetros entrenables de un Linear con dos matrices que totalizan r × (in + out) — típicamente dos órdenes de magnitud menos. La ratio escala como r/h para capas cuadradas, así que los modelos más grandes se benefician más (r fijo, h creciente). A lo largo de un transformer, aplicar LoRA a todos los Linears da una ratio entrenable de ~0.15–2%. La conclusión pedagógica: el rango (rank) r es una única perilla pequeña que acota cuánto cambias el modelo, desacoplada del tamaño del modelo. Combinado con la convención de escalado α/r y la inicialización B=0, LoRA da una perilla limpia y robusta para el presupuesto de parámetros. El siguiente archivo de teoría traduce esto en huella de memoria — el coste prácticamente dominante durante el entrenamiento.

Siguiente: theory/03-memory-footprint.md.