English · Español
Fase 15 — Quiz (espejo legible)¶
Espejo legible del canónico
data/quizzes/phase-15-attention.yaml.
Fuente: data/quizzes/phase-15-attention.yaml.
q-15-01 — ¿Por qué dividir entre sqrt(d_k)? (single)¶
- Para que las filas de attention sumen exactamente 1
- Para mantener la varianza de los logits aproximadamente constante a medida que d_k crece ✓
- Para compensar el underflow de coma flotante en fp16
- Para igualar el número de parámetros del transformer original
Sin escalado, los logits crecen con d_k y el softmax se satura. Dividir entre sqrt(d_k) preserva varianza O(1) y gradientes sanos.
q-15-02 — Propiedades de la máscara causal (causal mask) (multi)¶
- Es triangular superior con -inf por encima de la diagonal ✓
- Es simétrica para que cada token vea a todos los demás
- Permite que un token se atienda a sí mismo ✓
- Permite que un token atienda a tokens futuros
Las posiciones futuras se ponen a -inf (softmax → 0); la diagonal se mantiene para que cada token se atienda a sí mismo.
q-15-03 — Complejidad temporal de self-attention (free)¶
Se espera que contenga: n^2.
Calcular la matriz de atención N×N es O(N²·d). Flash attention y las variantes lineales intentan reducir esto.
q-15-04 — Deriva: varianza del softmax con QK^T sin escalar (single)¶
Con Q, K ∼ N(0, 1) i.i.d. y d_k = 64, ¿cuál es la std de una entrada de Q @ K^T?
- 1
- sqrt(64) = 8 ✓
- 64
- log(64) ≈ 4.16
Cada entrada es una suma de
d_kproductos de variables N(0,1). Var = d_k = 64; std = 8. Logits con std 8 saturan el softmax. Dividir entre sqrt(d_k) restaura std ≈ 1.
q-15-05 — Encuentra el bug: attention sin sqrt(d_k) en d_k = 64 (free)¶
Se espera que contenga: satur.
El softmax se satura (una entrada cerca de 1, el resto cerca de 0). Los gradientes a través de attention desaparecen. A d_k pequeño el bug es invisible. Ver
break/00-break-no-sqrt-dk-scaling.md.