Curso / Apéndices / Notación matemática
Apéndice · 1 de 1

Apéndice · Referencia

Notación matemática para leer papers sin perderte

El objetivo del curso es leer un paper de LLMs de punta a punta. Los papers no escriben loss = -log_probs.mean(): escriben sumatorias, gradientes, esperanzas y subíndices. Esta página junta esa notación en un solo lugar, cada símbolo con su lectura en palabras y con el código del curso al que corresponde, y cierra con todas las fórmulas del curso escritas como las escribiría el paper.

Antes de leerNinguno: es una referencia para volver desde cualquier capítulo. Si nunca viste una sumatoria, leé §1 y §2 antes de HF cap. 1 §3; si nunca viste una derivada parcial, §3 antes de fast.ai L3 §2.

🎯 Al terminar vas a poder

  • Leer en voz alta una fórmula con sumatorias, subíndices y dimensiones, y saber a qué shape de tensor corresponde cada símbolo.
  • Explicar qué es un gradiente, qué dice la regla de la cadena, y por qué el paso de SGD es una sola línea de código.
  • Leer una esperanza 𝔼 y una divergencia KL, y reconocerlas en el objetivo de GRPO y en el VAE.
  • Reconstruir, desde la notación del paper, las diez fórmulas centrales del curso: atención, RMSNorm, RoPE, LoRA, MoE, 6ND, Chinchilla, DDPM y GRPO.

0. Para qué sirve esta página

Todo lo que hay en esta página ya apareció en el curso como código o como frase. Lo que agrega es la tercera representación, la de los papers, y el puente entre las tres. Un paper dice ∑jezj; el código dice z.exp().sum(-1); en palabras, «la suma de las exponenciales de todos los logits». Cuando podés pasar de una a otra sin pensar, la fórmula deja de ser un obstáculo y pasa a ser la versión más corta de la idea.

Las fórmulas de acá están escritas en MathML, que todos los navegadores renderizan desde 2023 sin ninguna librería. Cada bloque trae debajo cómo se lee: la lectura literal en palabras, y el código o el capítulo al que corresponde. Los mismos bloques están insertados en los capítulos donde aparece cada fórmula; acá están todos juntos.

1. Símbolos, tipografía y dimensiones

La tipografía lleva información. Un paper distingue escalares, vectores y matrices por cómo escribe la letra, y los subíndices y superíndices dicen de qué pieza se habla:

Se escribeSe leeEn código
x, α, Nescalar: un número (itálica)float, o un tensor de shape ()
x, qvector (negrita minúscula)tensor de shape (d,)
W, Qmatriz (negrita mayúscula)tensor (filas, columnas); nn.Linear guarda (out, in)
xi, htla componente i; el vector en el paso tx[i], h[t]
h(l)la salida de la capa l (superíndice entre paréntesis: no es una potencia)hidden_states[l]
W⊤, W−1transpuesta; inversaW.T, torch.linalg.inv(W)
x∈ℝdx pertenece a los reales de dimensión dx.shape == (d,)
a·b, a⊤b, ⟨a,b⟩producto punto (tres notaciones para lo mismo)a @ b, (a * b).sum()
a⊙bproducto elemento a elemento (Hadamard)a * b
‖x‖, |S|norma (largo) de un vector; cantidad de elementos de un conjuntox.norm(), len(S)
≈, ∝, ∼aproximadamente; proporcional a; «distribuido según»—
argmaxif(i)el índice i que maximiza ff.argmax()
𝟙[c]indicadora: 1 si la condición c se cumple, 0 si no(c).float()
σd, offsetstride en la dimensión d; desplazamiento base en almacenamiento linealt.stride(), t.storage_offset()
v⊤Jfproducto vector-Jacobiano (VJP) en autograd reversovjp(f, x)[1](v)
GE2M1grilla de cuantización discreta de punto flotante de 4 bits (16 niveles)pesos NVFP4
RΘ,mdmatriz ortogonal diagonal por bloques de rotación de RoPErope(q, pos)
RRF(d)puntuación de fusión de rangos recíprocos en retrieval híbridoretrieval denso + BM25

Las dimensiones se declaran una vez y después se siguen con la vista. Un forward de una capa lineal, en notación de paper:

X∈ℝB×T×d,W∈ℝd×dff,XW∈ℝB×T×dff

Cómo se lee. «X pertenece a ℝ elevado a B por T por d» es la forma en que un paper dice X.shape == (B, T, d): batch, tokens, dimensión del modelo. Multiplicar por una matriz d × dff cambia solo la última dimensión. Leer las dimensiones antes que la fórmula es la mitad de entender un paper.

2. Sumas, productos y el softmax

La sumatoria ∑i=1nxi se lee «la suma de x sub i, para i desde 1 hasta n» y es un for con un acumulador, o x.sum(). El producto ∏i=1nxi es lo mismo multiplicando, x.prod() o x.cumprod() si querés todos los parciales. Cuando el rango se sobreentiende, el paper escribe solo ∑i. El promedio es una suma dividida por n, y aparece tanto que muchos papers escriben 1n∑i donde el código dice .mean(). La fórmula que más veces vas a ver con una sumatoria es el softmax:

softmax(z)i=ezi∑j=1Vezj,∑i=1Vsoftmax(z)i=1

Cómo se lee. La componente i del softmax es la exponencial del logit i dividida por la suma de todas las exponenciales; por construcción, las V componentes suman 1. Con V el tamaño del vocabulario, es la distribución sobre el próximo token; con V los tokens del contexto, son los pesos de atención.

Y la loss que lo acompaña en todo el curso, la entropía cruzada, es una suma de logaritmos con un promedio adelante:

L=−1N∑n=1Nlog⁡(pθ(yn|xn))

Cómo se lee. La entropía cruzada es menos el promedio, sobre los N ejemplos, del logaritmo de la probabilidad que el modelo (con parámetros θ) le asigna a la respuesta correcta. Si el modelo está seguro y acierta, log p ≈ 0 y la loss es chica; si le da probabilidad 0,001 al token correcto, aporta −log 0,001 ≈ 6,9. Es nn.CrossEntropyLoss.

Tres detalles de lectura. El índice de la sumatoria (i, j, n, t) es una variable muda: no aparece fuera de la suma y podés renombrarla. Cuando hay dos sumatorias anidadas, la de adentro corre completa por cada valor de la de afuera: ∑i∑jaij es un doble for, o a.sum(). Y log sin base es logaritmo natural, salvo que el paper diga otra cosa; log2 aparece en bits y perplejidad.

3. Derivadas, gradientes y el paso de SGD

∂L∂w se lee «derivada parcial de L respecto de w»: cuánto cambia la loss por unidad de cambio en w, con todo lo demás fijo. Es un número por parámetro. Juntarlos todos en un vector es el gradiente, y la regla de la cadena es la que permite calcularlos capa por capa hacia atrás:

∇wL=(∂L∂w1,∂L∂w2,…,∂L∂wn),∂L∂w=∂L∂h·∂h∂w

Cómo se lee. El gradiente ∇wL es el vector de derivadas parciales: cuánto cambia la loss si movés cada parámetro un poquito, con los demás fijos. La regla de la cadena (derecha) dice que si w afecta a L a través de h, la derivada se multiplica eslabón por eslabón: es exactamente lo que backward() hace nodo por nodo en el grafo de autograd.

El paso de descenso por gradiente, que en fast.ai L3 escribiste a mano y en PyTorch es optimizer.step():

wt+1=wt−η ∇wL(wt)

Cómo se lee. Los parámetros nuevos son los viejos menos el learning rate η por el gradiente de la loss respecto de los parámetros, evaluado en los parámetros actuales. ∇wL es el vector de derivadas parciales: una por parámetro, y es lo que .backward() deja en params.grad. La línea params.data -= lr * params.grad.data es esta fórmula.

Variantes que vas a ver escritas igual: con momentum se acumula vt+1=βvt+∇L y se resta ηvt+1; Adam divide además por la raíz de una media móvil de los gradientes al cuadrado (por eso guarda dos tensores por parámetro, los 8 bytes de la cuenta de DDP/FSDP). Y θ←θ−η∇θL con θ en vez de w es la misma cosa: θ es «todos los parámetros del modelo», la convención de los papers de LLMs.

4. Probabilidad, esperanza y KL

p(y|x) se lee «probabilidad de y dado x»; con subíndice θ, pθ, es «la que asigna el modelo». Un modelo de lenguaje es exactamente eso, una probabilidad condicional del próximo token, y su objetivo de pre-entrenamiento se escribe como un producto que se convierte en suma de logaritmos:

pθ(x1,…,xT)=∏t=1Tpθ(xt|x<t),LLM=−∑t=1Tlog⁡(pθ(xt|x<t))

Cómo se lee. La probabilidad de una secuencia entera es el producto de la probabilidad de cada token dado todos los anteriores (x<t es «los tokens antes de t»). Como los productos de números chicos se van a cero, se trabaja con la suma de logaritmos, con signo negativo para minimizar: es la loss de pre-entrenamiento de todo LLM, y la que las scaling laws predicen.

La esperanza 𝔼 es un promedio pesado por probabilidades, y en la práctica siempre se estima muestreando. La divergencia KL mide la distancia entre dos distribuciones:

𝔼x∼p[f(x)]=∑xp(x)f(x)≈1G∑i=1Gf(xi),xi∼pDKL(P‖Q)=∑xP(x)log⁡(P(x)Q(x))≥0

Cómo se lee. La esperanza de f bajo la distribución p es el promedio de f pesado por las probabilidades; en la práctica se estima muestreando G veces y promediando, que es lo que hace GRPO con sus G respuestas. La divergencia KL mide cuánto se aleja P de Q: vale 0 si coinciden y crece cuando P pone probabilidad donde Q no; es el freno de RLHF y GRPO, y el término de regularización del VAE.

Y la gaussiana, que en difusión y en el VAE aparece con el truco de reparametrización:

x∼𝒩(μ,σ2)⟺x=μ+σε,ε∼𝒩(0,1)

Cómo se lee. Una variable gaussiana de media μ y varianza σ² se puede escribir como la media más la desviación por un ruido estándar. Es el «truco de reparametrización»: convierte muestrear en una operación derivable, y es la forma en que DDPM escribe xt y el VAE escribe su latente.

5. Las fórmulas del curso, juntas

Cada una está también en su capítulo, con el contexto. Acá van en el orden en que aparecen en el curso.

Atención (HF cap. 1 §3)

Attention(Q,K,V)=softmax(QK⊤dk)V

Cómo se lee. Para cada Query, el producto punto contra todas las Keys (la matriz Q·Kᵀ tiene una fila por token y una columna por token), dividido por la raíz de la dimensión de las Keys para que el softmax no se sature, convertido en pesos que suman 1, y usados para promediar los Values. Es la tabla de arriba escrita para todos los tokens a la vez.

LoRA (HF cap. 3 §5)

h=Wx+αrBAx,B∈ℝdout×r,A∈ℝr×din

Cómo se lee. La salida de la capa es la de siempre, W·x, más una corrección de rango r: primero A comprime x a r dimensiones, después B la expande a la salida, y el resultado se escala por α/r. W queda congelada; solo A y B se entrenan, y por eso el adapter tiene r·(din + dout) parámetros por matriz.

GRPO (HF cap. 12 §3)

Ai=ri−mean(r1,…,rG)std(r1,…,rG)ρi,t=πθ(oi,t|q,oi,<t)πvieja(oi,t|q,oi,<t)

Cómo se lee. La ventaja de la respuesta i es su reward menos el promedio del grupo, dividido por la desviación del grupo: no hay value model, el grupo es la referencia. El ratio por token compara la probabilidad que la policy actual le da al token t de la respuesta i con la que le daba la policy que generó esa respuesta.

J(θ)=𝔼grupo[1G∑i=1G1|oi|∑t=1|oi|min(ρi,tAi, clip(ρi,t,1−ε,1+ε)Ai)−β DKL(πθ‖πref)]

Cómo se lee. Promedio sobre las G respuestas y sobre los tokens de cada una del término recortado (el freno de PPO), menos β veces la distancia KL a la policy de referencia. Los tres frenos del texto, en una línea: la ventaja por grupo, el clip y la KL. Las variantes de 2025 (Dr. GRPO, DAPO) cambian exactamente cómo se promedia sobre |oi| y si se divide por la desviación.

RMSNorm y RoPE (LLM 2026 · 1 §1 y §3)

RMSNorm(x)=x1d∑i=1dxi2+ϵ⊙g

Cómo se lee. Cada vector de activaciones se divide por la raíz de la media de sus cuadrados (su RMS) y se reescala dimensión a dimensión por un vector aprendido g. Comparado con LayerNorm, falta la resta de la media y el bias: es lo que la función rmsnorm de arriba calcula.

θi=base−2i/dfm(x2i,x2i+1)=(x2icos⁡(mθi)−x2i+1sin⁡(mθi),x2isin⁡(mθi)+x2i+1cos⁡(mθi))⟨fm(q),fn(k)⟩=g(q,k,m−n)

Cómo se lee. El par i de dimensiones se rota un ángulo m·θi, con m la posición del token; cada par tiene su frecuencia θi. La tercera igualdad es la propiedad que importa: el producto punto entre una Query rotada en m y una Key rotada en n solo depende de m − n. Es la función rope de arriba, vista como matemática.

Mixture of Experts (LLM 2026 · 2 §1)

y=∑i∈top-k(p)giEi(x)+Ecomp(x)p=softmax(Wrx),gi=pi∑j∈top-kpj

Cómo se lee. El router Wr produce una probabilidad por experto; se toman los k mejores, sus probabilidades se renormalizan entre sí (los gi), y la salida es la suma ponderada de esas k FFN más la compartida, que no pasa por el router. Es el forward de CapaMoE línea por línea.

Scaling laws (LLM 2026 · 3 §1 y §3)

C≈6ND,Cinferencia≈2Nactivospor token

Cómo se lee. FLOPs totales de entrenamiento: seis por parámetro y por token (dos del forward, cuatro del backward). En inferencia, dos por parámetro activo por token generado. La atención agrega un término proporcional al contexto al cuadrado, despreciable salvo con contexto muy largo.

L(N,D)=E+ANα+BDβ

Cómo se lee. La loss es una entropía irreducible E más lo que cuesta tener un modelo finito (cae como una potencia de N) más lo que cuesta tener datos finitos (cae como una potencia de D). Hoffmann et al.: E = 1,69, A = 406,4, B = 410,7, α = 0,34, β = 0,28. Ajuste corregido de Besiroglu et al. (2024), el de las figuras: E = 1,82, A = 482, B = 2085, α = 0,348, β = 0,366.

Difusión (fast.ai P2 U3 §1)

q(xt|x0)=𝒩(xt;α¯tx0,(1−α¯t)I)α¯t=∏s=1tαs,xt=α¯tx0+1−α¯tε

Cómo se lee. La distribución de la imagen ruidosa en el paso t, dada la limpia, es una gaussiana centrada en la imagen atenuada por √ᾱt y con varianza 1 − ᾱt. ᾱt es el producto de todos los α hasta t (torch.cumprod). La tercera igualdad es cómo se muestrea de esa gaussiana con un ε ~ 𝒩(0, I): la línea xt = ᾱ[t].sqrt()*x0 + (1-ᾱ[t]).sqrt()*ruido.

Aritmética de Strides y Almacenamiento Lineal (PyTorch 1 §2)

Index1D=offset+∑d=0D-1id·σd

Cómo se lee. La posición física en el bloque contiguo de memoria 1D de un tensor N-dimensional es el offset base más la suma de cada coordenada id multiplicada por su salto de memoria (stride) σd. Explica por qué una transposición no copia memoria y cómo un stride cero emite broadcasting sin duplicar datos en VRAM.

Flow Matching ODE (fast.ai P2 U3 y Aplicado 5)

dxtdt=ut(xt)=x1-x0,xt=(1-t)x0+tx1,t∈[0,1]

Cómo se lee. La trayectoria de probabilidad entre el ruido x0 y la imagen limpia x1 es una línea recta en el espacio euclidiano con velocidad constante ut = x1 − x0. A diferencia de las trayectorias curvas estocásticas de DDPM (SDE), el campo vectorial recto permite resolver la generación con solvers ODE en apenas 10 a 20 pasos de integración.

Cuantización Jerárquica NVFP4 (Aplicado 1 §1)

w≈sg·sb·q,q∈GE2M1, sb∈E4M3, sg∈FP32

Cómo se lee. Cada peso continuo w se aproxima por un escalar entero/subnormal de 4 bits q en la retícula discreta E2M1, multiplicado por un factor de escala local de bloque sb (en microfloat FP8 E4M3 para 16 elementos) y un factor de escala global sg (FP32). Esta jerarquía bidimensional desacopla el rango dinámico global de los outliers locales.

Enrutamiento MoE sin Loss Auxiliar (LLM 2026 · 2 §2)

Scorei=si+bi,gi=si∑j∈Ksj,bi←bi+γ(1E-fi)

Cómo se lee. DeepSeek-V3 calcula el score de selección sumando un sesgo bi a la afinidad sigmoide si. El top-k se elige sobre Score, pero la ponderación de salida gi usa si puro. El sesgo bi se ajusta externamente mediante realimentación proporcional sobre la fracción observada de carga fi, logrando balanceo perfecto entre GPUs sin penalizar la loss del modelo con términos auxiliares.

Reciprocal Rank Fusion (LLM 2026 · 4 §1)

RRF(d∈D)=∑m∈M1k+rm(d)

Cómo se lee. La relevancia final del pasaje d es la suma inversa de su posición de ranking rm(d) en cada motor m (vectorial denso y léxico BM25), suavizada por una constante k = 60. Es independiente de la calibración de escalas continuas y prioriza los documentos que aparecen arriba en ambos índices simultáneamente.

6. Cómo leer una fórmula de un paper

  1. Primero las dimensiones, después la fórmula. Buscá dónde el paper declara X∈ℝ… y anotá el shape de cada símbolo. Si una multiplicación no cuadra en dimensiones, leíste mal un subíndice.
  2. Identificá qué es variable muda y qué es parámetro. Los índices de las sumatorias desaparecen; θ, W, A, B son lo que se entrena; x, y, t son datos. Un paper que dice «maximizamos J(θ)» está diciendo «entrenamos θ».
  3. Leé de adentro hacia afuera. En el objetivo de GRPO: primero el ratio ρ, después el clip, después el min, después las dos sumatorias, al final la esperanza y la KL. Cada capa es una función que envuelve a la anterior, igual que en código.
  4. Traducí a una línea de PyTorch. Si no podés escribir la fórmula como una operación sobre tensores con los shapes de (1), todavía no la entendiste. Casi todas las de esta página caben en una línea.
  5. Desconfiá del formato. «Emergent», «optimal», «≈» sin cota y «we observe» sin figura son las señales que las páginas de scaling laws y de evaluación te enseñaron a leer.

7. Errores comunes

ErrorPor qué pasaQué hacer
Leer h(l) como «h a la l»El superíndice entre paréntesis es un índice de capa, no una potencia.Paréntesis en el superíndice = índice; sin paréntesis = potencia o transpuesta (§1).
Confundir Wx con xWLos papers suelen escribir vectores columna (W·x); PyTorch aplica x @ W.T con W de shape (out, in).Mirar los shapes: nn.Linear(in, out).weight es (out, in) y el forward es x @ W.T + b (§1).
Olvidar el signo menos de la entropía cruzadalog p es negativo (p < 1); minimizar log p sería empeorar el modelo.La loss es −log p, siempre positiva; CrossEntropyLoss ya lo incluye (§2).
Tratar la esperanza como algo que se calcula exactoSumar sobre todas las secuencias posibles es imposible; el paper lo sabe y muestrea.Leer 𝔼 como «promedio sobre muestras»; el número de muestras (G, batch) es un hiperparámetro que el paper reporta (§4).
Leer KL como una distancia simétricaKL(P‖Q) ≠ KL(Q‖P); el orden dice quién es la referencia.En RL la referencia es la policy vieja o base, y va a la derecha de la barra (§4).
Saltar la fórmula y leer solo la prosaLa prosa de un paper es marketing; la fórmula es el contrato.Traducirla a una línea de PyTorch antes de creer la conclusión (§6).

8. Resumen

  1. Tipografía = tipo: itálica escalar, negrita minúscula vector, negrita mayúscula matriz; ∈ℝa×b es el shape.
  2. Sumatorias y productos son loops con acumulador; el softmax y la entropía cruzada son las dos sumatorias que más vas a ver.
  3. El gradiente es el vector de derivadas parciales; la regla de la cadena es backward; SGD es una resta.
  4. p(y|x) es el modelo; 𝔼 es un promedio pesado que se estima muestreando; KL es la distancia asimétrica a una referencia.
  5. Las diez fórmulas del curso (atención, LoRA, GRPO, RMSNorm, RoPE, MoE, 6ND, Chinchilla, DDPM) caben cada una en una línea de PyTorch, y esa traducción es la prueba de haberlas entendido.

9. Ponete a prueba

Respondé antes de abrir cada respuesta. Si fallás una, volvé a la sección indicada.

1. Un paper escribe H∈ℝT×d y WQ∈ℝd×dk. ¿Qué shape tiene Q=HWQ y qué línea de PyTorch es?

(T, d) por (d, dk) da (T, dk): una Query de dimensión dk por token. En PyTorch, Q = H @ W_Q, o q_proj(H) si WQ vive en un nn.Linear(d, d_k) (que la guarda transpuesta). (§1)

2. Escribí la entropía cruzada de un batch de N tokens como una línea de PyTorch a partir de logits de shape (N, V) y y de shape (N,).

-torch.log_softmax(logits, -1)[torch.arange(N), y].mean(): el log-softmax da log p para cada token del vocabulario, se indexa la probabilidad del correcto, se promedia con signo menos. Es F.cross_entropy(logits, y). (§2)

3. ¿Qué dice la regla de la cadena sobre por qué backward recorre el grafo al revés?

Que la derivada de la loss respecto de un parámetro profundo es el producto de las derivadas locales de cada operación entre ese parámetro y la loss. Para no recalcular, se empieza desde la loss (derivada 1) y se multiplica hacia atrás, reutilizando en cada nodo el producto acumulado: eso es el recorrido inverso del DAG. (§3)

4. En el objetivo de GRPO, ¿por qué hay una esperanza afuera y dos sumatorias adentro, y qué se muestrea para estimar la esperanza?

La esperanza es sobre los prompts y los grupos de respuestas que la policy genera; no se puede calcular exacta y se estima con el batch de prompts y las G respuestas por prompt. Las sumatorias son sobre las G respuestas y sobre los tokens de cada una, y esas sí se calculan completas. (§4, §5)

5. ¿Por qué x=α¯tx0+1−α¯tε es «muestrear de 𝒩(α¯tx0,(1−α¯t)I)»?

Por reparametrización: una gaussiana de media μ y varianza σ² es μ + σ·ε con ε estándar. Acá μ = √ᾱt·x0 y σ = √(1 − ᾱt). Escribirlo así hace que x sea una función derivable de x0 y del ruido. (§4, §5)

10. Para practicar

✏️ Ejercicio 1 — cada fórmula, en una línea de PyTorch

Para las diez fórmulas de §5, escribí la operación sobre tensores con shapes explícitos y verificá contra la implementación del curso: softmax(Q @ K.T / d_k**0.5) @ V contra F.scaled_dot_product_attention; tu RMSNorm contra torch.nn.RMSNorm; la ventaja de GRPO contra (r - r.mean()) / r.std(); la de DDPM contra ᾱ[t].sqrt()*x0 + (1-ᾱ[t]).sqrt()*ruido. Usá torch.allclose.

Pista / qué esperar

Las diez dan True con tolerancia 1e-5 en float32, salvo dos trampas: la atención de PyTorch espera (…, T, d) y aplica la máscara causal solo si se la pedís, y r.std() divide por n − 1 por defecto (unbiased=True); TRL usa la desviación poblacional. Si una no cierra, el error está en un shape o en una convención, nunca en la fórmula.

✏️ Ejercicio 2 — leer un paper con el método de §6

Abrí el paper de DeepSeek-V3 (arXiv:2412.19437), sección 2.1.2 (DeepSeekMoE). Anotá el shape de cada símbolo de la ecuación de la salida de la capa MoE, identificá qué es parámetro y qué es índice mudo, y escribí la ecuación como el forward de CapaMoE de la página de MoE. Después hacé lo mismo con la ecuación del balanceo sin loss (el sesgo bi).

Pista / qué esperar

La salida es el residual más la suma de los expertos compartidos más la suma ponderada de los ruteados, con los pesos g calculados por top-k y renormalizados: la fórmula de §5 con un término más por el residual. En el balanceo, el sesgo entra solo en la selección (topk(s + b)) y no en el peso (s a secas): esa asimetría es todo el truco, y se ve más claro en la fórmula que en la prosa.

11. Fuentes y para seguir