Clase 06 — Adaptación, alineación y agentes

LoRA con las matrices del apunte, multiplicadas de verdad (incluida la comprobación de que fusionar da exactamente lo mismo); la pérdida DPO sin factores inventados; y un agente ReAct cuyas herramientas se ejecutan realmente.

Un paso de LoRA, a mano — y comprobado
\[ y = W_0 x + \frac{\alpha}{r}(B A) x = \underbrace{\left[W_0 + \frac{\alpha}{r} BA\right]}_{W'} x \]

Con \(d = k = 4\) y \(r = 1\), los números del ejemplo trabajado 6.2.2. \(W_0\) está congelada; solo \(A\) y \(B\) se entrenan (y son editables).

\(W_0\) — congelada (16 pesos)
\(B\) (4×1) — editable
×
\(A\) (1×4) — editable
\(BA\) — rango 1
\(\Delta W = \frac{\alpha}{r}BA\)
\(W' = W_0 + \Delta W\) — fusionada
Por qué cada fila de \(BA\) es múltiplo de \(A\). Eso es tener rango 1: toda la matriz cabe en una sola dirección. LoRA apuesta a que el ajuste útil para una tarea nueva vive en un subespacio de dimensión baja — la misma intuición de compresión que el PCA de la Clase 3, aplicada a los pesos.
Calculadora de parámetros y memoria

Memoria de entrenamiento por componente (escala logarítmica). El ahorro grande no está en los pesos —que hay que tener igual— sino en los gradientes y los estados del optimizador, que en full fine-tuning pesan varias veces el modelo entero.

¿De verdad basta con rango bajo?

Una matriz cualquiera se aproxima por su mejor versión de rango \(r\) (calculada aquí por iteración de potencia con deflación, que es lo que hace una SVD truncada). Sube el rango y mira cuánto error queda: si la matriz tiene estructura, unas pocas direcciones capturan casi todo.

Matriz original (12×12)
Residuo (lo que se pierde)

Valores singulares en orden decreciente: cuánta "energía" aporta cada dirección. Una caída brusca significa que la matriz es esencialmente de rango bajo.

Error relativo
‖M − M_r‖ / ‖M‖
Compresión
144 valores → r·(12+12)
RLHF con PPO
  1. SFT: ajuste supervisado sobre demostraciones.
  2. Reward model: se entrena un modelo escalar \(R(x,y)\) sobre pares de preferencia.
  3. PPO: se optimiza la política contra \(R\), con penalización KL contra el modelo base.
Costo: cuatro modelos en memoria a la vez (política, referencia, reward, crítico) y un bucle de RL notoriamente inestable de afinar.
DPO

Elimina el reward model: la recompensa ya estaba implícita en cuánto se ha movido la política respecto de su referencia.

\[ \mathcal{L}_{\text{DPO}} = -\log \sigma\!\left( \beta \log\frac{\pi_\theta(y_w)}{\pi_{\text{ref}}(y_w)} - \beta \log\frac{\pi_\theta(y_l)}{\pi_{\text{ref}}(y_l)} \right) \]
Recompensa implícita: \(\hat r = \beta \log(\pi_\theta/\pi_{\text{ref}})\) — se calcula con dos modelos que ya teníamos.
Un paso de DPO, con los números del apunte
Pérdida
Peso del gradiente
σ(r̂_l − r̂_w)

Pérdida en función del margen \(\hat r_w - \hat r_l\), para varios \(\beta\). El punto marca dónde estás.

Agente ReAct las herramientas se ejecutan de verdad

El bucle razonamiento → acción → observación. La calculadora evalúa realmente la expresión y la búsqueda consulta una base de datos incluida en la página: las observaciones no están escritas de antemano. Lo que sí está simplificado es el razonamiento — aquí sigue reglas; en un agente real lo genera el LLM.

Herramientas disponibles
El espectro de adaptación
MétodoParámetros entrenadosVRAMLatencia extraCuándo
Prompting / few-shot 0 %Baja (se paga en contexto)0 en pesos Prototipar, tareas puntuales, cero entrenamiento.
LoRA / PEFT < 0.1 %Reducción típica de 3–4×0 si se fusiona Adaptar a un dominio o formato (JSON, SQL, jerga técnica).
Full fine-tuning 100 %Muy alta (~4× los pesos)0 Idioma o dominio realmente nuevo, con muchos datos.
Alineación (DPO/RLHF) 100 % o adaptersModerada (DPO) / muy alta (RLHF)0 Ajustar tono, seguridad y seguimiento de instrucciones.
La regla práctica. Sube por la escalera solo cuando el escalón anterior se quede corto: primero prompting, luego LoRA, y solo entonces plantéate tocar todos los pesos. Cada peldaño multiplica el costo y el riesgo de olvido catastrófico.
Para seguir jugando
  • En la 1, pulsa "B = 0": \(\Delta W\) se anula y \(W' = W_0\) exactamente. Por eso LoRA arranca sin perturbar el modelo — y por eso \(A\) no puede ser también cero.
  • En la 2, elige "ruido puro" y sube el rango: el error casi no baja. La apuesta de LoRA solo funciona si la actualización tiene estructura.
  • En la 3, carga el escenario mal alineado: la pérdida sube a 0.750 y el peso del gradiente pasa de 0.4651 a 0.5275. DPO se concentra solo en lo que aún falla.
  • En la 3, sube \(\beta\) a 0.5: la curva se vuelve mucho más abrupta. \(\beta\) controla cuánto se permite alejarse de la referencia.
  • En la 4, pulsa "romper una herramienta" y vuelve a ejecutar: mira qué hace el agente cuando la observación no es la esperada.