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_tdondee_t ~ N(0, I), con semilla. - Tres esquemas de PE:
- Sinusoidal: de
src/minimodel/positional/sinusoidal.py. - Aprendida: de
src/minimodel/positional/learned.pyconT_max=64. Para posiciones ≥ 64, usa el embedding de la posición 63 (documéntalo). - RoPE: integrado en el forward de attention (modifica
MultiHeadAttentionpara 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:
- ¿Qué esquema tiene los patrones de attention más estables a lo largo de \(T\)? RoPE — argumenta con referencia a los gráficos.
- ¿Dónde falla la PE aprendida catastróficamente? En \(T > T_\text{max}\).
- 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:
- Los seis archivos commiteados.
- Ambos gráficos guardados.
README.mdhace 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.forwardactualmente 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 conMultiHeadAttentionsucede 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.