Skip to content

English · Español

Lab 02 — Ajuste fino con LoRA sobre verbos irregulares

🇪🇸 Esta es la práctica central de la fase. Especializar MiniGPT en conjugar 8 verbos irregulares (be, have, do, go, come, see, eat, write) sin romper los 12 regulares. Tres entregables: (i) gana ≥ 10pp en accuracy de conjugación irregular; (ii) PPL de control sobre verbos regulares no crece > 5%; (iii) barrido de rank r ∈ {2,4,8,16,32} mostrando codo.

Anclas: theory/01-sft-and-forgetting.md, src/minituner/BLUEPRINT.md, lab 00 (LoRALinear funcionando).


Qué produces

Tres experimentos + análisis:

  • experiments/28-lora-finetune/ — una sola corrida de entrenamiento en r=8, evaluación completa del DoD.
  • experiments/28-lora-ablate-rank/ — barrido de rank sobre r ∈ {2, 4, 8, 16, 32}.
  • Un REPORT.md resumiendo ambos, con gráficas.

Prerrequisito

  • Lab 00 completo: src/minituner/lora.py funcionando, tests/test_minituner.py en verde.
  • src/minituner/train.py (el bucle de entrenamiento) implementado según BLUEPRINT.
  • src/minituner/data.py construye el split de entrenamiento de verbos irregulares y el split de control de verbos regulares.
  • Un checkpoint de MiniGPT entrenado disponible en experiments/17-minigpt-train/best.pt desde la Fase 17.

TODOs (esbozo)

Bloque A — Preparación de datos

  1. Desde data/processed/verb-corpus/ (Fase 12), filtra las frases que contengan uno de los 8 verbos irregulares en past simple o past participle. Objetivo: ~500 ejemplos.
  2. Divide en train (80%) / val (10%) / test (10%).
  3. Construye pares de entrenamiento en el formato definido por el tokenizer de la Fase 13:
  4. Prompt: una frase con hueco, p. ej., He __ to school yesterday.
  5. Target: la conjugación correcta, p. ej., went (más el par en español fue según el default §A2).
  6. Construye un split de control de verbos regulares paralelo filtrado sobre los 12 verbos regulares. Con 50-100 ejemplos basta.
  7. Verifica que no hay solapamiento entre el entrenamiento irregular y el control regular (comparten estructura gramatical pero vocabulario disjunto).

Bloque B — Corrida de entrenamiento en r=8

  1. Carga el checkpoint base de MiniGPT.
  2. wrap_minigpt_with_lora(model, r=8, alpha=16.0). Confirma que el ratio de params entrenables coincide con el cálculo del lab 01.
  3. fine_tune_lora(model, train_loader, val_loader, LoRATrainConfig(...), out_dir=experiments/28-lora-finetune/).
  4. Durante el entrenamiento, registra por paso: train loss, val loss cada 50 pasos, más PPL de control de verbos regulares cada 100 pasos.
  5. Entrena 3 epochs (los números del lab 01 dicen que esto se completa en <30min en CPU).

Bloque C — Evaluación

Las métricas:

  1. Accuracy de la tarea en el split de test reservado de verbos irregulares. Para cada par prompt-target, comprueba que el modelo asigna mayor probabilidad a la conjugación correcta que a la forma incorrecta-regular (went por encima de goed). Reporta accuracy top-1 sobre los ~50 ítems de test reservados.
  2. Drift de PPL de control: drift = (PPL_after - PPL_before) / PPL_before sobre el split de control de verbos regulares. DoD: ≤ 5%.
  3. Pesos base sin cambios: carga los pesos base del pre-entrenamiento desde experiments/17-minigpt-train/best.pt. Compáralos con los pesos base en el modelo ajustado (extráelos vía model.base.weight de cada LoRALinear). Comprueba que max_abs_diff == 0.0 exactamente.
  4. Tamaño del checkpoint del adapter: experiments/28-lora-finetune/adapter_final.pt debería ser < 1% del tamaño del checkpoint base.

Bloque D — Barrido de rank

  1. Para cada r ∈ {2, 4, 8, 16, 32}: re-ejecuta el Bloque B con ese rank, misma semilla, misma config de entrenamiento.
  2. Grafica accuracy de la tarea vs r (eje x en escala logarítmica). Grafica drift de PPL de control vs r. Guarda en experiments/28-lora-ablate-rank/accuracy_vs_rank.png y ..._drift_vs_rank.png.
  3. Identifica el codo: el r más pequeño donde la accuracy se estabiliza. Repórtalo en REPORT.md.

Bloque E — Comprobación de adopción catastrófica (opcional)

Muestrea 20 frases con verbos regulares fuera de ambos splits. Comprueba que el modelo ajustado no inventa formas irregulares (walken, playen). Reporta cualquier fallo.

Restricciones

  • Aplica semilla a cada corrida vía seed_everything.
  • experiments/<exp>/manifest.json obligatorio — incluye versiones, semilla, config, hash del checkpoint del modelo base.
  • Una sola LR (1e-4) en todas las corridas. No barras LR — la Fase 28 no va de LR.
  • Batch size 16, 3 epochs. Ajusta sólo si no cabe en memoria de CPU.
  • CPU está bien. La Fase 28 no requiere GPU.
  • No uses el bucle de entrenamiento de la Fase 17 directamente. Usa src/minituner/train.py — es un setup distinto (base congelada con frozen weights, menor conteo de params).

Condiciones de parada

Has terminado cuando:

  1. Mejora de accuracy de la tarea ≥ 10pp (DoD §6).
  2. Drift de PPL de control ≤ 5% (DoD §6).
  3. Diff de pesos base == 0.0 (asserts en el script de eval).
  4. Checkpoint del adapter < 1% del tamaño base (DoD §6).
  5. Gráfica del barrido de rank commiteada; localización del codo reportada.
  6. REPORT.md relleno con: tablas de (a) accuracy + drift por rank, (b) accuracy de la tarea antes/después en r=8, © predicciones de muestra antes/después en 5 prompts de ejemplo; un párrafo interpretando el barrido de rank.

Trampas (específicas de esta práctica)

  1. El corpus es pequeño (~500 ejemplos irregulares). El sobreajuste (overfitting) es real. Usa dropout en la rama LoRA (default 0.05 según BLUEPRINT).
  2. Formas target correctas e incorrectas en los datos de entrenamiento. El corpus puede contener pares (He goed to school, He went to school) para prompting de corrección. Sé explícito sobre qué lado es target — si entrenas accidentalmente sobre el target equivocado, el modelo regresa.
  3. Fuga del par en español a la métrica de accuracy. Si la cadena target es went / fue y el eval sólo comprueba "¿es went el siguiente token?", vas bien. Pero si comprueba la cadena entera, ten en cuenta la tokenización de la barra/espacio.
  4. PPL de control de verbos regulares medida sobre frases distintas a las de entrenamiento. Verifica que la complejidad gramatical de tu split de control coincide con la del entrenamiento irregular — de lo contrario el drift de PPL puede reflejar diferencias de dificultad, no olvido.
  5. Olvidar la ablación de la escala alpha. A rank muy bajo (r=2), α/r = 16/2 = 8 es grande; la magnitud de la actualización por param es mayor que en r=32. Considera si quieres variar α con r o mantener α=16 fijo (el default de BLUEPRINT y convención estándar). No cambies sin pensar.
  6. requires_grad no congelado de verdad. Si tras el entrenamiento los pesos base han derivado (el test 3 del Bloque C falla), la lógica de freeze en wrap_minigpt_with_lora está bugueada. Vuelve al lab 00.

Cuándo consultar las soluciones

Tras completar los Bloques A-D y escribir REPORT.md. Compara tu interpretación del codo del barrido de rank con la localización esperada en la solución de referencia (alrededor de r=8 para nuestro MiniGPT, según theory 02).

Tiempo estimado

5-8 horas de tiempo de trabajo (excluyendo el wall-clock de entrenamiento, que es ~30min × 5 ajustes de rank ≈ 2.5h CPU).


Siguiente: lab/03-qlora-preview.md.