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 rankr ∈ {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 enr=8, evaluación completa del DoD.experiments/28-lora-ablate-rank/— barrido de rank sobrer ∈ {2, 4, 8, 16, 32}.- Un REPORT.md resumiendo ambos, con gráficas.
Prerrequisito¶
- Lab 00 completo:
src/minituner/lora.pyfuncionando,tests/test_minituner.pyen verde. src/minituner/train.py(el bucle de entrenamiento) implementado según BLUEPRINT.src/minituner/data.pyconstruye 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.ptdesde la Fase 17.
TODOs (esbozo)¶
Bloque A — Preparación de datos¶
- 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. - Divide en train (80%) / val (10%) / test (10%).
- Construye pares de entrenamiento en el formato definido por el tokenizer de la Fase 13:
- Prompt: una frase con hueco, p. ej.,
He __ to school yesterday. - Target: la conjugación correcta, p. ej.,
went(más el par en españolfuesegún el default §A2). - Construye un split de control de verbos regulares paralelo filtrado sobre los 12 verbos regulares. Con 50-100 ejemplos basta.
- 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¶
- Carga el checkpoint base de MiniGPT.
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.fine_tune_lora(model, train_loader, val_loader, LoRATrainConfig(...), out_dir=experiments/28-lora-finetune/).- Durante el entrenamiento, registra por paso: train loss, val loss cada 50 pasos, más PPL de control de verbos regulares cada 100 pasos.
- 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:
- 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 (
wentpor encima degoed). Reporta accuracy top-1 sobre los ~50 ítems de test reservados. - Drift de PPL de control:
drift = (PPL_after - PPL_before) / PPL_beforesobre el split de control de verbos regulares. DoD: ≤ 5%. - 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íamodel.base.weightde cadaLoRALinear). Comprueba quemax_abs_diff == 0.0exactamente. - Tamaño del checkpoint del adapter:
experiments/28-lora-finetune/adapter_final.ptdebería ser < 1% del tamaño del checkpoint base.
Bloque D — Barrido de rank¶
- Para cada
r ∈ {2, 4, 8, 16, 32}: re-ejecuta el Bloque B con ese rank, misma semilla, misma config de entrenamiento. - Grafica accuracy de la tarea vs
r(eje x en escala logarítmica). Grafica drift de PPL de control vsr. Guarda enexperiments/28-lora-ablate-rank/accuracy_vs_rank.pngy..._drift_vs_rank.png. - Identifica el codo: el
rmá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.jsonobligatorio — 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:
- Mejora de accuracy de la tarea ≥ 10pp (DoD §6).
- Drift de PPL de control ≤ 5% (DoD §6).
- Diff de pesos base == 0.0 (asserts en el script de eval).
- Checkpoint del adapter < 1% del tamaño base (DoD §6).
- Gráfica del barrido de rank commiteada; localización del codo reportada.
- 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)¶
- 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).
- 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. - Fuga del par en español a la métrica de accuracy. Si la cadena target es
went / fuey el eval sólo comprueba "¿eswentel siguiente token?", vas bien. Pero si comprueba la cadena entera, ten en cuenta la tokenización de la barra/espacio. - 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.
- Olvidar la ablación de la escala alpha. A rank muy bajo (
r=2),α/r = 16/2 = 8es grande; la magnitud de la actualización por param es mayor que enr=32. Considera si quieres variarαconro mantenerα=16fijo (el default de BLUEPRINT y convención estándar). No cambies sin pensar. requires_gradno congelado de verdad. Si tras el entrenamiento los pesos base han derivado (el test 3 del Bloque C falla), la lógica de freeze enwrap_minigpt_with_loraestá 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.