Skip to content

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_k productos 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.