Dominican News QA - pdqa-roberta-bne-sqac-finetuned-augmented
Descripción
Modelo desarrollado para el Dominican News Question Answering Challenge de ICC-344-T. El sistema recibe una pregunta y un contexto noticioso, y extrae una respuesta contenida explicitamente en el contexto.
Este repositorio publica los pesos de un modelo RoBERTa afinado con fine-tuning sobre train
aumentado (Variante B, ver seccion de Experimentos). Usados solos, con pipeline(...), logran
66.67 EM y 87.20 F1 en validation. El repositorio de codigo del proyecto incluye ademas un
pipeline de inferencia (post-procesamiento con spaCy es_core_news_sm y re-ranking hibrido) que
envuelve este
modelo y sube el resultado a 73.33 EM y 90.78 F1, ver la seccion de Resultados para el detalle.
Integrantes
- Isaac Pena, 10154671
- Javier Gondres, 10153671
Recursos oficiales
- Dataset: Lisibonny/pdqa
- Baseline de referencia: Lisibonny/modelo_qa_beto_squad_es_pdqa
- Aplicacion: Lisibonny/Repartidor_Dominicano
- Libreria de NLP para post-procesamiento: spaCy es_core_news_sm, usada para etiquetado POS y NER en la seccion 8 del notebook.
Modelo base
- Repositorio: mrm8488/roberta-base-bne-finetuned-sqac
- Justificacion: modelo en espanol ya afinado para QA extractivo sobre SQAC, lo que da un punto de partida zero-shot mas fuerte que un modelo base sin afinar para esta tarea y este idioma.
- Numero aproximado de parametros: 124,054,274 (todos entrenables, arquitectura RoBERTa-base)
Datos
| Division | Filas | Uso |
|---|---|---|
| train | 45 | Entrenamiento |
| validation | 15 | Comparacion y seleccion |
| test | 20 | Predicciones finales |
No se publicaron ni utilizaron respuestas privadas de test.
Entrenamiento
| Parametro | Valor |
|---|---|
| Seed | 42 |
| Learning rate | 3e-5 |
| Batch size | 4 |
| Warmup ratio | 0.1 |
| Weight decay | 0.01 |
| LR scheduler | cosine |
| Epocas maximas | 20 (con early stopping) |
| Paciencia (early stopping) | 6 epocas sin mejora en el combinado EM+F1 |
| Epocas efectivas, Variante A | 7 (colapso temprano, ver seccion de ablacion) |
| Epocas efectivas, Variante B | 16 (mejor variante, sin senales de colapso) |
| Max length | 384 |
| Doc stride | 128 |
| Hardware | Tesla T4, 15360 MiB (Google Colab, CUDA 12.8) |
| Tiempo | ~1.2 minutos (Variante B, train aumentado, 16 epocas hasta early stopping) |
Función utilizada para data augmentation (presente en el notebook)
´SYNONYM_MAP = { "gobierno": ["administracion central", "el Ejecutivo", "las autoridades"], "presidente": ["mandatario", "jefe de Estado"], "ministro": ["funcionario", "titular de la cartera"], "ministra": ["funcionaria", "titular de la cartera"], "dijo": ["afirmo", "senalo", "expreso"], "aumento": ["subio", "se incremento"], "disminuyo": ["bajo", "se redujo"], "policia": ["cuerpo policial", "las autoridades policiales"], }
def paraphrase_question(question): variants = [question] q_lower = question.lower() for word, synonyms in SYNONYM_MAP.items(): if word in q_lower: pattern = re.compile(re.escape(word), re.IGNORECASE) for syn in synonyms: variants.append(pattern.sub(syn, question, count=1)) seen, unique_variants = set(), [] for v in variants: if v not in seen: seen.add(v) unique_variants.append(v) return unique_variants´
Experimentos
| Experimento | Cambio | EM validation | F1 validation |
|---|---|---|---|
| 1. Baseline oficial (zero-shot) | Sin cambios | 53.33 | 81.68 |
| 2. Baseline + post-procesamiento (spaCy es_core_news_sm) | Reglas de concordancia de plural y preservacion de verbo | 60.00 | 88.15 |
| 3. Baseline + post-procesamiento + re-ranking | Re-ranking hibrido sobre candidatos top k, mas post-procesamiento | 60.00 | 88.15 |
| 4. Variante A (fine-tuning, train original) | Fine-tuning con train original (45 ejemplos) | 66.67 | 83.46 |
| 5. Variante B (fine-tuning, train aumentado) | Fine-tuning con train aumentado (49 ejemplos) | 73.33 | 86.73 |
| 6. Variante B + post-procesamiento | Post-procesamiento spaCy es_core_news_sm sobre la Variante B | 73.33 | 90.98 |
| 7. Modelo final: Variante B + post-procesamiento + re-ranking hibrido | Re-ranking hibrido sobre candidatos top k de la Variante B, mas post-procesamiento | 73.33 | 90.98 |
Nota honesta sobre el re-ranking: El re-ranking hibrido (score nativo + similitud Jaccard + bono NER) no cambio ninguna prediccion en este validation de 15 ejemplos, ni sobre el baseline ni sobre la Variante B. Esto sugiere que en la mayoria de los casos el candidato top 1 del modelo ya coincidia con lo que el re-ranking habria elegido, o que el validation es demasiado pequeno para que la tecnica muestre diferencia. Se reporta la tecnica y se mantiene en el pipeline final por completitud metodologica (cumple el requisito de comparar variantes), pero no se le atribuye la mejora observada, que viene del post-procesamiento y del fine-tuning.
Ablacion o comparacion controlada
Variable que cambio: el conjunto de entrenamiento (train original de 45 ejemplos contra train aumentado con parafrasis sinonimicas de las preguntas, manteniendo contexto y respuesta identicos). Variables que permanecieron constantes: modelo base, hiperparametros, semilla y metricas de evaluacion. La comparacion se hizo epoca por epoca sobre el mismo split de validation, ver seccion 12 del notebook.
Hallazgo principal: la Variante A (train original) colapsa rapido, el combinado EM+F1 cae de ~71 en la epoca 1 a ~60 hacia la epoca 5, y el early stopping la corta en la epoca 7. La Variante B (train aumentado) nunca muestra ese colapso, oscila entre 66 y 77 durante 16 epocas completas sin tendencia de caida sostenida. Esto es evidencia directa de que el data augmentation actua como regularizacion: con solo 45 ejemplos el modelo memoriza la forma exacta de las preguntas en pocas epocas, mientras que con mas variedad de formulaciones (mismo contexto y respuesta) tarda mucho mas en sobreajustarse.
Resultados
Modelo publicado (solo pesos, lo que se obtiene con pipeline(...) directo):
Variante B, fine-tuning con train aumentado.
- Exact Match en validation: 73.33
- F1 en validation: 86.73
Con el pipeline completo (post-procesamiento con spaCy es_core_news_sm + re-ranking hibrido, incluidos en el repositorio de codigo, no en los pesos):
- Exact Match en validation: 73.33 (+6.66 puntos sobre el modelo solo)
- F1 en validation: 90.98 (+3.78 puntos sobre el modelo solo)
El repositorio de codigo incluye ademas una demo interactiva (widget de ipywidgets) en la seccion 20 del notebook, que envuelve el modelo publicado con el pipeline completo (predict_answer
- postprocess_prediction + re-ranking hibrido), para reproducir directamente el resultado de 73.33/90.78 sin tener que reimplementar el post-procesamiento a mano. No se publico un Hugging Face Space externo porque, al momento de esta entrega, la plataforma requiere plan PRO para Spaces con SDK Gradio en cuentas personales nuevas.
Diagnostico de overfitting (pipeline completo):
- Exact Match en train: 84.44
- F1 en train: 88.44
- Brecha EM (train menos validation): 11.11 puntos
- Brecha F1 (train menos validation): -2.54 puntos (F1 es mejor en validation que en train)
- Lectura: no hay evidencia de overfitting significativo. La brecha de F1 negativa descarta memorizacion clasica, y la brecha de EM remanente es consistente con el tamano reducido de ambos splits (45 y 15 ejemplos) mas que con un problema de generalizacion. Antes de aplicar post-procesamiento y re-ranking sobre el modelo afinado solo, la brecha de EM era de 22.22 puntos, el post-procesamiento y el re-ranking la redujeron sin afectar F1, lo que confirma que el problema era de calibracion del limite exacto del span, no de contenido.
- Script de evaluacion:
05_evaluate_qa.py
Diagnostico de overfitting (modelo suelto):
- Exact Match en train: 86.67
- F1 en train: 88.89
- Brecha EM (train menos validation): 13.33 puntos
- Brecha F1 (train menos validation): 2.16 puntos
- Lectura: Lo que llama la atención es la disociación entre EM y F1. Si el modelo estuviera memorizando train de forma clásica, esperarías que ambas métricas caigan de forma pareja en validation (F1 y EM se mueven juntas cuando el modelo simplemente "no reconoce" el patrón). Aquí F1 casi no se mueve, lo que significa que en validation el modelo casi siempre está encontrando el fragmento correcto en términos de contenido (tokens correctos), pero falla en el límite exacto del span (dónde empieza o termina el string). Eso es justo el tipo visto en la sección 15 del notebook y que motivó el post-procesamiento con spaCy: preguntas plurales donde falta extender el span, o de tiempo verbal donde falta el verbo auxiliar.
- Script de evaluacion:
05_evaluate_qa.py
Ejemplo de uso
from transformers import pipeline
qa = pipeline(
"question-answering",
model="Underscore-IDPD/pdqa-roberta-bne-sqac-finetuned-augmented",
tokenizer="Underscore-IDPD/pdqa-roberta-bne-sqac-finetuned-augmented"
)
qa(
question="Quien hizo el anuncio?",
context="La ministra informo que el programa comenzara en agosto."
)
Importante: los resultados reportados arriba corresponden al pipeline
completo, que incluye post-procesamiento con spaCy es_core_news_sm y re-ranking hibrido sobre los candidatos del
modelo, ademas del fine-tuning. Los pesos publicados en este repositorio son solo el modelo
afinado; usarlo directamente con pipeline(...) sin el post-procesamiento y el re-ranking se predice que den
resultados inferiores a estos y más cercanos a los del modelo suelto. El codigo de esas dos etapas del pipeline esta en el notebook del repositorio de codigo (ver seccion de Reproducibilidad).
Analisis de errores
- Concordancia de plural: preguntas con "quienes" o "cuales" donde el modelo devuelve un fragmento que no incluye la lista completa de la referencia. Ejemplo: pregunta "Cuantos bateadores...", esta pregunta ni siquiera con el pipeline se soluciono.
- Tiempo verbal: preguntas en futuro o condicional donde el span predicho omite el verbo auxiliar necesario para que la respuesta tenga sentido completo. Ejemplo: pregunta "Como sera la inflacion en 2023?", referencia "seguira siendo alta", prediccion "siendo alta" (F1 = 0.80, falta el verbo "seguira").
- Truncamiento de la frase introductoria en preguntas descriptivas ("de que trata"): el modelo acierta el contenido pero corta el verbo o la frase que enmarca la respuesta. Ejemplo: pregunta "De que trata la pelicula Ramona?", referencia "gira en torno al embarazo en adolescentes", prediccion "al embarazo en adolescentes" (F1 = 0.73, falta "gira en torno").
Nota honesta: el caso peor calificado (F1 = 0.14, ejemplo 1) es justo el tipo de patron que la regla de extension de plurales deberia cubrir, y sin embargo sigue fallando en el pipeline final. Es probable que el patron de puntuacion despues del span predicho (dos puntos seguido de una lista larga con comas internas) no calce con la expresion regular de extend_plural_answer, que espera un formato mas simple. Queda como limitacion conocida en vez de ocultarse.
Limitaciones
- La respuesta debe estar presente en el contexto.
- El modelo puede confundir entidades, fechas o cantidades similares.
- El modelo no verifica la veracidad de la noticia.
- El train original tiene solo 45 ejemplos, lo que limita la capacidad de generalizacion incluso con data augmentation.
- No debe utilizarse como unica fuente para decisiones de alto impacto.
Reproducibilidad
- Repositorio de codigo: pdqa-roberta-bne-sqac-finetuned-augmented-pipeline
- Commit: f8d9f425e328214db3c71b822ded354e1d57d871
- Notebook: 03_Introduccion_QA_Noticias.ipynb
- Archivo de dependencias: requirements.txt (generado en la seccion 17 del notebook), versiones verificadas en el entorno real de Colab: transformers==4.57.6, datasets==4.0.0, accelerate==1.14.0, pandas==2.2.2, pyarrow==18.1.0, numpy==2.0.2, spacy==3.8.14, torch==2.11.0 (build +cu128)
- Semillas: 42
- Downloads last month
- 113
Model tree for Underscore-IDPD/pdqa-roberta-bne-sqac-finetuned-augmented
Base model
mrm8488/roberta-base-bne-finetuned-sqac