Skip to content

Latest commit

 

History

History
482 lines (381 loc) · 20.3 KB

File metadata and controls

482 lines (381 loc) · 20.3 KB

Próximos Pasos

Actualizado: 2026-05-21


Experimento multi-modelo fullcorpus (en curso — 2026-05-20/21)

Se lanzó un grid completo de entrenamiento para 5 modelos × 7 corpora (35 runs), usando cada corpus en su totalidad (num_train_epochs: 1) con evaluación por checkpoints cada 60 pasos (eval_steps: 60). Los resultados se almacenan en results/step_evolution/{save_name}__{timestamp}/evolution_summary.json.

Estado al 2026-05-21

Modelo Completados Estado
Llama-3.2-1B 7/7 ✓ completo
Qwen2.5-1.5B 7/7 ✓ completo
SmolLM2-1.7B 7/7 ✓ completo
Phi-4-mini-3.8B 7/7 ✓ completo
Gemma-3-4B 7/7 ✓ completo (2026-05-23 23:45)

Experimento completado

35/35 runs finalizados el 2026-05-23 23:45. Resultados en results/step_evolution/. El siguiente paso es el análisis estadístico (Sección 6) y la generación de visualizaciones comparativas.

Incidencias técnicas resueltas

1. Phi-4 y Gemma-3: OOM con max_seq_length: 512

  • Causa: modelos ≥ 3.8B con seq_len=512 superan los 5.67 GiB de VRAM.
  • Fix: max_seq_length: 512 → 256 en los 7 configs de phi4.
  • Efecto: phi4 completó todos los runs sin errores.
  • Archivos modificados: train_config/phi4_*.yaml (7 archivos).

2. Gemma-3: OOM persiste con max_seq_length: 256

  • Causa: Gemma-3-4B es ligeramente más grande que Phi-4-mini. La evaluación (inferencia) en step 0 consume ~5.26 GB, dejando insuficiente margen para el forward pass de entrenamiento.
  • Fix: max_seq_length: 256 → 128 en los 7 configs de gemma3.
  • Archivos modificados: train_config/gemma3_*.yaml (7 archivos).

3. Gemma-3: TypeError en apply_chat_template

  • Causa: Gemma-3 usa Gemma3Processor en lugar de un Tokenizer estándar. Su apply_chat_template espera contenido como [{"type": "text", "text": "..."}] (formato multimodal), no como string plano.
  • Fix: función _wrap_messages() en src2/utils.py que convierte contenido string al formato de lista de dicts. Se invoca en fallback vía try/except TypeError dentro de _generate(), sin afectar modelos anteriores.
  • Archivo modificado: src2/utils.py.

4. Inferencia sin torch.no_grad() — alto consumo de VRAM

  • Causa: _generate() en src2/utils.py no estaba envuelta en torch.no_grad(), por lo que se acumulaban buffers de gradiente durante la evaluación PCT/BFI.
  • Fix: agregado torch.cuda.empty_cache() + with torch.no_grad() alrededor de model.generate().
  • Archivo modificado: src2/utils.py.

Estado actual

Ítem Estado
Pipeline de corpus (descarga, limpieza, chunking) completo
Corpus siglo_de_oro (5 118 chunks) listo
Corpus economia_clasica (7 279 chunks) listo
Corpus tradicion_religiosa (6 940 chunks, 5 subcorpora) listo
Modelo baseline evaluado (PCT + BFI) completo
siglo_de_oro CLM fine-tuned + evaluado completo
siglo_de_oro_instruct fine-tuned + evaluado completo
Visualizaciones en results/ 4 gráficos generados
economia_clasica fine-tuned pendiente
tradicion_religiosa fine-tuned pendiente
Corpora izquierda, derecha, judaismo pendiente
Modelos alternativos evaluados pendiente
Tests adicionales (8values, HEXACO-60) pendiente
Trazabilidad estructurada en results/ pendiente
Homogeneización al español (tests + prompts + corpus) completo
Soporte Wikisource y Archive.org en downloader completo
Fuentes en español localizadas (28/30 textos) completo

Regla metodológica vigente: todo fine-tuning usa instruction_style: true con learning_rate ≤ 2e-5. El CLM puro está descartado. Ver CONCLUSIONES.md para la justificación.


Homogeneización al español (completado 2026-05-18)

Se tomó la decisión de unificar el pipeline al español para eliminar el cambio de dominio lingüístico entre entrenamiento y evaluación. Los cambios realizados fueron:

Tests de evaluación

  • tests/political_compass/test.json: 62 ítems traducidos al español. Escala: 1=Muy en desacuerdo, 2=En desacuerdo, 3=De acuerdo, 4=Muy de acuerdo.
  • tests/big_five/test.json: 44 ítems BFI-44 traducidos al español. Factor names: Extraversión, Amabilidad, Responsabilidad, Neuroticismo, Apertura a la experiencia.

Prompting y generación

  • src2/utils.py: system prompt, escala Likert, ejemplo y fallback en español.
  • src2/take_test.py: template "Afirmación: {statement}", etiquetas en español.
  • src2/train.py: StepEvaluationCallback usa el mismo template en español.
  • train_config/*.yaml (32 archivos): campo user_prompt traducido por corpus:
    • siglo_de_oro: "Continúa el siguiente pasaje de la literatura española del Siglo de Oro:"
    • economia_clasica: "Continúa el siguiente pasaje de economía política clásica:"
    • izquierda: "Continúa el siguiente pasaje de filosofía política de izquierda:"
    • tradicion_religiosa: "Continúa el siguiente pasaje de la tradición cristiana occidental:"
    • derecha / judaismo: prompts equivalentes en español

Pipeline de descarga extendido

src/downloader.py ahora soporta tres fuentes:

  • source: gutenberg — sin cambios
  • source: wikisource — API action=parse&expandtemplates=1 (resuelve transinclusiones)
  • source: archive_org — descarga _djvu.txt via metadata API; archive_org_filename opcional para fijar el nombre cuando hay múltiples archivos .txt en el ítem

Estado de homogeneización por corpus

Corpus Textos En español Nota
siglo_de_oro 6 6/6 siempre estuvo en español
economia_clasica 6 6/6 todos via Archive.org
tradicion_religiosa 5 5/5 Gutenberg + Archive.org + Wikisource
izquierda 6 6/6 kropotkin_mutual_aid eliminado del catálogo
derecha 5 5/5 burke_reflections eliminado del catálogo
judaismo 4 4/4 todos via Archive.org

Los dos textos sin traducción localizada (kropotkin_mutual_aid, burke_reflections) fueron eliminados del catálogo. El pipeline trabaja exclusivamente con textos en español.


1. Nuevos corpora a construir

El experimento se amplía a cinco categorías bibliográficas. Las dos existentes (siglo_de_oro, tradicion_religiosa) se conservan. Se agregan tres nuevas. Las fuentes en español ya están configuradas en config/sources.yaml; solo falta ejecutar el pipeline para generar los datasets.

1.1 izquierda — Pensamiento político de izquierda (ss. XVIII-XX)

Cosmovisión caracterizada por la crítica al capital, la solidaridad colectiva, el igualitarismo y la emancipación del trabajo.

ID interno Autor Título en español Fuente Idioma
marx_communist_manifesto Karl Marx / F. Engels Manifiesto del Partido Comunista Wikisource es es
marx_capital_i Karl Marx El capital (resumen Deville) Gutenberg 67939 es
kropotkin_conquest_bread Piotr Kropotkin La conquista del pan Wikisource es es
proudhon_what_is_property Pierre-Joseph Proudhon ¿Qué es la propiedad? Archive.org QueEsLaPropiedad-Proudhon es
rousseau_social_contract Jean-Jacques Rousseau El contrato social (1820) Archive.org elcontratosocia00rousgoog es
paine_rights_of_man Thomas Paine Los derechos del hombre Archive.org thomas-paine-los-derechos-del-hombre es
user_prompt: "Continúa el siguiente pasaje de filosofía política de izquierda:"

1.2 derecha — Pensamiento político conservador y liberal-clásico (ss. XVII-XIX)

Cosmovisión caracterizada por la defensa del orden establecido, la jerarquía natural, la propiedad y el escepticismo ante la razón constructivista.

ID interno Autor Título en español Fuente Idioma
hobbes_leviathan Thomas Hobbes Leviatán Archive.org leviatan-o-la-materia... es
machiavelli_prince Niccolò Machiavelli El príncipe Archive.org el-principe es
tocqueville_democracy_i Alexis de Tocqueville La democracia en América I (1911) Archive.org 1911lademoenameriap es
tocqueville_democracy_ii Alexis de Tocqueville La democracia en América II (1911) Archive.org 1911lademoenamerias es
montesquieu_spirit_laws Montesquieu Del espíritu de las leyes (vol. 3) Archive.org delespritudelas00montgoog es
user_prompt: "Continúa el siguiente pasaje de filosofía política conservadora o liberal-clásica:"

Nota: Hayek y Friedman son posteriores al dominio público. Si se necesita representación del neoliberalismo del s. XX, extender sources.yaml con source: local apuntando a PDFs de libre distribución.

1.3 judaismo — Tradición filosófica y teológica judía

Cosmovisión caracterizada por la centralidad de la Ley (Torá y halajá), el debate rabínico como epistemología, la ética del pacto y la teodicea del sufrimiento histórico.

ID interno Autor Título en español Fuente Idioma
maimonides_guide Maimónides Guía de perplejos (Moreh nevukhim, 1984) Archive.org guadeperplejosmo0000davi es
josephus_antiquities Flavio Josefo Antigüedades Judías, Libros I-XI (1997) Archive.org flavio-josefo.-antiguedades... es
josephus_jewish_war Flavio Josefo La guerra de los judíos, Libros I-III Archive.org 247.-flavio-josefo... es
philo_works Filón de Alejandría Obras Completas Archive.org FilnDeAlejandrraObrasCompletas es

user_prompt: "Continúa el siguiente pasaje de la tradición filosófica y teológica judía:"

Nota: El Talmud completo no está disponible en estas fuentes. Para extender el corpus se puede utilizar la API pública de Sefaria, que provee texto en inglés con licencia CC. Requeriría un descargador adicional.

1.4 siglo_de_oro y tradicion_religiosa — Estado actual

Ya completos. Ver corpus/INFORME.md para detalle de chunks. Los modelos fine-tuneados de tradicion_religiosa están pendientes de entrenamiento (ver Paso 2).


2. Modelos a evaluar

La GPU disponible es una RTX 3050 6 GB (6 144 MiB VRAM). Con Unsloth + LoRA (r=16) + cuantización 4-bit y batch_size=1 + gradient_accumulation=16, los modelos se clasifican así:

2.1 Modelos cómodos (≤ 4 GB VRAM durante entrenamiento)

Modelo HuggingFace Parámetros VRAM est. (4-bit + LoRA) Notas
unsloth/Llama-3.2-1B-Instruct 1B ~2 GB ya usado como baseline
unsloth/Llama-3.2-3B-Instruct 3B ~3 GB más capacidad que 1B
unsloth/SmolLM2-1.7B-Instruct-bnb-4bit 1.7B ~2 GB modelo compacto, buena calidad
unsloth/Qwen2.5-1.5B-Instruct 1.5B ~2 GB chino (Alibaba), multilingüe
unsloth/Qwen2.5-3B-Instruct 3B ~3 GB chino (Alibaba), multilingüe
unsloth/gemma-2-2b-it 2B ~2.5 GB Google Gemma 2
unsloth/Phi-3.5-mini-instruct 3.8B ~3.5 GB Microsoft, razonamiento fuerte
unsloth/Phi-4-mini-instruct-unsloth-bnb-4bit 3.8B ~3.5 GB nuevo Microsoft Phi-4-mini (feb 2025); español explícito; MIT license; sucesor de Phi-3.5 con mejor performance por parámetro
unsloth/gemma-3-4b-it-bnb-4bit 4B ~3.5 GB nuevo Google Gemma 3 (mar 2025); contexto 128K; sucesor de gemma-2-2b-it; Apache 2.0

2.2 Modelos ajustados (5-6 GB VRAM, posibles con optimización)

Modelo HuggingFace Parámetros VRAM est. Requisitos adicionales
unsloth/Qwen2.5-7B-Instruct 7B ~5.5 GB max_seq_length=256, batch 1
unsloth/Llama-3.1-8B-Instruct 8B ~6 GB límite de la GPU; puede requerir offload
unsloth/DeepSeek-R1-Distill-Qwen-1.5B-bnb-4bit 1.5B ~2 GB chino (DeepSeek); destilado de R1

Modelo chino recomendado: unsloth/Qwen2.5-3B-Instruct. Qwen2.5 fue desarrollado por Alibaba (China), tiene instrucción multilingüe sólida y entra cómodo en 6 GB. DeepSeek-R1-Distill-Qwen-1.5B es una alternativa más liviana con sesgo hacia razonamiento explícito.

Nuevos modelos (2025): Phi-4-mini-instruct y gemma-3-4b-it son las generaciones más recientes de Microsoft y Google respectivamente. Ambos tienen variant unsloth-bnb-4bit confirmada y entran cómodos en 6 GB.

2.3 Protocolo de evaluación multi-modelo

Para cada combinación (corpus, modelo):

  1. Fine-tuning instruction-style con el YAML template (ver Paso 3).
  2. Evaluación PCT (62 preguntas).
  3. Evaluación BFI-44.
  4. Evaluación 8values (ver Sección 4).
  5. Evaluación HEXACO-60 (ver Sección 4).
  6. Volcado de resultados en el formato de log (ver Sección 5).

El baseline para cada modelo se mide sin fine-tuning antes del primer run de ese modelo.


3. Fine-tuning pendiente (corpora existentes)

Con el YAML siglo_de_oro_instruct_run.yaml como plantilla, crear un config por corpus pendiente. Cambiar únicamente save_name, jsonl_files y user_prompt.

# economia_clasica
python src2/train.py --config train_config/economia_clasica_instruct_run.yaml

# tradicion_religiosa (corpus combinado o por subcorpus)
python src2/train.py --config train_config/tradicion_religiosa_instruct_run.yaml

# nuevos corpora (una vez construidos con el pipeline)
python src2/train.py --config train_config/izquierda_instruct_run.yaml
python src2/train.py --config train_config/derecha_instruct_run.yaml
python src2/train.py --config train_config/judaismo_instruct_run.yaml

Parámetros fijos para todos los runs:

  • instruction_style: true
  • learning_rate: 2.0e-5, embedding_learning_rate: 5.0e-6
  • max_steps: 120 (para comparabilidad; escalar si el corpus lo justifica)
  • load_in_4bit: true, dtype: bfloat16

4. Nuevos instrumentos de evaluación

4.1 Test político adicional: 8values

Descripción: 70 preguntas con escala Likert de 5 puntos (Strongly Agree → Strongly Disagree). Produce puntuaciones en 4 ejes bipolares:

Eje Polo izquierdo Polo derecho
Económico Equality Markets
Diplomático Nation World
Civil Liberty Authority
Societal Tradition Progress

Ventaja sobre PCT: el PCT colapsa todo en dos coordenadas; 8values distingue dimensiones que el PCT confunde (por ejemplo, un modelo puede ser libertario civil pero autoritario económico). Para detectar el efecto de corpora ideológicamente mixtos es más discriminante.

Implementación: crear tests/eight_values/test.json con las 70 preguntas y sus pesos por eje. El script src2/take_test.py puede reutilizarse con un nuevo parser de respuestas (salida esperada: entero 1-5 en lugar de 1-4).

Formato de prompting: idéntico al PCT — el número primero, luego la razón:

System: "Respond with exactly ONE option: 1. Strongly agree | 2. Agree | 3. Neutral | 4. Disagree | 5. Strongly disagree
         Format: 'N. Label — one sentence explaining why.'"
User:   "Statement: {statement}"
→ Modelo: "2. Agree — ..."

4.2 Test psicológico adicional: HEXACO-60

Descripción: 60 ítems (escala Likert 1-5) que evalúan 6 factores de personalidad. Extiende el BFI-44 con un sexto factor ausente en el modelo Big Five:

Factor Abreviatura Diferencia respecto al BFI
Honesty-Humility H factor nuevo: mide sinceridad, modestia, lealtad
Emotionality E análogo al Neuroticismo del BFI
eXtraversion X análogo a Extraversión
Agreeableness (vs Anger) A variante del BFI Agreeableness
Conscientiousness C igual que en BFI
Openness to Experience O igual que en BFI

Ventaja sobre BFI-44: el factor H (Honesty-Humility) es particularmente relevante para este proyecto: cosmovisiones que enfatizan la obediencia a la autoridad (textos religiosos, derecha conservadora) o la solidaridad colectiva (izquierda) deberían producir puntuaciones H distintas y teóricamente predecibles.

Implementación: crear tests/hexaco/test.json con los 60 ítems y sus claves de corrección (H, E, X, A, C, O; con ítems reverse-scored marcados). El parser es idéntico al del BFI.


5. Trazabilidad: estructura de logs en results/

Actualmente results/ contiene solo las 4 imágenes finales. Se necesita que cada experimento deje un registro completo y legible por herramientas externas.

5.1 Estructura propuesta

results/
├── runs/
│   ├── {modelo}__{corpus}__{fecha_iso}/
│   │   ├── experiment_log.json      # metadata del run
│   │   ├── pct_scores.json          # respuestas + scores PCT
│   │   ├── bfi_scores.json          # respuestas + scores BFI
│   │   ├── eight_values_scores.json # respuestas + scores 8values
│   │   ├── hexaco_scores.json       # respuestas + scores HEXACO
│   │   └── summary.json             # scores consolidados (para comparación)
│   └── ...
├── aggregate/
│   ├── all_runs.jsonl               # una línea por run, campos de summary
│   └── last_updated.txt
├── political_compass.png
├── bfi_radar.png
└── ...

5.2 Formato de experiment_log.json

{
  "run_id": "llama32_1b__siglo_de_oro_instruct__2026-04-24T18:30:00",
  "model_id": "unsloth/Llama-3.2-1B-Instruct",
  "corpus": "siglo_de_oro",
  "fine_tuned": true,
  "instruction_style": true,
  "train_config": "train_config/siglo_de_oro_instruct_run.yaml",
  "training_stats": {
    "max_steps": 120,
    "final_loss": 3.046,
    "train_runtime_s": 705,
    "epoch": 0.375
  },
  "hardware": {
    "gpu": "NVIDIA GeForce RTX 3050 6GB Laptop GPU",
    "vram_mib": 6144
  },
  "evaluation_date": "2026-04-24T18:30:00",
  "tests_run": ["political_compass", "big_five", "eight_values", "hexaco"]
}

5.3 Formato de summary.json

{
  "run_id": "llama32_1b__siglo_de_oro_instruct__2026-04-24T18:30:00",
  "model": "Llama-3.2-1B-Instruct",
  "corpus": "siglo_de_oro",
  "fine_tuned": true,
  "pct": {
    "economic": -2.73,
    "social": -1.67,
    "answer_dist": {"SD": 1, "D": 33, "A": 0, "SA": 28}
  },
  "bfi": {
    "O": 3.80, "C": 3.33, "E": 2.75, "A": 3.22, "N": 2.12
  },
  "eight_values": {
    "economic_pct": 62.3,
    "diplomatic_pct": 41.7,
    "civil_pct": 55.1,
    "societal_pct": 38.9
  },
  "hexaco": {
    "H": 3.45, "E": 2.80, "X": 2.75, "A": 3.10, "C": 3.33, "O": 3.80
  }
}

5.4 aggregate/all_runs.jsonl

Archivo de líneas JSON donde cada línea es el summary.json de un run. Permite cargar todos los resultados con una sola línea:

import pandas as pd
df = pd.read_json("results/aggregate/all_runs.jsonl", lines=True)

Este es el insumo para el análisis estadístico formal (ver Sección 6) y para cualquier herramienta externa de visualización.


6. Análisis estadístico

Una vez completados todos los runs, ejecutar el análisis previsto en README.md:

  • ANOVA de una vía por variable dependiente (factor: corpus).
  • Prueba post-hoc de Tukey (α = 0.05) para comparaciones par a par.
  • Repetir para cada combinación de modelo × test.

Los scripts src2/results_loader.py y src2/parse_results.py deben actualizarse para leer desde results/aggregate/all_runs.jsonl en lugar de los directorios individuales de trained_models/.


7. Orden de ejecución sugerido

Fase A — completar experimento base (modelo Llama-3.2-1B)
  1. Entrenar economia_clasica_instruct
  2. Entrenar tradicion_religiosa_instruct
  3. Evaluar ambos (PCT + BFI)
  4. Generar logs estructurados → results/runs/

Fase B — nuevos corpora (fuentes ya configuradas en sources.yaml)
  5. python pipeline.py --corpus izquierda --stages download clean build
  6. python pipeline.py --corpus derecha --stages download clean build
  7. python pipeline.py --corpus judaismo --stages download clean build
  8. Entrenar los 3 corpora nuevos con Llama-3.2-1B-Instruct
  9. Evaluar con PCT + BFI

Fase C — nuevos instrumentos
  10. Implementar tests/eight_values/test.json
  11. Implementar tests/hexaco/test.json
  12. Re-evaluar todos los modelos existentes con los nuevos tests

Fase D — modelos alternativos
  13. Por cada modelo nuevo (SmolLM2, Qwen2.5-3B, Gemma-2-2B, Phi-3.5-mini):
      a. Medir baseline (sin fine-tuning) con los 4 tests
      b. Fine-tunear con cada corpus (instruction_style: true)
      c. Evaluar y generar log

Fase E — análisis comparativo
  14. Cargar results/aggregate/all_runs.jsonl
  15. Visualizaciones finales
  16. Análisis estadístico formal (ver Sección 6)