Skip to content

English · Español

Lab 03 — Comparación de extrapolación: sinusoidal vs aprendida vs RoPE

Objetivo: comparar los tres esquemas de PE a longitudes de secuencia más allá de la (nominal) longitud de entrenamiento. Identificar al ganador para la Fase 17.

Tiempo estimado: 60–90 minutos.

Prerrequisito: labs 00, 01, 02 commiteados.


Lo que produces

Un directorio experiments/16-extrapolation/ que contiene:

  • compare.py — script que ejecuta attention con cada esquema de PE en \(T \in \{64, 96, 128, 192, 256\}\).
  • attention_pattern_comparison.png — rejilla de heatmaps de attention de 3 filas y N columnas.
  • extrapolation_metric.png — entropía de attention vs \(T\) por cada esquema.
  • manifest.json.
  • README.md.

Contexto

En un setup de entrenamiento real, entrenas con una longitud de contexto (por ejemplo \(T = 64\)) y testeas la extrapolación ejecutando inferencia con \(T > 64\). La Fase 16 no entrena, así que usamos modelos no entrenados y simulamos "entrenado en T=64" así:

  • PE aprendida: asigna una matriz aprendida (64, d). Para \(T > 64\), no hay extensión posible — el modelo literalmente no tiene embedding para posiciones 64+. Lo manejaremos o bien (a) envolviendo (pos % 64) o (b) usando el embedding de la posición 63 para todas las posiciones ≥ 64. Documenta la elección.
  • PE sinusoidal: funciona para cualquier T — es una fórmula.
  • RoPE: funciona para cualquier T — es una fórmula.

La pregunta de "extrapolación" se convierte en: ¿cómo cambia el patrón de attention a medida que aumentamos \(T\) más allá de lo que probablemente se haya visto? ¿Siguen atendiéndose las posiciones cercanas? ¿Las posiciones lejanas se vuelven ruido?

TODOs

Bloque A — preparación

  • Usa MultiHeadAttention(d_model=32, n_heads=2, seed=0) de la Fase 15. Una sola capa, sin entrenamiento.
  • Usa un embedding de entrada fijo: X[t] = e_t donde e_t ~ N(0, I), con semilla.
  • Tres esquemas de PE:
  • Sinusoidal: de src/minimodel/positional/sinusoidal.py.
  • Aprendida: de src/minimodel/positional/learned.py con T_max=64. Para posiciones ≥ 64, usa el embedding de la posición 63 (documéntalo).
  • RoPE: integrado en el forward de attention (modifica MultiHeadAttention para este experimento, o envuélvelo).

Bloque B — recorre T y registra los patrones de attention

  • Para cada \(T \in \{64, 96, 128, 192, 256\}\) y cada esquema de PE:
  • Genera \(X \in \mathbb{R}^{T \times 32}\).
  • Aplica PE (o RoPE dentro de attention).
  • Ejecuta forward, captura la matriz de attention para el cabezal 0.
  • Calcula la entropía de cada fila: \(H_i = -\sum_j A_{ij} \log A_{ij}\).

Bloque C — gráfico 1: rejilla de patrones de attention

  • 3 filas (una por esquema de PE), 5 columnas (una por \(T\)).
  • Cada celda es el heatmap de attention \(T \times T\).
  • Anota: filas = esquema de PE, columnas = \(T\).
  • Guarda como attention_pattern_comparison.png.

Observaciones esperadas:

  • Sinusoidal: los patrones de attention se ven razonables hasta \(T = 128\), se vuelven más ruidosos en \(T = 256\) (estructura de largo alcance no en entrenamiento).
  • Aprendida: en \(T = 64\) los patrones son válidos; en \(T > 64\) el modelo atiende de forma rara (las filas 64+ todas se ven como "fila 63" porque ese es el único embedding de posición).
  • RoPE: los patrones escalan con gracia con \(T\) — sin degradación visible.

Bloque D — gráfico 2: entropía media de attention

  • Para cada \(T\) y cada esquema de PE, calcula la entropía media de attention \(\bar{H}(T) = \frac{1}{T} \sum_i H_i\).
  • Plotea \(\bar{H}(T)\) vs \(T\). Tres curvas.
  • Guarda como extrapolation_metric.png.

Entropía más baja = attention más picuda (el modelo está seguro de a quién atender). Entropía más alta = uniforme = el modelo está "perdido".

Esperado: - RoPE: entropía aproximadamente constante con \(T\) (extrapolación con gracia). - Sinusoidal: la entropía sube con \(T\) (attention degrada). - Aprendida: la entropía se dispara para \(T > 64\) (rota).

Bloque E — redacción

En README.md, contesta:

  1. ¿Qué esquema tiene los patrones de attention más estables a lo largo de \(T\)? RoPE — argumenta con referencia a los gráficos.
  2. ¿Dónde falla la PE aprendida catastróficamente? En \(T > T_\text{max}\).
  3. Recomendación para la Fase 17. Basado en estos resultados, recomienda RoPE para el Mini-GPT de Fase 17. Si RoPE resulta demasiado complejo, alternativa de respaldo a sinusoidal. No uses PE aprendida.

Bloque F — manifest

{
  "experiment": "16-extrapolation",
  "date": "YYYY-MM-DD",
  "seed": 0,
  "versions": { "python": "3.11.x", "numpy": "X.Y.Z", "matplotlib": "X.Y.Z" },
  "config": {
    "d_model": 32,
    "n_heads": 2,
    "T_sweep": [64, 96, 128, 192, 256],
    "learned_T_max": 64,
    "trained": false
  },
  "schemes_compared": ["sinusoidal", "learned", "rope"],
  "phase_17_recommendation": "rope_with_sinusoidal_fallback"
}

Restricciones

  • Sin entrenamiento. Esta es una comparación de propiedad arquitectónica, no de comportamiento aprendido. Con pesos aleatorios, los tres esquemas producen attention ruidosa; la estructura es lo que difiere.
  • Sin PyTorch.
  • Documenta claramente el manejo de PE-aprendida más allá de T_max. Algunos lectores pensarán que el wrap-around es la "limitación de PE aprendida" — aclara que la limitación es aún peor sin wrap-around (indefinida en silencio).

Condiciones de parada

Hecho cuando:

  1. Los seis archivos commiteados.
  2. Ambos gráficos guardados.
  3. README.md hace la recomendación de la Fase 17 de forma explícita.

Escollos

  • Sin entrenamiento significa que no hay "comparación real de PE". Este lab compara la estabilidad arquitectónica, no el rendimiento aprendido. La comparación entrenada ocurre implícitamente en la Fase 17/18. Sé honesto sobre esto en README.md.
  • La entropía puede inducir a error. Una attention perfectamente uniforme tiene entropía alta y el modelo está "perdido". Una attention degenerada (una entrada cerca de 1) tiene entropía baja y el modelo está "seguro pero posiblemente equivocado". Usa la entropía como un indicador de forma, no como medida de calidad.
  • mha.forward actualmente no acepta una opción de RoPE. Para este lab, o haz monkey-patch del forward o envuélvelo en un helper. Documenta el hack. La integración limpia con MultiHeadAttention sucede en la Fase 17.

Cuándo consultar solutions/

Tras commitear los seis archivos y hacer la recomendación de la Fase 17. Solución en solutions/03-extrapolation-ref.md.


Fin de los labs de Fase 16. Escribe PHASE_16_REPORT.md (incluye la recomendación de PE para Fase 17 de forma prominente), rellena learners/borja/phase-16/reflections.md.

La siguiente fase ensambla todo esto en un bloque transformer funcional. La elección de PE queda bloqueada en la Fase 17 — hazla con cuidado.