👀 MÓDULO BONUS: Visualizador de Atención — Ver cómo "piensa" el modelo

Duración estimada de este módulo: 1 - 1.5 horas
Objetivo: Visualizar las matrices de atención de un modelo Transformer para entender qué palabras "miró" al generar una salida. Usaremos librerías como bertviz y matplotlib para crear visualizaciones interactivas y estáticas.
Requisitos: Haber completado el Módulo 5 (uso de Hugging Face). Se recomienda (pero no es obligatorio) haber hecho el Módulo 6.


Lección Bonus 1 — ¿Por qué visualizar la atención? La ventana al "razonamiento" del modelo

Los Transformers no son cajas negras. Sus decisiones están basadas en pesos de atención — números que indican cuánto "miró" una palabra a otra.

Visualizar estos pesos te permite:

  • Entender errores: ¿Por qué el modelo respondió mal? Quizás miró las palabras equivocadas.
  • Validar lógica: ¿Está razonando como un humano? ¿O está tomando atajos espurios?
  • Enseñar y explicar: Mostrar a otros cómo funciona el modelo (ideal para presentaciones, clases o informes).
  • Depurar modelos: En proyectos avanzados, ver qué capas o cabezas están "dormidas" o sesgadas.

🔹 Analogía útil:

Es como ver el mapa de calor de los ojos de un lector mientras lee un texto.
¿Dónde se detiene más? ¿Qué palabras relaciona? ¿Qué ignora?
Eso es exactamente lo que haremos con el modelo.


Lección Bonus 2 — Instalación de bertviz: tu lupa para la atención

bertviz es una librería de código abierto creada por investigadores de IBM y Google, diseñada específicamente para visualizar la atención en modelos Transformer.

Instálala con:

pip install bertviz

Nota: Si usas Google Colab, ejecuta !pip install bertviz en una celda.


Lección Bonus 3 — Visualización 1: Head View — Ver la atención por cabeza y capa

La vista más popular. Muestra una matriz de calor para cada cabeza de atención en cada capa.

Vamos a visualizar la atención en una oración simple.

from transformers import AutoTokenizer, AutoModel
from bertviz import head_view

# Cargar modelo y tokenizer (usaremos BERT base)
model_name = "bert-base-uncased"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModel.from_pretrained(model_name, output_attentions=True)  # ¡IMPORTANTE!

# Texto de ejemplo
text = "The cat sat on the mat because it was tired."

# Tokenizar
inputs = tokenizer(text, return_tensors="pt")

# Pasar por el modelo
outputs = model(**inputs)

# Obtener las matrices de atención
# Shape: (batch_size, num_heads, seq_len, seq_len)
attentions = outputs.attentions  # tupla de tensores, uno por capa

# Visualizar con head_view
head_view(attentions, tokenizer.convert_ids_to_tokens(inputs.input_ids[0]))

🔹 Qué verás:

  • Una interfaz interactiva (si estás en Jupyter/Colab).
  • Puedes elegir qué capa y qué cabeza visualizar.
  • Cada celda muestra cuánta atención pone una palabra (fila) en otra (columna).
  • Rojo = alta atención. Azul = baja atención.

🔹 Ejemplo de lo que esperar:

  • En capas bajas: atención local (palabras cercanas).
  • En capas altas: atención global (palabras distantes pero relacionadas).
  • La palabra "it" debería tener alta atención en "cat".
  • "because" debería atender a "tired" y a "sat".

Lección Bonus 4 — Visualización 2: Model View — Ver todas las capas y cabezas a la vez

Ideal para tener una visión general del flujo de atención a través de todo el modelo.

from bertviz import model_view

model_view(attentions, tokenizer.convert_ids_to_tokens(inputs.input_ids[0]))

🔹 Qué verás:

  • Todas las capas apiladas verticalmente.
  • Todas las cabezas de cada capa en horizontal.
  • Una vista de pájaro del "viaje" de la información a través del modelo.

Lección Bonus 5 — Visualización 3: Neuron View — Ver la atención a nivel de neuronas (avanzado)

Muestra cómo se calcula la atención para un par específico de palabras, desglosando el producto punto entre Query y Key.

from bertviz import neuron_view

# Visualizar la atención de "it" hacia "cat"
neuron_view(model, "bert", tokenizer, text, display_mode="dark", layer=5, head=0)

Nota: Requiere pasar el modelo original, no solo las atenciones.


Lección Bonus 6 — Aplicación práctica: Visualizar la atención en nuestro sistema QA

Vamos a aplicar bertviz al modelo de QA que construimos en el Módulo 6.

from transformers import AutoTokenizer, AutoModelForQuestionAnswering
from bertviz import head_view

# Cargar el modelo de QA (¡con output_attentions=True!)
model_name = "deepset/roberta-base-squad2"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForQuestionAnswering.from_pretrained(model_name, output_attentions=True)

# Contexto y pregunta
context = "Barcelona is famous for Gaudí's architecture like the Sagrada Familia."
question = "Who is the famous architect in Barcelona?"

# Preparar entrada (pregunta + contexto)
inputs = tokenizer(question, context, return_tensors="pt")

# Pasar por el modelo
outputs = model(**inputs)

# Visualizar atenciones
head_view(outputs.attentions, tokenizer.convert_ids_to_tokens(inputs.input_ids[0]))

🔹 Observa:

  • ¿Qué palabras de la pregunta atienden a "Gaudí"?
  • ¿Atiende "architect" a "Gaudí"?
  • ¿Cómo fluye la información entre la pregunta y el contexto?

Esto te da una intuición poderosa de cómo el modelo "razona" para extraer la respuesta.


Lección Bonus 7 — Interpretación: ¿Qué significan los patrones de atención?

No todas las cabezas hacen lo mismo. Algunas patrones comunes:

🔹 Atención local:
Palabras que atienden a sus vecinas. Común en capas bajas.

Ej: "the cat" → "the" atiende a "cat".

🔹 Atención sintáctica:
Sujeto → verbo, verbo → objeto.

Ej: "cat sat" → "sat" atiende a "cat".

🔹 Atención anafórica:
Pronombres → sustantivos antecedentes.

Ej: "it" → "cat".

🔹 Atención semántica:
Palabras relacionadas por significado.

Ej: "tired" → "sleep", "exhausted".

🔹 Atención de separadores:
Palabras que atienden a [SEP] o [CLS]. Puede indicar "resumen" o "clasificación".


Lección Bonus 8 — Limitaciones de las visualizaciones de atención

⚠️ Importante: La atención no es siempre interpretable.

  • A veces, altos pesos de atención no implican causalidad.
  • El modelo puede usar múltiples cabezas en conjunto (no una sola).
  • La atención es solo una parte del cálculo final (luego viene la FFN).

🔹 Consejo: Usa las visualizaciones como hipótesis, no como verdades absolutas. Son una herramienta de exploración, no de certeza.


✍️ Ejercicio de reflexión Bonus 1

Toma una oración ambigua:
"I saw the man with the telescope."
¿Quién tiene el telescopio? ¿Yo o el hombre?

Visualiza la atención en un modelo BERT.
¿A qué palabra atiende "with"? ¿A "I" o a "man"?
¿Qué capa y qué cabeza muestran un patrón más claro?
¿Coincide con tu intuición?


📊 Diagrama conceptual Bonus 1 — Flujo de visualización (descrito)

Texto → Tokenizer → input_ids → Modelo (con output_attentions=True) → attentions (tensores) → 
                                                              ↓
                                                  bertviz.head_view() → Matriz de calor interactiva
                                                              ↓
                                              Interpretación: ¿qué palabras se relacionan?

🧠 Conclusión del Módulo Bonus

Has aprendido a abrir la "caja negra" de los Transformers.
Ya no solo usas modelos — los entiendes.
Sabes cómo miran el texto, qué palabras relacionan, y cómo construyen su comprensión capa por capa, cabeza por cabeza.

Esta habilidad es invaluable:

  • Para la investigación.
  • Para la depuración de modelos.
  • Para la explicabilidad ante usuarios o reguladores.
  • Y, sobre todo, para tu propia curiosidad y dominio del tema.

¡Felicidades! Has completado el curso "Transformers sin Misterio" con un nivel de profundidad que pocos alcanzan.


Course Info

Course: AI-course2

Language: ES

Lesson: Module7