las ecuaciones de esta slide
ht = f(Whht−1 + Wxxt)   ⇒   señal de x1 en hTΠl=1..T−1|wl| ≈ wT−1(RNN, Día 08)
en la recurrencia, lo que el token 1 aporta al estado del token T pasa por T−1 multiplicaciones encadenadas. Si la ganancia media w es <1 la señal se extingue exponencialmente; si es >1, explota. No hay término medio estable.
atención: Z = AV,   zi = Σj αijvj  ⇒   distancia entre cualquier par = 1 paso
en self-attention el token i lee directamente al token j a través del peso αij, esté al lado o a 3 000 posiciones. La «memoria» es la propia matriz A, no un estado que se arrastra.
guion paso a paso
  1. Con w = 0.92, sube T de 2 a 60 mirando el lector. La señal cae a wT−1: con T = 60 queda ≈ 0.7% del original. El token 1 es casi invisible desde el 60.
  2. Pon w = 1.10 y repite. Ahora la señal EXPLOTA (>200× con T = 60): la inestabilidad del Día 08, en vivo.
  3. Pulsa «nueva cadena» cinco veces con w = 1.0. Aun con ganancia media 1, el producto de ganancias aleatorias baila órdenes de magnitud: la cadena nunca es neutra de verdad.
  4. Mira la línea dorada horizontal del panel superior. Es la atención: distancia 1 para cualquier par. No depende ni de w ni de T. Esa es toda la motivación del día.
Comprueba que entiendes: ¿por qué no basta con poner w = 1 exactamente?
Porque w no es un número que tú fijas: es el efecto conjunto de la matriz recurrente y las derivadas de la activación en cada paso, distinto en cada t. El producto de T factores aleatorios alrededor de 1 no se queda en 1: fluctúa exponencialmente (pulsándo «nueva cadena» lo ves). LSTM/GRU amortiguan esto con puertas, pero siguen pagando T pasos secuenciales. La atención elimina la cadena entera.

Setup. Una transcripción de call-center de telco tiene fácilmente 3 000 palabras; un histórico de demanda de Inditex, cientos de semanas. Para que una RNN conecte la palabra 1 con la palabra T, la información atraviesa T−1 multiplicaciones recurrentes. Arriba pinto la señal superviviente Π|wl| en escala log (curva tinta: cadena con ganancias aleatorias de media w; discontinua gris: el caso ideal wt), contra la línea dorada de la atención, que siempre vale 1 porque conecta cualquier par en un paso. Abajo, el dibujo de las dos rutas sobre la frase.

Juega. Mueve w a ambos lados de 1 y estira T. Con w < 1 el cliente dijo «quiero darme de baja» al principio de la llamada y al final la red ya no lo recuerda; con w > 1 las activaciones revientan antes de llegar. La banda útil alrededor de w = 1 se estrecha al crecer T.

Lee así. El eje y es logarítmico: una recta descendente es extinción exponencial. La distancia vertical entre la curva tinta y la línea dorada en T es cuánta memoria pierdes por usar una cadena en vez de acceso directo.

Mensaje. El Transformer no mejora la RNN: la sustituye. Cambia «arrastrar un estado T pasos» por «dejar que cada token pregunte a todos los demás a la vez». El resto del día es construir esa pregunta con matrices de verdad.

Términos. ht: estado oculto de la RNN en el paso t. w: ganancia efectiva por paso (autovalor dominante × derivada de la activación). αij: peso de atención con que el token i lee al token j.

las ecuaciones de esta slide
Q = XWQ,   K = XWK,   V = XWV(paso 1 de 5)
X ∈ ℝT×d apila los T = 5 embeddings de dimensión d = 4. Cada matriz W ∈ ℝd×dk (aquí dk = 3) es aprendida y proyecta el mismo embedding a tres papeles: query qi = «¿quién es relevante para mí?», key ki = «esto es lo que ofrezco», value vi = «este es mi contenido».
qi = xiWQ  ⇒  la fila i de Q solo depende de la fila i de X
cada token se proyecta por separado: tocar el embedding de «factura» cambia su q, su k y su v, y deja intactas las filas de los otros cuatro tokens. La interacción entre tokens llega después, en QK (slide siguiente).
guion paso a paso
  1. Con i = 1 («factura») y j = 1 (rasgo «entidad»), baja el valor de 1.0 a 0.0. En el panel inferior, SOLO la fila «factura» de Q, K y V cambia; su k pierde la componente entidad (de 2.02 a 0.02): deja de ofrecerse como cosa.
  2. Súbelo a 2.0. La fila se intensifica: la proyección es lineal, el doble de rasgo da (casi) el doble de componente.
  3. Cambia a i = 2 («llegó»), j = 2 (rasgo «acción») y muévelo. Ahora cambia la fila del verbo y ninguna más: las proyecciones son fila a fila, sin mezclar tokens.
  4. Pulsa restaurar y observa los tres W del panel superior. WK tiene un 2.0 que conecta el rasgo «entidad» del embedding con el eje «entidad» del espacio k: las W son las que deciden qué rasgo alimenta qué papel.
Comprueba que entiendes: si Q, K y V salen del MISMO embedding, ¿para qué tres matrices distintas?
Porque los tres papeles son asimétricos. «llegó» pregunta por entidades y tiempo (su q apunta a esos ejes) pero ofrece acción (su k apunta al eje acción): con una sola matriz, preguntar y ofrecer serían lo mismo y cada token se atendería sobre todo a sí mismo. Las tres W aprendidas permiten que lo que buscas, lo que anuncias y lo que entregas sean funciones distintas del mismo vector.

Setup. La frase de juguete es una queja de cliente de telco: «la factura llegó duplicada ayer» (T = 5 tokens), con embeddings de d = 4 dimensiones interpretables: función, entidad, acción y tiempo. Arriba: la matriz X (5×4) y las tres proyecciones WQ, WK, WV (4×3). Abajo: las matrices resultantes Q, K, V (5×3 cada una), recalculadas en vivo con cada movimiento del slider. La celda que estás tocando lleva borde dorado y la fila afectada queda resaltada.

Juega. Elige celda con los dos primeros sliders y mueve su valor con el tercero. La propagación es real: el JS multiplica X por cada W en cada movimiento. Comprueba que el cambio se queda en una fila, que es lineal, y que el mismo rasgo entra con pesos distintos en q, k y v.

Lee así. Los ejes del espacio q/k son «entidad / acción / tiempo»: una query con componente alta en entidad busca tokens cuya key tenga componente alta en entidad. Ese emparejamiento se consuma en la slide siguiente con el producto QK.

Mensaje. En un LLM real d = 12 288 y las W tienen millones de entradas aprendidas, pero la operación es exactamente esta: tres proyecciones lineales del mismo embedding, token a token.

Términos. X: matriz de embeddings, una fila por token. WQ, WK, WV: proyecciones aprendidas. dk: dimensión del espacio query/key (aquí 3). qi, ki, vi: filas i de Q, K, V.

las ecuaciones de esta slide
S = QK√dk,   Aij = eSijΣl eSil,   Z′ = AV(pasos 2–4 de 5)
Sij = qi·kj/√dk mide la afinidad entre lo que i busca y lo que j ofrece. El softmax por filas convierte cada fila de scores en una distribución de pesos αij ≥ 0 con Σjαij = 1.
zi = Σj=1..T αij vj
la salida del token i es la media ponderada de los values de toda la frase: el qué (vj) pesado por el cuánto (αij). Una sola operación matricial conecta todos con todos: esto es self-attention.
guion paso a paso
  1. Con i = 2 («llegó»), lee las barras α. El verbo reparte su atención: factura 0.34, duplicada 0.26, ayer 0.23 — busca a su entidad y a su tiempo. Y la suma del lector es 1.000 exacta.
  2. Pasa a i = 1 («factura»). La fila cambia de reparto: 0.55 a «llegó». El sustantivo busca a su verbo. Cada fila del heatmap es una pregunta distinta.
  3. Pasa a i = 0 («la»). Fila casi uniforme (≈0.2 todos): el artículo no pregunta nada y su salida z es casi el promedio de la frase.
  4. Con i = 2, baja X1,1 de 1.0 a 0.0. La key de «factura» se apaga, su α desde el verbo se desploma y el peso emigra a «duplicada» y «ayer»; el vector z2 de abajo se mueve con él. Todo el pipeline reacciona en cascada, con números reales.
Comprueba que entiendes: ¿por qué las filas suman 1 y las columnas no?
El softmax se aplica por filas: la fila i es el presupuesto de atención del token i, que debe repartirse entero (Σjαij = 1). Una columna j es cuánta atención RECIBE el token j desde todos, y eso no tiene por qué estar normalizado: en nuestra frase la columna de «llegó» suma más de 1.4 (es el hub) y la de «la» apenas 0.3. Recibir mucho o poco es información, no una restricción.

Setup. Misma frase y mismas matrices de la slide anterior; ahora ejecuto los pasos 2–4 completos. Arriba: la matriz de atención A = softmax(QK/√3) como heatmap 5×5 con sus valores numéricos (blanco→dorado→sepia = 0→1); la fila del token query elegido va recuadrada. Abajo: esa fila como barras sobre los tokens, y a su derecha el vector de salida zi = Σαijvj, calculado de verdad con esos pesos.

Juega. Recorre los cinco tokens con el primer slider y lee cómo cambia el reparto. Después usa el segundo slider, que reutiliza la perturbación de la slide anterior: al apagar el rasgo entidad de «factura» verás scores, softmax y salida moverse juntos.

Lee así. En el heatmap, una fila concentrada = pregunta específica; una fila plana = token sin preferencias. En las barras, el número sobre cada token es αij; las tres barras profundas de la derecha son las componentes de zi en el espacio de values.

Mensaje. Para clasificar quejas de clientes (factura / técnico / comercial, la práctica del día), esta matriz es la que decide que «duplicada» se interprete junto a «factura»: la semántica composicional sale de un producto escalar y un softmax.

Términos. S: matriz de scores (afinidades crudas). A: matriz de atención (scores normalizados por filas). αij: entrada (i,j) de A. zi: nueva representación del token i, mezcla de values.

las ecuaciones de esta slide
q·k = Σj=1..dk qjkj,   qj,kj ∼ iid, media 0, var 1  ⇒  Var(q·k) = dk
cada sumando qjkj tiene varianza 1 y hay dk independientes: la varianza del producto punto crece linealmente con la dimensión. Con dk = 256, scores típicos de ±16; con dk = 4096, de ±64.
Var(q·k√dk) = 1      H(p) = −Σj pj log pj ∈ [0, log T]
dividir por √dk devuelve los scores a varianza 1 para cualquier dk. La entropía H mide cuánto reparte el softmax: log T = uniforme, 0 = todo el peso en un token (saturado, sin gradiente para aprender).
guion paso a paso
  1. Recorre dk = 1 → 512 mirando el panel superior. Los puntos medidos siguen la recta Var = dk (tinta), y la versión escalada (dorada) se queda clavada en ≈1: la predicción teórica, verificada por muestreo real.
  2. Mira el panel inferior en dk = 512. Sin escalar, la entropía media cae hacia 0.1: el softmax pone ≈todo el peso en un token. Con √dk se mantiene ≈1.7 nats, cerca del máximo log 8 ≈ 2.08.
  3. Pulsa «otra semilla» varias veces. Los puntos bailan un poco (son 300 muestras), las curvas no cambian de forma: el fenómeno es estadístico, no casual.
  4. Vuelve a dk = 4 y compara las dos curvas de entropía. En dimensión baja la brecha es moderada (≈1.3 vs ≈1.7 nats); en dk = 64 (el de cada cabeza de GPT) ya es un abismo (≈0.3 vs ≈1.7): el escalado es vital justo en el rango de los modelos reales.
Comprueba que entiendes: ¿por qué un softmax saturado impide APRENDER?
El gradiente del softmax respecto de los scores es proporcional a αj(1−αj) y a productos αjαl. Si una α vale ≈1 y el resto ≈0, todos esos productos son ≈0: por backpropagation no fluye señal hacia WQ y WK, y la atención se queda congelada en su reparto inicial aleatorio. El 1/√dk mantiene los scores en la zona templada donde el softmax tiene pendiente y el modelo puede corregir quién mira a quién.

Setup. Aquí demuestro por muestreo el detalle más fácil de recitar y más difícil de explicar del paper de 2017. Para cada dimensión dk de la rejilla genero 300 pares (q, k) con componentes N(0,1) (generador mulberry32, reproducible), calculo sus productos punto y mido la varianza empírica. Después, para 150 queries con T = 8 keys cada una, calculo el softmax de los scores sin y con el divisor √dk, y promedio la entropía de los pesos resultantes.

Juega. El slider mueve el punto gordo por ambas curvas; el botón regenera todas las muestras. El lector da los cuatro números del dk elegido: varianza medida vs teórica y entropía con vs sin escalado, en % del máximo log 8.

Lee así. Panel superior en log-log: la recta de pendiente 1 es Var = dk. Panel inferior: la curva tinta (sin escalar) se despeña hacia entropía 0 al crecer dk; la dorada (escalada) es plana. Plana = la misma temperatura de softmax a cualquier dimensión.

Mensaje. El 1/√dk no es cosmética: es un control de varianza que hace al softmax independiente de la dimensión. Sin él, GPT-3 (dk = 128 por cabeza) nacería con atenciones saturadas e inentrenables.

Términos. Var(q·k): varianza del score crudo entre vectores aleatorios. H(p): entropía de Shannon de los pesos softmax, en nats. saturación: régimen con una α ≈ 1 y gradiente ≈ 0. nats: unidades de log natural (log 8 ≈ 2.08).

las ecuaciones de esta slide
Smascij = { Sij si j ≤ i;  −∞ si j > i },    A = softmax(Smasc)
la máscara causal pone −∞ en los scores hacia el futuro antes del softmax: e−∞ = 0, de modo que el token i solo reparte su peso entre los tokens 1..i. La matriz A queda triangular inferior y cada fila sigue sumando 1.
encoder (BERT): sin máscara · decoder (GPT): máscara causal · T5/BART: encoder + decoder con cross-attention
la misma operación de atención produce las tres familias de modelos cambiando solo la máscara: bidireccional para comprender (clasificación, NER), causal para generar texto, y mixta para traducir o resumir.
guion paso a paso
  1. Sin máscara, pon i = 1 («factura») y lee su fila. 0.55 de su peso va a «llegó»… que está en el futuro. Para clasificar la queja completa es legítimo (modo BERT).
  2. Activa la máscara con i = 1. El triángulo superior del heatmap se apaga; el peso que iba al futuro se RENORMALIZA entre «la» y «factura» (0.37/0.63) y la fila sigue sumando 1.000.
  3. Recorre i = 0..4 con la máscara puesta. El token 0 solo puede mirarse a sí mismo (α = 1); el último ve la frase entera. Generar es ir ampliando el pasado visible token a token.
  4. Apaga y enciende la máscara con i = 4. La última fila no cambia: para el último token no existe futuro que tapar. Por eso generar con GPT es predecir siempre desde la última fila.
Comprueba que entiendes: ¿qué pasaría si entrenas un generador SIN máscara?
El entrenamiento predice el token t+1 viendo la frase entera… incluido el propio token t+1 a través de la atención. El modelo aprende a copiarlo (loss ≈ 0, AUC de tu validación perfecta) y en producción, cuando el futuro no existe, no sabe hacer nada: es el data leakage del Día 02 en su versión más pura. La máscara causal es la garantía estructural de que el modelo solo usa información disponible en el momento de predecir — igual que un forecast de demanda jamás debe ver las ventas de la semana que predice.

Setup. Misma frase, mismas matrices, y un toggle que aplica la máscara triangular antes del softmax. Arriba: el heatmap de A; las celdas tapadas se pintan apagadas y valen exactamente 0.00. Abajo: la fila del token elegido como barras, recalculada y renormalizada en vivo.

Juega. Alterna el toggle y recorre los tokens. Fíjate en que la máscara no «borra y ya»: el softmax renormaliza, de modo que el presupuesto de atención de cada token se reparte entero entre su pasado. Las dos primeras filas son las que más cambian.

Lee así. Heatmap completo = BERT, útil cuando el texto ya existe entero (clasificar quejas, NER de contratos en BBVA). Heatmap triangular = GPT, obligatorio cuando el texto se genera de izquierda a derecha (el chatbot de atención al cliente que redacta la respuesta).

Mensaje. BERT y GPT no son arquitecturas distintas: son la misma self-attention con una máscara distinta. Una línea de código separa comprender de generar.

Términos. máscara causal: Sij = −∞ para j > i. autoregresivo: genera el token t+1 condicionando solo en 1..t. bidireccional: cada token ve toda la frase. cross-attention: queries del decoder contra keys/values del encoder.

las ecuaciones de esta slide
MHA(X) = Concat(head1,…,headH) WO,   headh = Att(XWQh, XWKh, XWVh)(Ec. MHA)
H atenciones en paralelo, cada una con sus propias matrices: cada cabeza calcula su matriz A(h) y su salida; las salidas se concatenan y una proyección final WO las mezcla y devuelve a dimensión d. Aquí H = 2 y cada cabeza trabaja en dk = 2.
dk = dH  ⇒  coste(H cabezas de d/H) ≈ coste(1 cabeza de d)
al repartir la dimensión entre cabezas (d = 512, H = 8 ⇒ dk = 64), las H atenciones juntas cuestan lo mismo que una sola grande: la diversidad de miradas sale gratis en FLOPs.
guion paso a paso
  1. Con s = 1, compara los dos heatmaps. La cabeza 1 hace sintaxis (verbo↔entidad: llegó mira a factura con 0.50); la cabeza 2 hace tiempo (TODAS las filas concentran en «ayer», hasta 0.77). Misma frase, dos relaciones distintas.
  2. Baja s a 0 despacio. El heatmap derecho converge al izquierdo y la divergencia media del lector cae a 0.000: dos cabezas idénticas no aportan nada — multi-head solo paga si las W difieren.
  3. Con s = 1 e i = 2, mira las barras de abajo. La salida por cabeza es 2-dim; concatenadas dan el vector 4-dim que WO mezcla: la salida final lleva A LA VEZ la entidad (de la cabeza 1) y el tiempo (de la cabeza 2).
  4. Recorre i con s = 1. La cabeza 2 apenas cambia entre tokens (a todos les interesa el cuándo); la cabeza 1 sí: las cabezas pueden ser una rígida y otra contextual.
Comprueba que entiendes: ¿por qué no usar UNA cabeza con dk = 4 en vez de dos con dk = 2?
Porque una cabeza produce UNA sola matriz A, y A es un compromiso: si «llegó» necesita a la vez su entidad (factura) y su tiempo (ayer), una sola distribución softmax debe repartirse entre ambos y diluye los dos mensajes en un mismo promedio de values. Dos cabezas producen DOS matrices: una puede dar 0.50 a factura y la otra 0.77 a ayer, y la concatenación conserva ambas señales en subespacios separados que WO aprende a combinar. Más dk afina el cómo se mide la afinidad; más cabezas multiplica cuántas relaciones distintas caben.

Setup. Dos cabezas sobre la misma frase, cada una con sus WQh, WKh, WVh (4×2). La cabeza 1 está diseñada para relaciones entidad–acción (¿quién hace qué?); la cabeza 2, para tiempo (¿cuándo?). El slider s interpola las matrices de la cabeza 2 desde una copia exacta de la cabeza 1 (s = 0) hasta su versión especializada (s = 1): es una caricatura honesta de lo que el entrenamiento hace gradualmente con cabezas inicializadas casi iguales. Abajo: salidas por cabeza del token elegido, concatenación y proyección final por WO, todo calculado en vivo.

Juega. Mueve s y mira la divergencia media ⟨|A(1)−A(2)|⟩ del lector: es la cuantificación de cuánto añade la segunda cabeza. Luego fija s = 1 y recorre tokens comparando los dos repartos.

Lee así. En los notebooks del curso harás esto mismo con un BERT real: heatmaps por cabeza donde una atiende a la concordancia sujeto–verbo en español y otra a entidades. Aquí ves el mecanismo con números que puedes seguir a mano.

Mensaje. Multi-head es paralelización barata de capacidad expresiva: H miradas simultáneas sobre la misma frase, al precio de una.

Términos. headh: atención completa con las matrices de la cabeza h. Concat: pegar las salidas de las H cabezas en un vector de dimensión d. WO: proyección de salida que mezcla cabezas. H: número de cabezas (8–96 en modelos reales).

las ecuaciones de esta slide
Pt,2i = sin(t/100002i/d),   Pt,2i+1 = cos(t/100002i/d),   X̃ = X + P
cada posición t recibe un vector de senos y cosenos con frecuencias decrecientes: las primeras dimensiones oscilan rápido (distinguen vecinos), las últimas lento (codifican posición gruesa). Se suma al embedding antes de la atención.
sin PE:   Att(XΠ) = Att(X) Π   (equivariante a permutaciones Π)
si barajas las filas de X, la atención devuelve las MISMAS salidas barajadas igual: ninguna salida sabe en qué posición estaba su token. Para la atención pura, la frase es una bolsa de tokens; el orden solo entra si P rompe la simetría.
guion paso a paso
  1. Mueve t por el panel de ondas. La línea dorada corta las cuatro curvas en valores únicos: cada posición tiene su firma, como un reloj con varias agujas a distinta velocidad.
  2. Sin marcar la casilla, pulsa «baraja la frase» varias veces. El lector dice max|z′π(i) − zi| = 0.000000 SIEMPRE: la salida de «factura» es idéntica vaya donde vaya. Calculado, no contado.
  3. Marca «añade PE» y baraja de nuevo. La diferencia salta a ≈0.2–0.6: ahora la posición entra en q, k y v, y mover un token cambia su salida.
  4. Compara las barras del panel inferior con y sin PE. Sin PE las dos series coinciden barra a barra; con PE se separan. «Llegó la factura duplicada ayer» ya no procesa igual que «la factura llegó duplicada ayer».
Comprueba que entiendes: ¿por qué frecuencias DISTINTAS por dimensión y no una sola onda?
Con una sola frecuencia, posiciones separadas por un periodo completo tendrían la misma firma (sin(t) = sin(t+2π)): ambigüedad. Con d/2 frecuencias en escala geométrica de 1 a 1/10000, el vector completo es único en rangos enormes de t — igual que horas, minutos y segundos juntos identifican el instante aunque cada aguja repita ciclo. Además sin/cos permiten expresar la posición t+Δ como rotación lineal de la de t, lo que facilita aprender relaciones RELATIVAS («el token de hace 3»); RoPE explota exactamente esa propiedad en los LLM actuales.

Setup. Arriba: las ondas Pt,j para cuatro dimensiones (j = 0, 2, 6, 14 con d = 16) en función de la posición t; el slider marca una posición y el lector da su firma numérica. Abajo, el experimento fuerte: tomo la frase, aplico una permutación real π a sus filas, recalculo TODA la atención (Q, K, V, softmax, Z) sobre la frase barajada y comparo la salida de cada token con la que tenía en el orden original. Las barras muestran z de «factura» en ambos órdenes.

Juega. Primero baraja sin PE: cero exacto siempre, la atención es ciega al orden. Luego activa PE (con la fórmula sinusoidal a d = 4 sobre la frase de juguete) y baraja: la igualdad se rompe porque cada token lleva pegada su posición.

Lee así. En negocio el orden ES información: «abono tras factura» y «factura tras abono» son quejas distintas; en un histórico de demanda, ¿subió antes o después de la promo? Sin PE, todo eso desaparece.

Mensaje. La atención compra acceso directo entre tokens pagando la noción de orden, y el positional encoding la recompra sumándola al embedding. Las variantes modernas (RoPE, ALiBi) cambian la suma por rotaciones o sesgos, con mejor extrapolación a contextos largos.

Términos. P: matriz T×d de codificación posicional. Π, π: permutación de las posiciones. equivariante: barajar la entrada baraja la salida igual, sin cambiarla. RoPE / ALiBi: posicionales modernos por rotación / sesgo lineal.

las ecuaciones de esta slide
X′ = X + MHA(LN(X)),    Z = X′ + MLP(LN(X′))(bloque pre-norm)
el bloque Transformer envuelve cada subcapa (atención y MLP) con una conexión residual (+X: la entrada pasa intacta y la subcapa solo añade una corrección) y un LayerNorm previo que re-estandariza. MLP = Linear(d, 4d) → GELU → Linear(4d, d).
LN(x)j = γjxj − μσ + βj,   μ = 1dΣjxj,   σ² = 1dΣj(xj−μ)²
LayerNorm normaliza sobre las features de cada token (no sobre el batch): resta la media, divide por la desviación y deja que γ, β aprendidos reescalen. Cada token sale con media 0 y varianza 1, tenga la magnitud que tenga al entrar.
guion paso a paso
  1. Con s = 1 y L = 24, compara las dos curvas de arriba. Sin residual (tinta), la similitud coseno con la entrada cae a ≈0 en pocas capas: a la capa 24 la señal original se ha esfumado. Con residual (dorada) se mantiene alta: la identidad siempre tiene un carril.
  2. Sube s a 1.5 y baja a 0.3. Sin residual, más fuerza = olvido más rápido; con residual la curva apenas se inmuta: la corrección se AÑADE, no sustituye.
  3. Desmarca LayerNorm y mira el lector de normas. ||xL|| explota o se hunde según la semilla (×10³ arriba o abajo); al remarcarla vuelve a ≈√d constante. LN es el termostato de escala.
  4. Abajo, sigue el ejemplo numérico de 4 dims. x → f(x) → x+f(x) → LN: el lector enseña μ y σ reales y la salida con media 0.000 y varianza 1.000 exactas.
Comprueba que entiendes: ¿por qué el residual también arregla el GRADIENTE?
Por la regla de la cadena, el jacobiano de x → x + f(x) es I + Jf. Al encadenar L bloques, el gradiente contiene el producto Π(I + Jl), que expandido incluye el término identidad puro: un camino de gradiente directo desde la loss hasta la capa 1 que no atraviesa ninguna multiplicación. Sin residual el producto es ΠJl, exactamente la cadena que se desvanece de la slide 1 — el mismo veneno de la RNN, pero en profundidad en vez de en tiempo. Por eso GPT-3 puede tener 96 bloques: la autopista residual lleva el gradiente a todos.

Setup. Simulo una pila de L bloques de juguete en d = 8: cada subcapa es una transformación lineal aleatoria fl(x) = s·Wlx (entradas N(0, 1/d), semilla mulberry32). Comparo dos regímenes calculados de verdad capa a capa: sin residual (x ← fl(x)) y con residual (x ← x + fl(x)), ambos con LayerNorm opcional. Arriba: similitud coseno entre xl y la entrada x0 según la profundidad. Abajo: el ejemplo numérico mínimo en 4 dimensiones, barra a barra: entrada, salida de la subcapa, suma residual y LayerNorm final.

Juega. El slider s es la «fuerza» de cada subcapa; L, cuántas apilas. El botón cambia las matrices aleatorias para comprobar que el patrón no depende de la semilla.

Lee así. La curva tinta es la slide 1 otra vez (un producto de matrices olvida), pero en profundidad. La dorada es la solución arquitectónica: con x + f(x), aunque f destruya información, x sobrevive por su carril.

Mensaje. Residual y LayerNorm no son adornos: son lo que convierte «un bloque que funciona» en «96 bloques que se pueden entrenar». Sin ellos, el Transformer profundo no existiría.

Términos. residual: salida = entrada + corrección. LN: LayerNorm, estandariza las d features de cada token. pre-norm: LN antes de la subcapa (estándar moderno). similitud coseno: cos del ángulo entre xl y x0; 1 = misma dirección, 0 = información original perdida.

las ecuaciones de esta slide
paráms/bloque ≈ 4d² atención + 8d² MLP = 12d²   ⇒   P(L, d) ≈ 12 L d²
la atención aporta WQ, WK, WV, WO (4 matrices d×d); el MLP, d×4d y 4d×d (8d²). El total del Transformer crece lineal en L y cuadrático en d: doblar la anchura cuadruplica los parámetros.
memoriafp16 ≈ 2 bytes × P    (+ V·d de embeddings, V ≈ 50 257)
cada parámetro en media precisión ocupa 2 bytes: un modelo de 7B necesita ≈14 GB solo para ALOJAR los pesos — antes de activaciones, KV-cache u optimizador. La tabla de embeddings añade V·d, dominante solo en modelos pequeños.
guion paso a paso
  1. Pon L = 12, d = 768. P ≈ 0.08B sin embeddings y ≈0.12B con ellos: acabas de construir GPT-2. El punto dorado cae sobre su línea de referencia.
  2. Pon L = 32, d = 4096. ≈6.4B: Llama-7B. Cada bloque ha pasado de 7M a 201M parámetros (×28 al multiplicar d por 5.3): ahí está el d².
  3. Pon L = 96, d = 12 288. ≈174B: GPT-3. La memoria fp16 del lector marca ≈348 GB: no cabe en ninguna GPU sola; por eso se trocea entre decenas de ellas.
  4. Activa los embeddings con L = 12, d = 256 y luego con la configuración GPT-3 (L = 96, d = 12 288). En el modelo pequeño los embeddings son ≈58% del total; en GPT-3, ≈0.4%: la tabla de vocabulario pesa solo cuando el cuerpo es enano.
Comprueba que entiendes: ¿de dónde sale el 8d² del MLP?
La regla de oro del bloque es dMLP = 4d: la primera capa lineal lleva una matriz d×4d (4d² parámetros) y la segunda 4d×d (otros 4d²); juntas, 8d². Es el doble que toda la atención (4d²): contra la intuición, dos tercios de los parámetros de un Transformer NO están en la atención sino en los MLP que procesan cada token por separado — la atención mueve información entre tokens, el MLP la transforma.

Setup. El bloque ya está completo (atención multi-head + residual + LN + MLP); ahora lo apilamos L veces y contamos parámetros con la fórmula real P ≈ 12Ld². Arriba: P en función de d (ambos ejes log) para tres profundidades de referencia (L = 12, 32, 96), con tu modelo como punto dorado y las líneas horizontales de GPT-2 (0.12B), Llama-7B (6.7B) y GPT-3 (175B). Abajo: el desglose de UN bloque, 4d² de atención contra 8d² de MLP, y tu total contra los tres modelos de referencia.

Juega. Reconstruye los tres modelos históricos con dos sliders y mira el lector de memoria: es la cifra que decide si el modelo corre en tu portátil, en una GPU de 80 GB o en un clúster.

Lee así. En el panel log-log las curvas son rectas de pendiente 2 (el d²) separadas por el factor L. Moverse en diagonal (más L y más d a la vez) es como se escala en la práctica.

Mensaje. De tu juguete de d = 4 a GPT-3 no cambia ni una ecuación: cambia L, d y los datos. Esa uniformidad brutal es la que hace predecible el coste (y el presupuesto: a ≈2€/h por GPU A100, entrenar sin una estimación de P es firmar un cheque en blanco).

Términos. L: número de bloques apilados. d: dimensión del modelo (anchura). V: tamaño del vocabulario. fp16: media precisión, 2 bytes por parámetro. KV-cache: memoria extra de inferencia para guardar keys y values pasados.

las ecuaciones de esta slide
pasos secuenciales: RNN = T,  Transformer = 1;   FLOPs/capa: RNN ≈ 8Td²,  atención ≈ 4Td² + 2T²d
la RNN no puede paralelizar sobre T (cada paso espera al anterior); la atención calcula los T² pares a la vez. El precio es el término cuadrático 2T²d: con contextos muy largos, la memoria y el tiempo duelen (lo ataca el Día 10).
ley de escala:   loss(C) ≈ a·C−0.05  ⇒  recta en log–log(Kaplan et al., Chinchilla)
el error de test cae como una potencia del cómputo durante más de seis órdenes de magnitud, sin saturar: cada ×10 de cómputo compra una mejora predecible. Esa recta convierte «entrenar más grande» en una decisión de inversión, no en una apuesta.
guion paso a paso
  1. Con T = 2048 y d = 1024, lee el lector. La RNN necesita 2048 pasos secuenciales; el Transformer, 1. Con el paralelismo de una GPU moderna, el speedup de pared ronda ×250: la diferencia entre entrenar en meses o en días.
  2. Sube T a 32 768 con d = 1024. El término 2T²d ya domina los FLOPs del Transformer (mira el desglose): el coste cuadrático deja de ser teórico. El speedup sigue siendo enorme, pero la factura crece.
  3. Sube d a 8192 con T moderado. Ahora domina 4Td² (las proyecciones): para modelos anchos con contexto corto, la atención es lo barato.
  4. Mira la recta del panel inferior. De GPT-2 a GPT-3 hay ≈3 órdenes de magnitud de cómputo sobre LA MISMA recta: nadie tuvo que rediseñar nada, solo escalar. Eso es lo que la RNN nunca ofreció.
Comprueba que entiendes: ¿por qué la paralelización importa más que los FLOPs totales?
Porque el hardware moderno (GPU/TPU) tiene decenas de miles de unidades que trabajan A LA VEZ: el coste real es tiempo de pared = FLOPs secuenciales que no se pueden repartir. La RNN tiene T dependencias en cadena: aunque cada paso sea barato, hay que esperarlos uno a uno y las unidades quedan ociosas. El Transformer hace más FLOPs totales con T grande, pero TODOS repartibles: las matrices gigantes saturan la GPU. Entrena más rápido quien mejor llena el hardware, no quien menos opera — y eso decidió qué arquitectura pudo comerse internet.

Setup. El mini-dashboard final compara RNN y Transformer con las fórmulas de coste reales. Arriba: tres pares de barras en escala log — pasos secuenciales (T contra 1), FLOPs por capa (8Td² contra 4Td² + 2T²d) y tiempo de pared estimado para una GPU que ejecuta ≈2·10⁹ operaciones por ciclo, con la restricción clave: la RNN gasta al menos un ciclo POR PASO, paralelice lo que paralelice. Abajo: la ley de escala loss ∝ C−0.05 en log–log con GPT-2, GPT-3 y Chinchilla situados sobre la recta.

Juega. T y d son tus dos palancas. Busca el régimen donde 2T²d adelanta a 4Td² (el lector lo separa): ocurre en T ≈ 2d, la frontera donde el contexto largo empieza a costar más que el modelo.

Lee así. Las cuatro razones del dominio, en orden: paraleliza (barras 1 y 3), no diluye dependencias largas (slide 1: distancia 1), escala con leyes de potencia (panel inferior) y transfiere: el mismo bloque sirve para texto, imagen (ViT), audio (Whisper) y proteínas (AlphaFold). Pre-entrenar una vez y afinar mil veces — tu práctica con RoBERTa en español es exactamente eso.

Mensaje. El Transformer dominó porque convirtió el progreso en ingeniería predecible: más cómputo, mejor modelo, sobre una recta. Su único talón de Aquiles es el T², y por eso existe el Día 10.

Términos. FLOPs: operaciones de coma flotante. tiempo de pared: tiempo real transcurrido, lo que pagas. C: cómputo total de entrenamiento (≈6·P·tokens). ley de escala: relación potencial empírica loss–cómputo.

1 — Embeddings + posición
Slides: Problema · Posición
«Cada token es un vector xi; la atención pura es ciega al orden (lo comprobamos barajando: diferencia 0.000000), así que se suma la firma sinusoidal Pt antes de empezar.»
2 — Q, K, V y atención escalada
Slides: Q·K·V · Atención · Escalado √d · Máscara
«Tres proyecciones del mismo embedding (pregunta, oferta, contenido); softmax(QK/√dk)V conecta todos con todos en un paso; el 1/√dk evita saturar el softmax; la máscara causal decide si el modelo comprende (BERT) o genera (GPT).»
3 — Multi-head
Slide: Multi-head
«H atenciones en paralelo con dk = d/H: una cabeza para quién-hace-qué, otra para cuándo; concatenar y proyectar con WO. La diversidad de miradas sale gratis en FLOPs.»
4 — El bloque: residual + LN + MLP
Slides: Residual+LN · El bloque
«X′ = X + MHA(LN(X)); Z = X′ + MLP(LN(X′)). El residual da un carril a la identidad (sin él, la similitud con la entrada muere en pocas capas), el LN estabiliza la escala, y el MLP de 4d concentra 2/3 de los parámetros: 12d² por bloque.»
5 — Apilar y escalar
Slides: El bloque · Dominio
«P ≈ 12Ld²: L = 12, d = 768 es GPT-2; L = 96, d = 12 288 es GPT-3, sin cambiar una ecuación. Paraleliza (1 paso secuencial contra T), no diluye, y mejora sobre una ley de potencia: por eso dominó texto, visión, audio y proteínas. Precio: el T² del contexto, el tema del Día 10.»

En una frase. El Transformer es una sola idea (cada token pregunta a todos los demás con un producto escalar y un softmax) envuelta en la ingeniería mínima para apilarla a lo bestia (escalado √d, multi-head, residual, LayerNorm) — y esa combinación convirtió el progreso de la IA en una recta en log–log.

Garrido-Merchán — ecgarrido@comillas.edu — Deep Learning para Business Analytics — Día 09 · Self-attention y bloque Transformer