Tercera parte de un tríptico. La primera, La forma de lo probable, plantea el argumento; la segunda, La forma de lo probable, sin fórmulas, lo cuenta con esquemas. Esta parte escribe el mecanismo completo, ecuación por ecuación.

En la primera parte sostuve que el algoritmo de un modelo de lenguaje cabe en unas pocas páginas. Esta parte pone a prueba esa afirmación: escribe el algoritmo entero, desde el prompt convertido en matriz hasta la función que se minimiza, y muestra en qué lugar exacto de las ecuaciones la verosimilitud se separa de la verdad.

Afirmar que algo es simple es fácil; demostrarlo exige escribirlo. Lo que sigue es una reconstrucción formal de un transformer de solo decodificador, la arquitectura de los modelos de lenguaje actuales, con la notación más estándar posible. Las variantes industriales difieren en detalles (normalización, activaciones, codificación de posición), y señalaré las más relevantes, pero el esqueleto es este. La tesis que interesa no es técnica: es que, una vez escrito todo, se ve que lo que falta en las ecuaciones es precisamente lo que el sistema sabe.

Notación

Escribo los vectores en negrita minúscula, x\mathbf{x}, y las matrices en mayúscula, WW. Un vector es una fila cuando forma parte de una matriz de secuencia. El vocabulario es un conjunto finito V\mathcal{V} de tamaño ∣V∣|\mathcal{V}|; dd es la dimensión del modelo, nn la longitud de la secuencia, LL el número de capas y HH el número de cabezas de atención. El conjunto de todos los parámetros se denota θ\theta.

La neurona y la capa

Una neurona artificial es una función Rm→R\mathbb{R}^m \to \mathbb{R} de la forma

y=φ(w⊤x+b)=φ(∑i=1mwixi+b)y = \varphi\left(\mathbf{w}^{\top}\mathbf{x} + b\right) = \varphi\left(\sum_{i=1}^{m} w_i x_i + b\right)

donde φ\varphi es una función no lineal. Una capa de kk neuronas que comparten la entrada se escribe como una sola operación matricial:

y=φ(Wx+b),W∈Rk×m,  b∈Rk\mathbf{y} = \varphi\left(W\mathbf{x} + \mathbf{b}\right), \qquad W \in \mathbb{R}^{k \times m},\; \mathbf{b} \in \mathbb{R}^{k}

con φ\varphi aplicada componente a componente. Una red de LL capas es una composición f=fL∘⋯∘f1f = f_L \circ \cdots \circ f_1.

La justificación teórica de esta arquitectura es el teorema de aproximación universal, probado por George Cybenko para activaciones sigmoidales (Mathematics of Control, Signals and Systems, 1989) y generalizado por Hornik, Stinchcombe y White (Neural Networks, 1989). En su forma clásica dice que, para toda función continua ff sobre un compacto K⊂RmK \subset \mathbb{R}^m y todo ε>0\varepsilon > 0, existe una red con una sola capa oculta tal que

sup⁡x∈K∣f(x)−∑j=1Nαj σ(wj⊤x+bj)∣<ε\sup_{\mathbf{x} \in K} \left| f(\mathbf{x}) - \sum_{j=1}^{N} \alpha_j\, \sigma\left(\mathbf{w}_j^{\top}\mathbf{x} + b_j\right) \right| < \varepsilon

Conviene leer el teorema con cuidado, porque se lo cita mucho más de lo que se lo entiende. Garantiza existencia, no construcción: no dice cuántas neuronas NN hacen falta ni cómo encontrar los pesos. Que una red pueda representar una función no implica que el entrenamiento la vaya a encontrar. La profundidad, en la práctica, es lo que vuelve alcanzables representaciones que con una sola capa exigirían un número astronómico de neuronas.

Sin la no linealidad, todo esto colapsa: la composición de funciones afines es afín, W2(W1x+b1)+b2=W′x+b′W_2(W_1\mathbf{x} + \mathbf{b}_1) + \mathbf{b}_2 = W'\mathbf{x} + \mathbf{b}', y mil capas equivaldrían a una.

El prompt es una matriz

Este es el punto que más se pasa por alto en la divulgación: la red nunca ve un texto. Ve una matriz.

El primer paso es la tokenización. Un algoritmo de segmentación en subpalabras, típicamente una variante de byte pair encoding (Sennrich, Haddow y Birch, ACL, 2016), convierte el texto en una secuencia de índices t1,…,tn∈{1,…,∣V∣}t_1, \dots, t_n \in \{1, \dots, |\mathcal{V}|\}. El tokenizador no se entrena junto con la red: es un preprocesamiento fijo.

El segundo paso es la incrustación. Sea E∈R∣V∣×dE \in \mathbb{R}^{|\mathcal{V}| \times d} la matriz de embeddings y ut∈{0,1}∣V∣\mathbf{u}_t \in \{0,1\}^{|\mathcal{V}|} el vector indicador del token tt. La incrustación es una selección de fila:

et=E⊤ut∈Rd\mathbf{e}_t = E^{\top}\mathbf{u}_t \in \mathbb{R}^{d}

Apilando las filas de toda la secuencia, y sumando una codificación de posición pk\mathbf{p}_k que veremos enseguida, se obtiene la matriz de entrada:

X(0)=(et1+p1⋮etn+pn)∈Rn×dX^{(0)} = \begin{pmatrix} \mathbf{e}_{t_1} + \mathbf{p}_1 \\ \vdots \\ \mathbf{e}_{t_n} + \mathbf{p}_n \end{pmatrix} \in \mathbb{R}^{n \times d}

Esa matriz es, literalmente, lo que la red recibe de una pregunta. Un prompt de mil tokens en un modelo con d=4096d = 4096 es una matriz de cuatro millones de números. Todo lo que sigue son transformaciones de esa matriz que conservan su forma n×dn \times d hasta la última capa. El recorrido completo, con sus dimensiones, es este:

t1:n→  E  X(0)∈Rn×d→  bloque1  X(1)→  ⋯  X(L)→  WU  Z∈Rn×∣V∣→  softmax  Pt_{1:n} \xrightarrow{\;E\;} X^{(0)} \in \mathbb{R}^{n \times d} \xrightarrow{\;\text{bloque}_1\;} X^{(1)} \xrightarrow{\;\cdots\;} X^{(L)} \xrightarrow{\;W_U\;} Z \in \mathbb{R}^{n \times |\mathcal{V}|} \xrightarrow{\;\text{softmax}\;} P

La fórmula del seno

La atención, como se verá, trata la secuencia como un conjunto: si se permutan las filas de XX, la salida se permuta igual. Sin información adicional, “el perro mordió al hombre” y “el hombre mordió al perro” serían indistinguibles. Vaswani y colaboradores resolvieron esto en el artículo original del transformer (“Attention Is All You Need”, 2017) con una codificación fija, construida con senos y cosenos:

PE(pos, 2i)=sin⁡(pos100002i/d),PE(pos, 2i+1)=cos⁡(pos100002i/d)\mathrm{PE}_{(pos,\,2i)} = \sin\left(\frac{pos}{10000^{2i/d}}\right), \qquad \mathrm{PE}_{(pos,\,2i+1)} = \cos\left(\frac{pos}{10000^{2i/d}}\right)

para i=0,1,…,d/2−1i = 0, 1, \dots, d/2 - 1. La intuición es la de un reloj con muchas agujas: cada par de dimensiones gira a una frecuencia distinta, ωi=10000−2i/d\omega_i = 10000^{-2i/d}, con longitudes de onda que crecen en progresión geométrica desde 2π2\pi hasta 10000⋅2π10000 \cdot 2\pi. Las agujas rápidas distinguen posiciones vecinas; las lentas, posiciones lejanas. Cada posición queda marcada por la configuración conjunta de todas las agujas.

La elección no es estética. Tiene una propiedad que justifica el seno por encima de cualquier otra función periódica. Para cada frecuencia, el par correspondiente a la posición pos+kpos + k se obtiene del par de la posición pospos mediante una rotación que depende solo de kk:

(sin⁡(ωi(pos+k))cos⁡(ωi(pos+k)))=(cos⁡(ωik)sin⁡(ωik)−sin⁡(ωik)cos⁡(ωik))(sin⁡(ωi pos)cos⁡(ωi pos))\begin{pmatrix} \sin\left(\omega_i (pos + k)\right) \\ \cos\left(\omega_i (pos + k)\right) \end{pmatrix} = \begin{pmatrix} \cos(\omega_i k) & \sin(\omega_i k) \\ -\sin(\omega_i k) & \cos(\omega_i k) \end{pmatrix} \begin{pmatrix} \sin(\omega_i\, pos) \\ \cos(\omega_i\, pos) \end{pmatrix}

La demostración es la fórmula del seno de una suma, sin⁡(a+b)=sin⁡acos⁡b+cos⁡asin⁡b\sin(a + b) = \sin a \cos b + \cos a \sin b, y su análoga para el coseno. Lo importante es la consecuencia: la posición relativa es una transformación lineal independiente de la posición absoluta. Una red hecha de transformaciones lineales puede, entonces, aprender a razonar en términos de “tres tokens atrás” sin importar dónde esté en el texto.

Muchos modelos actuales, entre ellos la familia LLaMA (Touvron y otros, 2023), llevan esta idea a su conclusión lógica con la codificación rotatoria de Su y colaboradores (RoFormer, 2021). En lugar de sumar la posición, rotan directamente los vectores de consulta y clave: si RmR_m es la matriz de rotación por bloques asociada a la posición mm, entonces

⟨Rmq, Rnk⟩=q⊤Rm⊤Rn k=q⊤Rn−m k\left\langle R_m \mathbf{q},\, R_n \mathbf{k} \right\rangle = \mathbf{q}^{\top} R_m^{\top} R_n\, \mathbf{k} = \mathbf{q}^{\top} R_{n-m}\, \mathbf{k}

porque las rotaciones del mismo plano conmutan y Rm⊤=R−mR_m^{\top} = R_{-m}. El producto escalar entre dos tokens depende solo de su distancia n−mn - m. El seno de 2017 sigue estando, ahora dentro de una matriz de rotación.

La atención

Cada bloque del transformer contiene un mecanismo de atención. A partir de la matriz de entrada X∈Rn×dX \in \mathbb{R}^{n \times d} se calculan tres proyecciones con matrices aprendidas WQ,WK,WV∈Rd×dkW_Q, W_K, W_V \in \mathbb{R}^{d \times d_k}:

Q=XWQ,K=XWK,V=XWVQ = X W_Q, \qquad K = X W_K, \qquad V = X W_V

Cada fila de QQ es una consulta; cada fila de KK, una clave; cada fila de VV, un valor. La atención compara cada consulta con todas las claves y devuelve un promedio ponderado de los valores:

Attention(Q,K,V)=softmax(QK⊤dk+M)V\mathrm{Attention}(Q, K, V) = \mathrm{softmax}\left(\frac{Q K^{\top}}{\sqrt{d_k}} + M\right) V

donde la softmax se aplica por filas. La matriz QK⊤∈Rn×nQ K^{\top} \in \mathbb{R}^{n \times n} contiene el puntaje de afinidad entre cada par de tokens. La matriz MM es la máscara causal, que impide que un token vea los que vienen después:

Mij={0si j≤i−∞si j>iM_{ij} = \begin{cases} 0 & \text{si } j \le i \\ -\infty & \text{si } j > i \end{cases}

El factor dk\sqrt{d_k} tiene una justificación precisa. Si las componentes de q\mathbf{q} y k\mathbf{k} son independientes, de media cero y varianza uno, entonces

E[q⊤k]=0,Var(q⊤k)=∑i=1dkVar(qiki)=dk\mathbb{E}\left[\mathbf{q}^{\top}\mathbf{k}\right] = 0, \qquad \mathrm{Var}\left(\mathbf{q}^{\top}\mathbf{k}\right) = \sum_{i=1}^{d_k} \mathrm{Var}(q_i k_i) = d_k

Sin la corrección, con dk=128d_k = 128, los puntajes tendrían desvío típico cercano a 11, la softmax se saturaría en casi un solo valor y sus gradientes serían prácticamente nulos. Dividir por dk\sqrt{d_k} devuelve la varianza a uno.

En la práctica se usan HH cabezas en paralelo, cada una con sus propias proyecciones, y se concatenan:

MultiHead(X)=Concat(head1,…,headH)WO,headh=Attention(XWQh,XWKh,XWVh)\mathrm{MultiHead}(X) = \mathrm{Concat}\left(\mathrm{head}_1, \dots, \mathrm{head}_H\right) W_O, \qquad \mathrm{head}_h = \mathrm{Attention}\left(X W_Q^{h}, X W_K^{h}, X W_V^{h}\right)

con Hdk=dH d_k = d y WO∈Rd×dW_O \in \mathbb{R}^{d \times d}. Aquí aparece una distinción que en la primera parte formulé en prosa: las matrices WW son fijas después del entrenamiento, pero la matriz de pesos de atención softmax(QK⊤/dk+M)\mathrm{softmax}(QK^{\top}/\sqrt{d_k} + M) se recalcula para cada texto. Lo aprendido es la regla con la que se atiende; a quién se atiende se decide en el momento.

La matriz de afinidades es n×nn \times n, de modo que el costo de la atención crece como O(n2d)\mathcal{O}(n^2 d). Esa sola expresión explica por qué ampliar la ventana de contexto es caro: duplicar el texto cuadruplica la cuenta.

El bloque completo

Un bloque combina la atención con una red feedforward clásica, ambas envueltas en conexiones residuales y normalización. En la variante con normalización previa, hoy dominante, un bloque transforma XX así:

X′=X+MultiHead(LN(X)),X"=X′+FFN(LN(X′))X' = X + \mathrm{MultiHead}\left(\mathrm{LN}(X)\right), \qquad X" = X' + \mathrm{FFN}\left(\mathrm{LN}(X')\right)

La normalización por capa (Ba, Kiros y Hinton, 2016) se aplica a cada fila x∈Rd\mathbf{x} \in \mathbb{R}^d:

LN(x)=γ⊙x−μs2+ϵ+β,μ=1d∑j=1dxj,s2=1d∑j=1d(xj−μ)2\mathrm{LN}(\mathbf{x}) = \boldsymbol{\gamma} \odot \frac{\mathbf{x} - \mu}{\sqrt{s^2 + \epsilon}} + \boldsymbol{\beta}, \qquad \mu = \frac{1}{d}\sum_{j=1}^{d} x_j, \quad s^2 = \frac{1}{d}\sum_{j=1}^{d} (x_j - \mu)^2

La red feedforward actúa sobre cada token por separado, con una dimensión intermedia que suele ser dff≈4dd_{ff} \approx 4d:

FFN(x)=W2 φ(W1x+b1)+b2,W1∈Rdff×d,  W2∈Rd×dff\mathrm{FFN}(\mathbf{x}) = W_2\, \varphi\left(W_1 \mathbf{x} + \mathbf{b}_1\right) + \mathbf{b}_2, \qquad W_1 \in \mathbb{R}^{d_{ff} \times d},\; W_2 \in \mathbb{R}^{d \times d_{ff}}

Aquí reaparecen las neuronas del principio: cada fila de W1W_1 es una neurona. La activación original era la ReLU; hoy predominan la GELU, GELU(x)=x Φ(x)\mathrm{GELU}(x) = x\,\Phi(x) con Φ\Phi la distribución normal acumulada (Hendrycks y Gimpel, 2016), y variantes con compuertas como SwiGLU (Shazeer, 2020).

Las conexiones residuales permiten una lectura que la interpretabilidad ha vuelto central: la matriz XX funciona como un canal de comunicación, el residual stream, en el que cada capa lee y escribe incrementos sin borrar lo anterior (Elhage y otros, “A Mathematical Framework for Transformer Circuits”, 2021). El modelo no reemplaza representaciones; las va sumando.

Contar los parámetros

Con las ecuaciones escritas, puede verificarse una cifra que suele repetirse sin explicación. Cada bloque tiene cuatro matrices de atención de d×dd \times d y dos matrices de la red feedforward de d×4dd \times 4d. Despreciando sesgos y normalizaciones, que son de orden dd:

Nbloque≈4d2+2⋅4d2=12 d2,Ntotal≈12 L d2+∣V∣ dN_{\text{bloque}} \approx 4d^2 + 2 \cdot 4d^2 = 12\, d^2, \qquad N_{\text{total}} \approx 12\, L\, d^2 + |\mathcal{V}|\, d

Con d=4096d = 4096, L=32L = 32 y ∣V∣=32 000|\mathcal{V}| = 32\,000, el primer término da 12⋅32⋅40962≈6,44×10912 \cdot 32 \cdot 4096^2 \approx 6{,}44 \times 10^9 y la matriz de embeddings agrega 1,3×1081{,}3 \times 10^8. Si la matriz de salida no se comparte con la de entrada, se suman otros 1,3×1081{,}3 \times 10^8, y el total ronda los 6,7×1096{,}7 \times 10^9: es la cifra que se informa para el modelo de siete mil millones de parámetros de la familia LLaMA, que usa SwiGLU con una dimensión intermedia elegida para mantener aproximadamente esos 8d28d^2. El “7B” no es una etiqueta comercial; es una consecuencia aritmética de tres números.

La salida

Después de LL bloques y una normalización final, la última fila hn\mathbf{h}_n de X(L)X^{(L)} se proyecta sobre el vocabulario:

z=WU hn∈R∣V∣\mathbf{z} = W_U\, \mathbf{h}_n \in \mathbb{R}^{|\mathcal{V}|}

En muchos modelos WU=EW_U = E, una técnica llamada atadura de pesos (Press y Wolf, EACL, 2017): la misma matriz que convierte tokens en vectores convierte vectores en puntajes. Los puntajes ziz_i, llamados logits, se transforman en una distribución con una softmax con temperatura T>0T > 0:

P(tn+1=i∣t1:n)=exp⁡(zi/T)∑j=1∣V∣exp⁡(zj/T)P(t_{n+1} = i \mid t_{1:n}) = \frac{\exp(z_i / T)}{\sum_{j=1}^{|\mathcal{V}|} \exp(z_j / T)}

Los casos límite aclaran el parámetro. Cuando T→0+T \to 0^{+}, la distribución se concentra en arg⁡max⁡izi\arg\max_i z_i y el muestreo se vuelve la decodificación voraz. Cuando T→∞T \to \infty, tiende a la uniforme sobre V\mathcal{V}. Entre ambos extremos se suele truncar la cola con el muestreo de núcleo, que conserva el menor conjunto de tokens cuya probabilidad acumulada supera un umbral pp (Holtzman y otros, ICLR, 2020).

La autorregresión

El token elegido se agrega a la secuencia y el proceso se repite. Formalmente, el modelo define la probabilidad de un texto completo mediante la regla de la cadena:

Pθ(t1,…,tn)=∏k=1nPθ(tk∣t1,…,tk−1)P_\theta(t_1, \dots, t_n) = \prod_{k=1}^{n} P_\theta\left(t_k \mid t_1, \dots, t_{k-1}\right)

La máscara causal es lo que hace legítima esta factorización: la representación del token kk depende solo de los anteriores. Y tiene una consecuencia práctica: las filas de KK y VV de los tokens ya procesados no cambian al agregar uno nuevo, de modo que se guardan en memoria, la llamada caché KV, y cada paso nuevo cuesta O(nd)\mathcal{O}(n d) por capa en lugar de recalcular todo.

El entrenamiento

Dado un corpus, el entrenamiento minimiza la entropía cruzada promedio de la predicción del token siguiente:

L(θ)=−1N∑k=1Nlog⁡Pθ(tk∣t<k)\mathcal{L}(\theta) = -\frac{1}{N} \sum_{k=1}^{N} \log P_\theta\left(t_k \mid t_{<k}\right)

Su exponencial, PPL=exp⁡(L)\mathrm{PPL} = \exp\left(\mathcal{L}\right), es la perplejidad: el número efectivo de opciones entre las que el modelo duda en cada paso.

El gradiente respecto de los logits tiene una forma notablemente simple. Para un solo paso, con yy el token correcto, la pérdida es ℓ=−zy+log⁡∑jezj\ell = -z_y + \log \sum_j e^{z_j}, y por lo tanto

∂ℓ∂zi=pi−1[i=y]\frac{\partial \ell}{\partial z_i} = p_i - \mathbb{1}[i = y]

es decir, la diferencia entre la distribución predicha y la verdadera, vista como vector indicador. Ese error se propaga hacia atrás, capa por capa, mediante la regla de la cadena: es la retropropagación de Rumelhart, Hinton y Williams (Nature, 1986). Los parámetros se actualizan con alguna variante del descenso por gradiente,

θs+1=θs−η ∇θL(θs)\theta_{s+1} = \theta_s - \eta\, \nabla_\theta \mathcal{L}(\theta_s)

en la práctica con el optimizador Adam (Kingma y Ba, ICLR, 2015), que adapta el tamaño de paso de cada parámetro según sus gradientes recientes.

La relación entre escala y rendimiento resultó sorprendentemente regular. Kaplan y colaboradores (2020) encontraron que la pérdida decrece como una ley de potencia en el número de parámetros, aproximadamente L(N)≈(Nc/N)αN\mathcal{L}(N) \approx (N_c / N)^{\alpha_N} con αN\alpha_N cercano a 0,076, y Hoffmann y colaboradores (2022) mostraron que, para un presupuesto de cómputo dado, conviene entrenar con del orden de veinte tokens por parámetro. Son regularidades empíricas, no leyes derivadas, y su extrapolación es materia de debate.

Dónde se separan lo verosímil y lo verdadero

Llego al punto que justifica el tríptico. Minimizar la entropía cruzada equivale a maximizar la verosimilitud del corpus:

θ^=arg⁡max⁡θ∏k=1NPθ(tk∣t<k)\hat{\theta} = \arg\max_{\theta} \prod_{k=1}^{N} P_\theta\left(t_k \mid t_{<k}\right)

Y la pérdida esperada admite una descomposición que vuelve explícito qué se está optimizando. Si pp es la distribución que generó los datos,

Ex∼p[−log⁡Pθ(x)]=H(p)+DKL(p ∥ Pθ)\mathbb{E}_{x \sim p}\left[-\log P_\theta(x)\right] = H(p) + D_{\mathrm{KL}}\left(p \,\|\, P_\theta\right)

La entropía H(p)H(p) no depende de θ\theta. Lo único que el entrenamiento puede reducir es la divergencia de Kullback-Leibler entre la distribución del texto humano y la del modelo. La lectura es precisa y, a mi juicio, decisiva: la función objetivo contiene a pp, la distribución de lo que se escribió, y no contiene ningún término para lo verdadero. La verdad entra al sistema solo de manera indirecta, en la medida en que lo escrito tiende a ser verdadero. Cuando ambas cosas coinciden, el modelo acierta; cuando divergen, el modelo sigue a pp, porque es lo único que se le pidió.

Hay una segunda observación formal, más sutil. La softmax impone ∑iP(tn+1=i∣t1:n)=1\sum_i P(t_{n+1} = i \mid t_{1:n}) = 1 en cada paso. El modelo no tiene un estado “no sé”: está obligado a repartir toda la masa de probabilidad entre los tokens del vocabulario, incluso cuando la información del contexto no alcanza. La abstención solo existe si se aprendió como una secuencia de palabras más, con su propia probabilidad.

La literatura reciente le dio a esta intuición una forma más fuerte. Kalai y Vempala (STOC, 2024) demostraron que un modelo bien calibrado, en un sentido estadístico preciso, debe alucinar sobre ciertos tipos de hechos con una frecuencia acotada inferiormente por la proporción de hechos que aparecen una sola vez en los datos de entrenamiento, una estimación emparentada con el estimador de Good-Turing. Al mismo tiempo, Kadavath y colaboradores (2022) mostraron que los modelos grandes están parcialmente calibrados: sus probabilidades internas contienen información sobre cuándo es probable que acierten. Es decir, el modelo “sabe” algo sobre su propia incertidumbre, pero el objetivo de entrenamiento no lo obliga a expresarla.

Lo que las ecuaciones no contienen

Con esto queda escrito el algoritmo completo: tokenización, incrustación, codificación de posición, atención con máscara, red feedforward, normalización, proyección al vocabulario, softmax, autorregresión, entropía cruzada y descenso por gradiente. Caben, efectivamente, en unas pocas páginas, y un programador entrenado puede implementarlas en unos cientos de líneas.

Lo que no aparece en ninguna de estas ecuaciones es el valor de θ\theta. Las fórmulas describen la forma de lo probable; el contenido de esa forma, los miles de millones de números que la vuelven capaz de escribir, no se deduce de nada de lo anterior. Se obtiene minimizando DKL(p ∥ Pθ)D_{\mathrm{KL}}(p \,\|\, P_\theta) sobre lo que escribimos. Esa es, quizás, la conclusión más incómoda del tríptico: la parte del sistema que podemos entender por completo es la que no sabe nada, y la parte que sabe es la que no podemos leer.


Fuentes