Transformers y embeddings: mapear palabras al espacio de tipos celulares
Al finalizar este tema
En los temas #2 a #4, analizamos una máquina con 33,62 millones de parámetros (diales) basada en redes neuronales y su método de entrenamiento. En este tema, aprenderemos la estructura base del Transformer, la arquitectura que reorganiza esta máquina para adaptarse al lenguaje. Cubriremos cinco componentes clave: tokenización, embedding, codificación de posición, conexiones residuales y normalización por capas, en orden secuencial.
El principio operativo central, la atención, se tratará por separado en el tema #6. Aquí, simplemente indicaremos dónde se insertará la atención y nos centraremos en los demás componentes estructurales.
Tres desafíos del lenguaje que lo diferencian de las imágenes
En el tema #2, vimos una red neuronal aplicada a diapositivas patológicas (imágenes). Las imágenes son datos fáciles de manejar para una red neuronal: los valores de píxeles ya son números reales, las imágenes tienen una estructura natural de cuadrícula bidimensional y las relaciones de vecindad están claramente definidas.
El lenguaje es fundamentalmente diferente y presenta tres desafíos principales.
En primer lugar, es discreto. La palabra "gato" no es un valor real, sino un símbolo discreto. Para que la red neuronal lo procese, debe representarse numéricamente. Sin embargo, asignar valores reales arbitrarios como "gato = 0.42, perro = 0.51" crea relaciones sin sentido, como "el gato representa el 82% de un perro".
En segundo lugar, el orden determina el significado. "El perro mordió a la persona" y "La persona mordió al perro" son noticias completamente diferentes. Cambiar el orden de las palabras invierte el significado. Las imágenes son relativamente robustas ante rotaciones y traslaciones, pero en el lenguaje, cambiar un solo orden puede destruir por completo el significado.
En tercer lugar, el significado cambia según el contexto. Como mencionamos en el tema #1, la palabra "banco" puede referirse a un asiento, una entidad financiera o un banco de peces. Es necesario observar el contexto circundante para determinar cuál es el significado correcto.
El Transformer resuelve estos tres problemas mediante los siguientes componentes:
- Discreticidad → Tokenización + Embedding
- Orden → Codificación de posición
- Dependencia del contexto → Atención (tema #6)
En este tema, abordaremos primero los dos primeros problemas.
Tokenización: dividir el lenguaje en unidades discretas
Antes de introducir el lenguaje en una red neuronal, primero debemos definir la "unidad". Esto se denomina tokenización.
Comencemos con métodos simples.
Opción A: Por palabras. Dividir "A los gatos les gustan los peces" en [gato, pescado, gusta]. Problema: el vocabulario de un idioma puede tener cientos de miles o millones de palabras. Además, aparecen constantemente nuevas palabras (neologismos, términos técnicos, errores tipográficos). Si se encuentra una palabra no vista durante el entrenamiento, no podrá procesarse.
Opción B: a nivel de caracteres. Se divide en [g, o, y, a, n, g, i, ...]. El vocabulario es pequeño (decenas de miles de caracteres, incluidos los kanji de uso común en coreano), pero como cada carácter tiene poco significado por sí solo, la secuencia se vuelve extremadamente larga. El costo computacional se dispara.
Opción C: a nivel de subpalabras, el estándar moderno. Las partes frecuentes se tratan como un único token; las menos frecuentes se dividen en fragmentos más pequeños. Si "gato" aparece con frecuencia, se convierte en un solo token; si "metaexpresionismo" es poco frecuente, se divide en [meta, expresión, ismo, s].
El algoritmo que aprende automáticamente la Opción C es BPE (Byte Pair Encoding) o SentencePiece. En la práctica, la mayoría de los LLM utilizan esta familia. El tamaño del vocabulario suele estar entre 30.000 y 150.000.
Analogía biológica. Al analizar secuencias genómicas, surge un problema similar. Si se manejan a nivel de nucleótidos individuales (A, T, G, C), la secuencia es demasiado larga; si se manejan a nivel de genes, no se pueden procesar nuevos genes. En la práctica, se utiliza una unidad de subsecuencia llamada k-mer (por ejemplo, fragmentos de 6 a 8 nucleótidos). Esta idea es exactamente la misma que la Opción C de la tokenización. De hecho, los modelos recientes de lenguaje genómico (como Nucleotide Transformer) utilizan precisamente la tokenización por k-mers.
El resultado de la tokenización es una secuencia de identificadores enteros.
"A los gatos les gustan los peces"
↓ Tokenización
[gato, pescado, gusta]
↓ Búsqueda en el vocabulario
[8422, 15903, 421, 892]Ahora debemos convertir esta secuencia de enteros en un vector de números reales que la red neuronal pueda procesar. Esto es lo que se conoce como incrustación.
Incrustación — Creando un espacio para los tipos celulares
La incrustación consiste en asignar tokens discretos a vectores reales de alta dimensión. Cada token tiene un vector aprendido asociado.
Matemáticamente, es muy sencillo. Si tenemos un vocabulario con V tokens y una dimensión de incrustación de d (por ejemplo, 4096), existe una matriz de incrustación E de tamaño V × d. El vector de incrustación del ID de token i es la fila correspondiente E[i].
V = 100000 # Tamaño del vocabulariod = 4096 # Dimensión de la incrustaciónembedding = torch.nn.Embedding(V, d)
token_ids = torch.tensor([8422, 15903, 421, 892])vectors = embedding(token_ids) # shape: (4, 4096)Esta matriz de incrustaciones se inicializa aleatoriamente al inicio del entrenamiento y se aprende junto con la red neuronal mediante retropropagación. Al finalizar el entrenamiento, cada token ocupa una posición específica en este espacio de 4096 dimensiones.
La geometría de este espacio es sorprendente. En un espacio de incrustaciones bien entrenado, los tokens semánticamente similares se encuentran cercanos entre sí. Además, las relaciones semánticas se reproducen mediante aritmética vectorial.
Analogía biológica: el espacio UMAP del scRNA-seq. Si han realizado secuenciación de ARN de célula única (scRNA-seq), obtienen perfiles de expresión de decenas de miles de genes para cada célula. Dibujar esto directamente es imposible, pero al mapearlo a un espacio de incrustaciones de 2 a 50 dimensiones mediante UMAP, t-SNE o PCA, las células adoptan disposiciones interesantes en ese espacio.
- Las células del mismo tipo (por ejemplo, linfocitos T CD8+) se agrupan cerca unas de otras.
- Las células cercanas en la trayectoria de desarrollo forman trayectorias continuas.
- Los vectores direccionales entre tipos celulares adquieren significado biológico; por ejemplo, las direcciones "linfocito T naïve → linfocito T efector" y "linfocito B naïve → célula plasmática" son similares.
El espacio de incrustaciones de tokens de un LLM tiene exactamente esta estructura. En lugar de tipos celulares, se disponen palabras; en lugar de ejes de expresión génica, aparecen los ejes semánticos de las palabras (concreción, género, polaridad positiva/negativa, etc.) como direcciones en el espacio de incrustaciones.
Ejemplos sorprendentes de aritmética vectorial en el espacio de incrustaciones (reproducidos en incrustaciones reales de word2vec/GloVe/LLM):
vec("reina") - vec("mujer") + vec("hombre") ≈ vec("rey")Al restar el componente "mujer" de "reina" y sumar el componente "hombre", se obtiene aproximadamente el vector de "rey". Esto se debe a que el espacio de incrustación ha aprendido un eje relacionado con el género. Es importante destacar que esta operación aritmética con vectores se aprendió, no se programó. La red neuronal descubre estas relaciones por sí misma a partir de los datos de entrenamiento.
Analogía biológica. En el espacio de incrustación de scRNA-seq se observan operaciones aritméticas con vectores similares.
vec("helper T cell") - vec("CD4+") + vec("CD8+") ≈ vec("cytotoxic T cell")En el espacio de incrustación de las células T, la expresión de los marcadores CD4/CD8 forma un eje; al desplazarse a lo largo de este eje, el tipo celular cambia de células T colaboradoras a células T citotóxicas. Esta es la razón por la que los modelos de incrustación de redes neuronales y los modelos de incrustación biológicos comparten conceptualmente la misma estructura: ambos comprimen las relaciones estadísticas de los datos de entrenamiento en la geometría de un espacio euclidiano de baja dimensión.
El problema del orden: codificación posicional
Una vez que se obtienen las incrustaciones, las palabras se convierten en vectores. Sin embargo, queda un segundo problema: el orden de las palabras.
Los transformadores procesan la secuencia de entrada como un conjunto no ordenado (por razones que se analizarán en detalle en el episodio #6). Esto implica el riesgo de generar los mismos resultados para frases como "el perro mordió a la persona" y "la persona mordió al perro".
Para evitar esto, se añade explícitamente información posicional a las incrustaciones de las palabras. Esto es lo que se conoce como codificación posicional.
El método más simple consiste en asignar un vector aprendido para cada posición y sumarlo a la incrustación correspondiente.
pos_embedding = torch.nn.Embedding(max_length, d)positions = torch.arange(len(token_ids))final = token_embed(token_ids) + pos_embedding(positions)Esto se denomina incrustación posicional aprendida. El GPT-2 original utiliza este método.
El artículo original sobre transformadores (2017) emplea un método diferente: codificación posicional sinusoidal. Para cada posición p y cada dimensión i:
PE(p, 2i) = sin(p / 10000^(2i/d))
PE(p, 2i+1) = cos(p / 10000^(2i/d))Onda calculada de forma determinista sin parámetros. La relación entre las posiciones p y p+k puede expresarse mediante identidades trigonométricas, lo que facilita que el modelo aprenda la posición relativa.
Bio-ubicuidad: fase del ritmo circadiano. En fisiología celular, al representar el momento dentro de un ciclo de 24 horas, se utiliza con frecuencia la combinación de sin(2πt/24) y cos(2πt/24). Es un método natural que coloca el mediodía y la medianoche en direcciones opuestas en el espacio vectorial, permitiendo un movimiento continuo entre la mañana y la tarde. El PE sinusoidal de los transformadores se basa exactamente en este principio. Combinar otros periodos (día, hora, minuto) permite una representación temporal más precisa; los diversos periodos del PE (10000^(2i/d) varía por dimensión) implementan automáticamente esta representación multi-periodo.
Estándar moderno: RoPE y ALiBi. Los nuevos enfoques surgidos a partir de 2020 se han convertido en el estándar práctico.
- RoPE (Rotary Position Embedding): rota el vector de incrustación un ángulo específico según la posición. La posición relativa se expresa de forma natural como la diferencia de ángulos entre vectores. Adoptado por la mayoría de los LLM modernos, como LLaMA, GPT-NeoX y Qwen. Ofrece elegancia al manejar la posición relativa mediante derivadas parciales.
- ALiBi (Attention with Linear Biases): asigna una penalización proporcional a la distancia de posición al puntaje de atención. Tiene la ventaja de generalizar razonablemente bien incluso a contextos más largos que los vistos durante el entrenamiento.
Ambos enfoques se utilizan ampliamente en la práctica en lugar del PE sinusoidal original debido a su capacidad de extenderse más allá de la longitud del contexto vista durante el entrenamiento. La expansión de la ventana de contexto en modelos grandes como GPT-3/4 y LLaMA (de 2K a 8K, 32K, 128K) es posible gracias a esta familia de codificaciones de posición.
Estructura básica del bloque Transformer
Una vez completados el incrustado de tokens y la codificación de posición, cada palabra se convierte en un vector que contiene información de posición. Estos vectores atraviesan repetidamente una estructura de capas conocida como bloque Transformer.
Estructura básica del bloque Transformer (estructura Pre-LN, estándar moderno):
Entrada x
↓
LayerNorm
↓
Atención multi-cabeza ←── (Ver detalle en #6)
↓
+ x ←── Residual connection
↓
LayerNorm
↓
FeedForward Network (FFN)
↓
+ (resultado anterior) ←── Conexión residual
↓
SalidaEste bloque se apila en 12 capas en GPT-2, 96 en GPT-3 y más de 100 en los modelos grandes más recientes. A medida que aumenta el número de capas, se pueden capturar patrones más complejos, pero la estabilidad del entrenamiento se vuelve más difícil de lograr. Garantizar esa estabilidad es el objetivo de las conexiones residuales y la normalización por capas.
Conexiones residuales: atajos entre capas
Una conexión residual (también llamada conexión de salto) consiste en sumar directamente la entrada a la salida de una capa.
Salida = F(entrada) + entradaF se refiere a la transformación real de cada capa (como la atención y las FFN).
¿Por qué es importante? Para resolver el problema del gradiente que se desvanece, mencionado en el episodio #4.
Durante la retropropagación, los gradientes que atraviesan 100 capas se multiplican por las derivadas locales de cada capa, lo que provoca una atenuación exponencial. Después de 100 multiplicaciones, los gradientes prácticamente se vuelven cero en la mayoría de las capas antes de llegar a la primera, lo que impide el entrenamiento.
Las conexiones residuales resuelven este problema de manera elegante.
∂salida/∂entrada = ∂F/∂entrada + 1 ←── Gracias a "+ entrada", siempre queda un 1El "+1" garantiza que el gradiente fluya intacto a través de las capas. Incluso con 100 capas, el gradiente se transmite hasta la primera capa.
El gran éxito del artículo original sobre Transformers y el aún mayor éxito de ResNet (2015) se deben a esta idea. Es la razón determinante por la que hoy en día es posible entrenar redes neuronales de más de 100 capas.
Analogía biológica: homeostasis celular. Las células poseen un sistema de homeostasis que, ante estímulos externos, no cambia completamente de inmediato, sino que mantiene parcialmente su estado original mientras se ajusta gradualmente. La línea base mantenida aquí es conceptualmente equivalente a la "+ entrada" en una red neuronal. Si las células reiniciaran completamente su estado con cada estímulo, perderían estabilidad. En los sistemas de señalización celular, las señales fuertes fluyen superpuestas sobre una línea base que se mantiene. Esto es conceptualmente coherente con el flujo residual de los Transformers.
En un Transformer, cada capa genera un "cambio" mediante la atención o la FFN, y este cambio se suma a la conexión residual. Desde la perspectiva del flujo residual, podemos entender que las incrustaciones forman un único flujo continuo desde la primera hasta la última capa, con cada capa añadiendo información gradualmente a ese flujo. Esta perspectiva es el marco central de la investigación reciente en interpretabilidad mecanicista.
Normalización por capa: estabilizando la distribución de las activaciones
La normalización por capa (Layer Normalization, LayerNorm) es una operación que estandariza la distribución de las activaciones de cada capa en cada paso.
Para cada vector:
vector_normalizado = (vector - media) / desviación_estándarLuego, multiplica la escala aprendida γ por el desplazamiento β y suma los resultados:
resultado = γ ⊙ vector_normalizado + β¿Por qué es necesario? A medida que los valores de activación atraviesan varias capas, su distribución se desplaza y se expande de forma impredecible. En algunas capas, los valores de activación aumentan, mientras que en otras disminuyen. Esta inestabilidad dificulta el entrenamiento.
LayerNorm estabiliza el entrenamiento al reescalar los valores de activación de cada capa para que tengan una media de 0 y una varianza de 1. γ y β permiten ajustar nuevamente la escala y el desplazamiento si es necesario.
Analogía biológica: homeostasis del pH y los iones en la célula. Las células mantienen el pH del citoplasma cerca de 7,2, la concentración de sodio en 12 mM y la concentración de potasio en 140 mM, entre otros parámetros, dentro de un rango estrecho, independientemente de los estímulos externos. Sin esta homeostasis, cada vía de señalización funcionaría en condiciones imprevistas, lo que provocaría el colapso de la función celular. La función de LayerNorm en las capas de una red neuronal es conceptualmente análoga a este proceso, ya que garantiza que cada capa funcione dentro del rango esperado de valores de activación mediante condiciones constantes.
Pre-LN vs. Post-LN.
- Post-LN (artículo original):
Output = LayerNorm(F(x) + x). Normalización después de la conexión residual. - Pre-LN (estándar moderno):
Output = F(LayerNorm(x)) + x. Normalización antes de la capa.
Se ha demostrado que Pre-LN es mucho más estable durante el entrenamiento, y hoy en día la mayoría de los LLM utilizan Pre-LN. Entre ellos, GPT-2, GPT-3, LLaMA, Qwen y Claude.
RMSNorm. Una variante de LayerNorm que omite la resta de la media y normaliza únicamente mediante la raíz cuadrática media (RMS). Al ser ligeramente más rápida en el cálculo y ofrecer un rendimiento similar, se ha convertido prácticamente en el estándar desde LLaMA.
RMSNorm(x) = γ ⊙ x / sqrt(mean(x^2) + ε)Panorama general — Arquitectura del transformador
Al ensamblar las piezas que hemos analizado hasta ahora, obtenemos una visión completa del transformador.
Secuencia de IDs de tokens [8422, 15903, 421, 892]
↓
Embedding de tokens (búsqueda en matriz V × d)
↓
+ Codificación posicional (o rotación RoPE)
↓
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Transformer Block 1
LayerNorm → Multi-head Attention → + Residual
LayerNorm → FFN → + Residual
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Transformer Block 2
... (misma estructura)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
...
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Bloque Transformer 96 (para GPT-3)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
↓
LayerNorm final
↓
cabeza de modelado de lenguaje (matriz d × V)
↓
distribución de probabilidad del tamaño de vocabulario V (predicción del siguiente token)Cada bloque de transformador es una combinación de los componentes tratados en esta sección: normalización, atención, FFN y conexiones residuales. El tema central del episodio #6 es qué es la atención. Por ahora, basta con entenderla como un "componente que permite que cada token absorba información de otros tokens adaptada al contexto".
Escala de parámetros. En los LLM grandes actuales, la mayoría de los parámetros de cada bloque corresponden en realidad a la FFN. Los parámetros de atención son relativamente pequeños. Por ejemplo, en GPT-3, cada bloque tiene ~50 millones de parámetros de atención y ~200 millones de parámetros FFN. Es decir, la atención es un componente de movimiento de información y la FFN es un componente de almacenamiento y procesamiento de información. Investigaciones recientes proporcionan evidencia de que gran parte del "conocimiento" de los LLM se almacena en los parámetros FFN.
Escenarios de aplicación biológica
Escenario 1 — Modelo de lenguaje de proteínas ESM
ESM (Evolutionary Scale Modeling), mencionado en el episodio #4, utiliza exactamente la arquitectura de transformador analizada en esta sección. Las diferencias son:
- Tokens: no son palabras, sino 20 tipos de aminoácidos.
- Incrustación (Embedding): cada aminoácido se representa con un vector aprendido. Si el entrenamiento es efectivo, este vector reproduce las propiedades fisicoquímicas del aminoácido (hidrofobicidad, carga, tamaño).
- Codificación de posición: la posición en la secuencia. Es clave para predecir la estructura secundaria y el plegamiento terciario.
- Atención: aprende interacciones entre aminoácidos distantes en la secuencia (por ejemplo, puentes disulfuro, núcleos hidrofóbicos, sitios activos).
En el espacio de incrustación (embedding) de ESM entrenado, las proteínas con funciones similares se agrupan, y los pares de aminoácidos que contactan físicamente en la secuencia se resaltan naturalmente en la atención. Este mapa de atención se utiliza para entrenar AlphaFold.
Escenario 2 — Modelo de secuencias genómicas Enformer
Enformer de DeepMind es un transformador que toma secuencias genómicas (A/T/G/C) como entrada para predecir la expresión génica por tipo celular.
- Tokens: bases del ADN (o k-mers).
- Codificación de posición: la posición en el genoma. Necesaria para aprender características locales como promotores, potenciadores y sitios de unión de CTCF.
- Contexto largo: los potenciadores pueden estar a cientos de kb de distancia del gen. La ventana de contexto de Enformer supera los 100 kb.
- Flujo residual: esencial para mantener el flujo de gradientes en redes muy profundas (decenas de bloques).
Escenario 3 — Modelo de estructura química ChemBERTa
Es un modelo que representa estructuras moleculares como cadenas de texto SMILES y las introduce en un transformador. Una vez entrenado, las moléculas con propiedades químicas similares se agrupan en el espacio de incrustación (embedding). Se utiliza en el descubrimiento de fármacos para la búsqueda de candidatos y la generación de moléculas similares.
Resumen clave
- Los tres grandes problemas del lenguaje (discreticidad, orden y contexto) se resuelven respectivamente mediante tokenización + incrustación (embedding), codificación de posición y atención.
- Los embeddings mapean tokens discretos a un espacio de números reales de alta dimensión. Si el entrenamiento es efectivo, los tokens similares se agrupan cerca y las relaciones semánticas se expresan mediante aritmética vectorial. Es el mismo principio que el espacio UMAP del scRNA-seq.
- El codificado de posición informa a la red neuronal sobre el orden de las palabras. Existen sinusoidal, aprendido, RoPE, ALiBi, entre otros. El estándar moderno es RoPE.
- El bloque Transformer combina atención + FFN + conexión residual + LayerNorm.
- La conexión residual resuelve el problema del gradiente desvanecido, permitiendo entrenar redes de más de 100 capas. Es análogo a la homeostasis celular y la coherencia conceptual.
- La normalización por capa estabiliza la distribución de las activaciones, ayudando a la convergencia del entrenamiento. Pre-LN y RMSNorm son los estándares modernos.
- La mayor parte de los parámetros de los LLM grandes corresponde a FFN, con evidencia de que gran parte del almacenamiento de conocimiento reside aquí.
Próximos conceptos
- Episodio #6
attention-mechanism— El corazón del Transformer. El principio por el cual las palabras intercambian información entre sí. - Episodio #7
prompt-engineering— Cómo aprovechar eficazmente un Transformer entrenado. - Episodio #12
pytorch-basics— Implementación en código de los componentes de este episodio.
📐 Apéndice — Fórmulas matemáticas para expertos
Dificultad: Muy difícil Dirigido a: Lectores con conocimientos de álgebra lineal, probabilidad y teoría de optimización a nivel de posgrado
A.1 Matemáticas de la capa de embedding
Tamaño del vocabulario V, dimensión del embedding d.
Matriz de embedding: E ∈ ℝ^{V × d}
ID de token i → vector de embedding: e_i = E[i, :] (fila i-ésima)
Aprendizaje: E son parámetros de entrenamiento. Cada fila se actualiza individualmente mediante retropropagación.
Embedding compartido: Es común que los pesos del cabezal de modelado de lenguaje (última capa d → V) se compartan con E^T. Ahorro de parámetros + mejora de la estabilidad del entrenamiento.
A.2 Codificado de posición sinusoidal
Artículo original del Transformer (Vaswani et al., 2017):
PE(p, 2i) = sin(p / 10000^(2i/d))
PE(p, 2i+1) = cos(p / 10000^(2i/d))Propiedad clave: El valor de PE en la posición p+k puede expresarse como una función lineal del valor de PE en la posición p:
PE(p+k) = M_k · PE(p)M_k es una matriz de rotación que depende únicamente de k. Esta propiedad facilita que el modelo aprenda las posiciones relativas.
Espectro de frecuencias: a medida que la dimensión i aumenta, el período de la forma de onda se alarga (10000^(2i/d)). Las dimensiones bajas representan distancias cortas y las dimensiones altas representan distancias largas.
A.3 RoPE (Incrustación de posición rotatoria)
En cada posición p, el vector de incrustación se divide en pares bidimensionales y se rota un ángulo específico.
El vector de incrustación x ∈ ℝ^d se divide en d/2 pares 2D, que se denotan como (x_{2i}, x_{2i+1}).
Cada par se rota por un ángulo que depende de la posición θ_{p,i} = p · 10000^{-2i/d}:
[x'_{2i} ] [cos(θ_{p,i}) -sin(θ_{p,i})] [x_{2i} ]
[x'_{2i+1}] = [sin(θ_{p,i}) cos(θ_{p,i})] · [x_{2i+1}]Propiedad clave: El producto escalar de dos vectores depende únicamente de la diferencia de posición p - q:
⟨RoPE(x, p), RoPE(y, q)⟩ = f(x, y, p-q)Esta característica permite representar de forma natural la información de posición relativa en las puntuaciones de atención. Se continúa con el apartado #6 sobre la atención.
A.4 ALiBi (Atención con sesgos lineales)
En lugar de añadir la codificación de posición a los embeddings, se suma una penalización por la distancia posicional a las puntuaciones de atención.
Q, K Después de calcular las puntuaciones de atención:
score(i, j) = ⟨q_i, k_j⟩ / sqrt(d) - m · |i - j|m aplica una pendiente diferente a cada cabeza de atención (por ejemplo, 2^(-8/h), donde h es el número de cabezas).
Ventajas: Permite cierta generalización a contextos más largos que la longitud del contexto utilizada durante el entrenamiento. No implica un costo computacional adicional.
A.5 Fórmula de LayerNorm
Para el vector x ∈ ℝ^d:
μ = (1/d) Σ_i x_i (media)
σ^2 = (1/d) Σ_i (x_i - μ)^2 (varianza)
x̂_i = (x_i - μ) / sqrt(σ^2 + ε) (normalización)
y_i = γ_i · x̂_i + β_i (escala y desplazamiento)γ, β ∈ ℝ^d es un parámetro de aprendizaje. ε ≈ 1e-5 es la estabilidad numérica.
Importante: La normalización se aplica a cada vector, no por lote. Esta es la diferencia con BatchNorm. BatchNorm depende del tamaño del lote, lo que lo hace inadecuado para modelos secuenciales.
A.6 Fórmula de RMSNorm
Se omite la resta de la media que se realiza en LayerNorm:
y_i = γ_i · x_i / sqrt((1/d) Σ_j x_j^2 + ε)El número de parámetros se reduce a la mitad (sin β), y el cálculo es ligeramente más rápido. Adoptado por LLaMA, Mistral, Qwen, etc.
A.7 Derivada parcial de la conexión residual
Bloque y = F(x) + x.
∂y/∂x = ∂F/∂x + II es la matriz identidad. El hecho de que siempre quede un componente con valor 1 es la clave para solucionar el problema del gradiente que se desvanece.
A través de múltiples bloques:
y = F_L(F_{L-1}(...F_1(x)...)) + camino skipDurante la retropropagación, la ruta de salto utiliza una suma en lugar de una multiplicación, por lo que los gradientes no disminuyen exponencialmente.
A.8 Pre-LN vs Post-LN
Post-LN (artículo original):
y = LayerNorm(F(x) + x)Pre-LN (estándar actual):
y = F(LayerNorm(x)) + xVentajas de Pre-LN:
- El flujo residual no pasa por la normalización, por lo que siempre mantiene la escala original.
- El entrenamiento es estable sin necesidad de un período de adaptación (warmup).
- Permite entrenar redes muy profundas (más de 100 capas).
Desventajas de Pre-LN:
- Existen informes que indican que el rendimiento puede ser ligeramente inferior. Recientemente, han surgido enfoques híbridos como DeepNet, entre otros.
A.9 Ecuaciones de la FFN (Red de alimentación directa)
FFN dentro del bloque Transformer. Generalmente, es un MLP de 2 capas:
FFN(x) = W_2 · σ(W_1 · x + b_1) + b_2W_1 ∈ ℝ^{4d × d}, W_2 ∈ ℝ^{d × 4d} (la dimensión intermedia se multiplica por 4). Es una convención de la familia GPT.
σ es la función de activación. Hasta GPT-2 se utilizaba GELU; los modelos grandes más recientes emplean SwiGLU:
SwiGLU(x) = (W_2 · x) ⊙ Sigmoid(W_1 · x) · V · xEstructura que multiplica dos matrices. Adoptada por LLaMA, PaLM, Qwen, etc.
A.10 Cálculo aproximado del número de parámetros
Dimensión de incrustación d, número de capas L, tamaño del vocabulario V:
- Incrustación:
V · d(se reduce a uno si se utiliza el ajuste de pesos) - Atención por bloque:
4 · d^2(Q, K, V, Out, cada uno cond × d) - FFN por bloque:
8 · d^2(d → 4d → d) - LayerNorm por bloque:
4d(se puede despreciar)
Total por bloque: ~12 · d^2
Parámetros totales (excluyendo la incrustación): ~12 · L · d^2
GPT-3 175B: L = 96, d = 12288. 12 · 96 · 12288^2 ≈ 174B. Literalmente.
Si se considera el estado del optimizador (Adam requiere el doble de memoria por parámetro) y el almacenamiento de los valores de activación durante el entrenamiento, la memoria GPU real es aproximadamente de 8 a 16 veces el tamaño de los parámetros.
Referencias
El contenido, el guion, las metáforas y las cifras de este documento son desarrollados internamente por BioPlayground; a continuación, se presentan referencias externas que pueden ayudar en el aprendizaje conceptual:
- Artículo original del transformador: Vaswani et al., "Attention Is All You Need" (NeurIPS 2017)
- Artículo original de RoPE: Su et al., "RoFormer: Enhanced Transformer with Rotary Position Embedding" (2021)
- Artículo original de ALiBi: Press et al., "Train Short, Test Long: Attention with Linear Biases Enables Input Length Extrapolation" (ICLR 2022)
- Análisis de Pre-LN: Xiong et al., "On Layer Normalization in the Transformer Architecture" (ICML 2020)
- Artículo original de RMSNorm: Zhang & Sennrich, "Root Mean Square Layer Normalization" (NeurIPS 2019)
- Artículo original de conexiones residuales: He et al., "Deep Residual Learning for Image Recognition" (CVPR 2016)
- Origen de las incrustaciones de palabras: Mikolov et al., "Efficient Estimation of Word Representations in Vector Space" (word2vec, 2013)
- Interpretación del flujo residual: Elhage et al., "A Mathematical Framework for Transformer Circuits" (Anthropic 2021)
- Material didáctico sobre visualización del aprendizaje profundo: Capítulos 5 y 6 del video "Deep Learning" de 3Blue1Brown (YouTube); consultar como referencia pedagógica.
- Artículo original sobre BPE: Sennrich et al., "Neural Machine Translation of Rare Words with Subword Units" (ACL 2016)
- Artículo sobre Enformer: Avsec et al., "Effective gene expression prediction from sequence by integrating long-range interactions" (Nature Methods 2021)
En este episodio se construye la estructura básica del transformador. En el episodio #6, se analizará el funcionamiento de su componente central: el mecanismo de atención.