English · Español
Lab 00 — Equivarianza por permutación, en números¶
Objetivo: demostrar empíricamente que attention sin información posicional es permutación-equivariante. Mostrar que añadir PE sinusoidal rompe esta propiedad.
Tiempo estimado: 30–45 minutos.
Prerrequisito:
theory/00-motivation.mdleído.src/minimodel/attention/de la Fase 15 existe.
Lo que produces¶
Un directorio experiments/16-permutation-equivariance/ que contiene:
demo.py— script que ejecuta attention con y sin PE sobre una secuencia de 3 tokens y muestra qué ocurre bajo permutación.demo_output.txt— printout capturado.manifest.json.README.md.
TODOs¶
Bloque A — preparación¶
- Usa
MultiHeadAttention(d_model=8, n_heads=1, seed=0)de la Fase 15. - Entrada: 3 tokens formando un fragmento de gramática verbal —
he,work,I(IDs de tokens de tu tokenizer de Fase 14; embed vía el embedding de Fase 13). Apila como \(X \in \mathbb{R}^{3 \times 8}\). - Motivación lingüística:
he work Ies agramatical;I work hetambién es agramatical; solo con información posicional el modelo puede preferir un orden sobre otro (o más bien: preferirhe workssobreworks hemás adelante en la Fase 18). Sin PE, todos los órdenes se ven iguales.
Bloque B — sin PE¶
- Calcula
Y = mha.forward(X, mask=None). - Permuta la entrada:
X_perm = X[[2, 0, 1]](intercambia tokens). - Calcula
Y_perm = mha.forward(X_perm, mask=None). - Asegura:
np.allclose(Y_perm, Y[[2, 0, 1]], atol=1e-6).
Esto demuestra: la salida de attention sobre la entrada permutada es igual a la permutación de la salida de attention sobre la entrada original. Equivarianza. El modelo no tiene forma de saber qué permutación recibió.
- Imprime
Y,Y[[2, 0, 1]]yY_permlado a lado. Verifica visualmente.
Bloque C — con PE¶
- Usa PE sinusoidal:
pe = sinusoidal_pe(3, 8)(desrc/minimodel/positional/sinusoidal.pyde Fase 16). - Calcula
Y_pe = mha.forward(X + pe). - Calcula
Y_perm_pe = mha.forward(X_perm + pe). - Asegura:
not np.allclose(Y_perm_pe, Y_pe[[2, 0, 1]], atol=1e-3).
Esto demuestra: con PE, el modelo sí distingue la permutación. La salida ya no es solo un reordenamiento.
- Imprime la matriz de diferencia
Y_perm_pe - Y_pe[[2, 0, 1]](debería tener entradas no triviales — la PE ha roto la equivarianza).
Bloque D — interpretar¶
En README.md (1–2 párrafos), contesta:
- ¿Por qué pasa el test sin PE? Enuncia el teorema de equivarianza por permutación con tus propias palabras y referencia el ejemplo de 3 tokens.
- ¿Por qué el test con PE pasa con diferencia? Las filas de PE son distintas para posiciones distintas; sumarlas a tokens permutados significa que cada token ahora lleva una firma específica de posición que la versión no permutada no tendría.
Bloque E — manifest¶
{
"experiment": "16-permutation-equivariance",
"date": "YYYY-MM-DD",
"seed": 0,
"versions": { "python": "3.11.x", "numpy": "X.Y.Z" },
"config": {
"d_model": 8,
"n_heads": 1,
"T": 3,
"pe_scheme_compared": "sinusoidal"
},
"results_summary": {
"without_PE_equivariance_max_diff": null,
"with_PE_equivariance_max_diff": null
}
}
La diferencia sin PE debería ser < 1e-6. La diferencia con PE debería ser > 1e-3.
Restricciones¶
- Sin código nuevo en
src/. UsaMultiHeadAttentionysinusoidal_peexistentes. Este lab es una demostración, no un lab de implementación. - Con semilla. Reproducible.
Condiciones de parada¶
Hecho cuando:
- Los cuatro archivos commiteados.
- Ambas aserciones pasan (una para equivarianza sin PE, otra para no-equivarianza con PE).
README.mdexplica el resultado.
Escollos¶
- Confusión con el índice de permutación.
X[[2, 0, 1]]significa "toma la fila 2, fila 0, fila 1 en ese orden". Confirma imprimiendoXyX[[2, 0, 1]]para asegurarte de que entiendes. - Tolerancia.
1e-6para sin PE;1e-3para con PE (los valores de PE son O(1), así que la diferencia tras attention es no trivial).
Cuándo consultar solutions/¶
Tras commitear los cuatro archivos. Solución en solutions/00-permutation-equivariance-ref.md.
Siguiente lab: 01-sinusoidal-pe.md.