La arquitectura RetNet (Retentive Network) es una familia de modelos de aprendizaje profundo diseñada para combinar tres capacidades especialmente importantes en los modelos de lenguaje: entrenamiento paralelizable, generación autorregresiva eficiente y procesamiento de secuencias extensas.
Su principal innovación es un mecanismo denominado Retention, o retención, que permite calcular dependencias entre tokens utilizando tres modalidades matemáticamente relacionadas: procesamiento paralelo, procesamiento recurrente y procesamiento recurrente por fragmentos.
RetNet fue presentada en julio de 2023 por Yutao Sun, Li Dong, Shaohan Huang, Shuming Ma, Yuqing Xia, Jilong Xue, Jianyong Wang y Furu Wei en el artículo científico Retentive Network: A Successor to Transformer for Large Language Models.
El trabajo fue desarrollado por investigadores vinculados a Microsoft Research y otras instituciones académicas, y propuso una alternativa a los Transformers autorregresivos convencionales para construir grandes modelos de lenguaje.
En un Transformer con autoatención causal, las dependencias entre tokens se calculan mediante consultas, claves y valores. Durante la generación incremental, suele utilizarse una caché de claves y valores (KV cache) que aumenta conforme crece el historial.
RetNet introduce una estrategia diferente: mantiene estados recurrentes que acumulan información relevante mediante un mecanismo de decaimiento temporal.
De este modo, la memoria del estado de retención puede mantenerse acotada por las dimensiones del modelo, sin crecer con cada nuevo token como ocurre en una caché KV convencional sin restricciones.
La arquitectura también utiliza Multi-Scale Retention, un mecanismo de múltiples cabezas de retención que permite combinar información de distintas escalas temporales.
Una característica especialmente importante es que la misma operación de retención puede calcularse de tres maneras, dependiendo del escenario.
Durante el entrenamiento, la representación paralela permite aprovechar las GPU. Durante la generación, la representación recurrente facilita actualizaciones incrementales. Para documentos extensos, la representación recurrente por fragmentos combina el procesamiento paralelo dentro de cada bloque con estados que transmiten información entre bloques.
En sus experimentos originales, los investigadores observaron resultados competitivos de modelado del lenguaje y ventajas de memoria, latencia y rendimiento de generación en determinadas configuraciones frente a Transformers de referencia.
Estas ventajas deben interpretarse dentro del contexto experimental de 2023: no constituyen una garantía de superioridad frente a todos los modelos actuales.
En esta guía exploraremos qué es RetNet, cómo funciona el mecanismo Retention, en qué consiste Multi-Scale Retention, cómo se relacionan sus tres modalidades de cálculo y cuáles son sus diferencias con RWKV, Mamba y los Transformers tradicionales. También incluiremos ejemplos prácticos en Python y los metadatos necesarios para publicar el artículo en WordPress.
¿Qué es la arquitectura RetNet?
RetNet es una arquitectura neuronal autorregresiva que utiliza mecanismos de retención para modelar dependencias temporales dentro de una secuencia.
Su nombre procede de Retentive Network, que puede traducirse como «red de retención».
La arquitectura está diseñada para procesar secuencias de tokens y aprender representaciones útiles para predecir sus siguientes elementos.
A primera vista, RetNet comparte algunos componentes con los Transformers convencionales.
Utiliza embeddings, bloques residuales, normalización, transformaciones lineales y redes feed-forward.
Sin embargo, sustituye el mecanismo central de autoatención por un operador denominado Retention.
Este operador combina información procedente de posiciones anteriores utilizando claves, valores, consultas y factores de decaimiento.
Su funcionamiento presenta una relación matemática con determinadas variantes de atención lineal y con actualizaciones recurrentes de estado.
La principal ventaja es que permite elegir diferentes estrategias de cálculo sin cambiar la función matemática fundamental que se desea ejecutar, siempre que se respeten las mismas parametrizaciones y condiciones numéricas.
RetNet ofrece tres modalidades:
- Parallel Retention: procesa secuencias completas mediante operaciones matriciales.
- Recurrent Retention: actualiza estados internos conforme llegan nuevos tokens.
- Chunkwise Recurrent Retention: procesa fragmentos en paralelo y transmite estados entre ellos.
Esta flexibilidad convierte RetNet en una arquitectura relevante para estudiar cómo combinar el entrenamiento paralelo con la inferencia recurrente.
Origen y desarrollo de RetNet
Los Transformers introducidos en 2017 transformaron el procesamiento del lenguaje natural mediante mecanismos de autoatención.
Posteriormente, modelos como GPT demostraron que el procesamiento autorregresivo podía escalarse hasta grandes modelos generativos.
Sin embargo, la atención completa presenta limitaciones cuando aumenta la longitud de la secuencia.
Durante el entrenamiento, la matriz conceptual de atención crece cuadráticamente respecto al número de tokens.
Durante la generación, los Transformers suelen mantener una caché KV con las representaciones históricas necesarias para continuar calculando atención.
Esta caché permite evitar cálculos redundantes, pero también requiere memoria adicional que crece con el número de posiciones retenidas.
Para abordar estos problemas surgieron diversas arquitecturas eficientes.
Transformer-XL introdujo memoria recurrente entre segmentos.
Longformer y BigBird utilizaron patrones de atención dispersa.
Linformer desarrolló proyecciones de baja dimensión.
Performer y Linear Transformer estudiaron la atención basada en kernels y estadísticas acumuladas.
Mamba introdujo modelos de espacio de estados selectivos.
RWKV combinó mezcla temporal ponderada con inferencia recurrente.
RetNet apareció en este contexto como una propuesta centrada en una idea: utilizar una misma formulación de retención que admita procesamiento paralelo, recurrente y por fragmentos.
Los investigadores demostraron que este enfoque podía utilizarse para entrenar y desplegar modelos de lenguaje de gran escala.
El problema que intenta resolver RetNet
RetNet aborda tres dificultades relacionadas entre sí.
1. Coste del entrenamiento
En un Transformer de atención completa, la cantidad de relaciones de atención puede crecer como:
[
O(L^2)
]
Donde (L) representa la longitud de la secuencia.
Este comportamiento puede dificultar el procesamiento de documentos largos.
RetNet proporciona modalidades alternativas de cálculo que permiten reducir el coste para secuencias extensas.
2. Memoria durante la generación
Un Transformer causal puede reutilizar claves y valores históricos mediante una caché KV.
Esta caché normalmente crece con la cantidad de tokens almacenados.
RetNet utiliza estados recurrentes cuyo tamaño puede permanecer constante respecto al número de tokens ya procesados.
3. Diferencias entre entrenamiento e inferencia
Durante el entrenamiento resulta conveniente procesar muchas posiciones simultáneamente.
Durante la generación autorregresiva, los tokens se producen uno por uno.
RetNet permite representar la retención mediante distintas estrategias computacionales apropiadas para cada escenario.
Estas tres características constituyen el fundamento de su diseño.
¿Qué es el mecanismo Retention?
Retention es el operador central de RetNet.
Su función consiste en combinar información de posiciones anteriores mediante una ponderación temporal.
El mecanismo mantiene una relación conceptual con la autoatención basada en Query, Key y Value.
Sin embargo, utiliza un factor explícito de decaimiento que controla la contribución de posiciones anteriores.
Consideremos una secuencia:
[
x_1,x_2,\ldots,x_L
]
Cada posición genera representaciones:
[
q_t,\quad k_t,\quad v_t
]
Donde:
- (q_t) representa una consulta.
- (k_t) representa una clave.
- (v_t) representa un valor.
RetNet combina las representaciones históricas mediante pesos que dependen tanto del contenido como de la distancia temporal.
Una forma simplificada de expresar la salida de retención es:
[
o_t=
\sum_{j=1}^{t}
\gamma^{t-j}
(q_t^\top k_j)
v_j
]
Donde:
- (t) representa la posición actual.
- (j) representa una posición anterior.
- (\gamma) es un factor de retención.
- (\gamma^{t-j}) atenúa contribuciones según su antigüedad.
En esta expresión se omiten, para facilitar la explicación, detalles de codificación posicional, normalización y parametrización de las múltiples cabezas.
A diferencia de softmax convencional, la expresión no normaliza las puntuaciones mediante una distribución softmax sobre todas las posiciones anteriores.
El mecanismo original de RetNet utiliza otros procedimientos de normalización y estabilización.
¿Qué significa Retention Decay?
Retention Decay es el factor que controla la reducción de influencia de información histórica.
Podemos representarlo mediante:
[
0<\gamma<1
]
Cuando (\gamma) está relativamente cerca de cero, las contribuciones antiguas pierden influencia rápidamente.
Cuando (\gamma) está cerca de uno, pueden mantenerse durante más posiciones.
Por ejemplo, si:
[
\gamma=0.9
]
una contribución situada cinco posiciones atrás recibe el factor:
[
0.9^5=0.59049
]
Si utilizamos:
[
\gamma=0.99
]
la misma distancia produce:
[
0.99^5\approx0.951
]
Esto ilustra cómo diferentes factores de decaimiento permiten representar distintas escalas temporales.
El valor de decaimiento no determina por sí solo la calidad de la memoria.
Las contribuciones también dependen de las representaciones Key, Query y Value, del entrenamiento y de los demás componentes de la arquitectura.
Multi-Scale Retention: retención de múltiples escalas
Una de las características principales de RetNet es Multi-Scale Retention (MSR).
Este mecanismo permite utilizar varias cabezas de retención con diferentes escalas temporales.
La idea es que no todas las dependencias lingüísticas tienen la misma duración.
Por ejemplo, algunas relaciones son locales:
«inteligencia artificial».
Otras pueden abarcar numerosas frases.
Un documento también puede introducir un concepto en la primera sección y utilizarlo posteriormente.
Para modelar estos comportamientos, diferentes cabezas pueden utilizar distintos factores de decaimiento.
Una cabeza puede concentrarse en información reciente.
Otra puede conservar influencia de un horizonte más amplio.
¿Cómo se combinan las cabezas?
Cada cabeza calcula una representación de retención.
Posteriormente, sus resultados se combinan mediante transformaciones aprendidas.
El diseño original utiliza mecanismos de normalización por cabezas y compuertas para controlar la salida combinada.
De esta manera, el modelo puede integrar información de diferentes escalas.
La existencia de múltiples escalas no garantiza una recuperación perfecta de información antigua.
Simplemente proporciona distintas dinámicas de retención que el modelo puede aprender a utilizar.
La arquitectura interna de un bloque RetNet
RetNet utiliza bloques que recuerdan estructuralmente a los bloques Transformer.
Un bloque típico contiene:
Normalización de entrada
Prepara las representaciones antes del mecanismo temporal.
Multi-Scale Retention
Combina información contextual mediante múltiples cabezas de retención.
Gated Retention
Utiliza una compuerta aprendida para regular la contribución de la salida temporal.
Conexión residual
Combina la representación original con la salida del mecanismo de retención.
Red feed-forward
Aplica transformaciones no lineales a cada posición.
Segunda conexión residual
Integra el resultado de la transformación feed-forward con el flujo principal de representaciones.
Los modelos completos apilan múltiples bloques RetNet.
Posteriormente, las representaciones finales pueden utilizarse para producir distribuciones de probabilidad sobre el vocabulario y predecir tokens.
Las tres modalidades de procesamiento de RetNet
La característica que distingue a RetNet es la existencia de tres formas de ejecutar el mecanismo de retención.
Aunque utilizan diferentes estrategias de cálculo, están relacionadas por la misma estructura matemática.
1. Parallel Retention
La representación paralela utiliza operaciones matriciales para procesar numerosas posiciones simultáneamente.
Esta modalidad resulta especialmente apropiada para entrenamiento.
2. Recurrent Retention
La representación recurrente procesa tokens incrementalmente.
Mantiene un estado interno que se actualiza con cada token.
Esta modalidad resulta especialmente apropiada para generación autorregresiva.
3. Chunkwise Recurrent Retention
La representación por fragmentos combina las dos anteriores.
Dentro de cada fragmento se utiliza cálculo paralelo.
Entre fragmentos se transmite un estado recurrente.
Esta modalidad resulta interesante para secuencias extensas.
Comprender estas tres estrategias es fundamental para estudiar RetNet.
Parallel Retention: procesamiento paralelo
En la representación paralela, RetNet puede calcular relaciones entre diferentes posiciones de una secuencia mediante operaciones matriciales.
Consideremos tres matrices:
[
Q=XW_Q
]
[
K=XW_K
]
[
V=XW_V
]
Donde (X) representa las entradas.
El modelo también incorpora información posicional relativa mediante representaciones complejas equivalentes a operaciones de rotación.
La máscara de retención puede expresarse como:
[
D_{t,j}=
\begin{cases}
\gamma^{t-j}, & j\leq t\
0, & j>t
\end{cases}
]
La salida paralela se representa conceptualmente como:
[
\operatorname{Retention}(X)=
(QK^T\odot D)V
]
Donde (\odot) representa una multiplicación elemento a elemento.
La máscara realiza dos funciones.
Primero, aplica causalidad para impedir que una posición utilice información futura.
Segundo, introduce decaimiento temporal sobre las contribuciones anteriores.
La ventaja es que el cálculo puede expresarse mediante operaciones matriciales paralelizables.
Sin embargo, una implementación directa de esta fórmula puede construir una matriz cuadrática durante el entrenamiento.
Por tanto, Parallel Retention no elimina automáticamente el coste cuadrático de una representación matricial densa.
La modalidad recurrente por fragmentos proporciona otra estrategia cuando la secuencia es extensa.
Recurrent Retention: procesamiento incremental
La representación recurrente calcula el mismo tipo de operación utilizando un estado acumulado.
En una formulación simplificada, el estado se actualiza como:
[
S_t=
\gamma S_{t-1}+k_tv_t^T
]
Donde:
- (S_t) representa el estado actual.
- (S_{t-1}) representa el estado anterior.
- (k_t) representa la clave actual.
- (v_t) representa el valor actual.
- (\gamma) representa el factor de retención.
La salida se calcula mediante:
[
o_t=q_t^TS_t
]
En el artículo original, los estados y las consultas incluyen también el tratamiento de posiciones y otras operaciones necesarias para la implementación completa.
La propiedad fundamental es que el estado se actualiza utilizando solamente su valor anterior y la información del token actual.
Esto permite procesar una secuencia de manera incremental.
¿Por qué es eficiente?
Porque el modelo no necesita recorrer explícitamente todas las claves y valores históricos en cada paso.
El coste por actualización depende de las dimensiones del estado.
Si esas dimensiones permanecen constantes, el coste de retención por token no crece con la longitud del historial.
Esta propiedad es especialmente importante durante la generación autorregresiva.
Chunkwise Recurrent Retention: procesamiento recurrente por fragmentos
La tercera modalidad combina paralelismo y recurrencia.
Su objetivo consiste en aprovechar las ventajas de ambos procedimientos.
Supongamos que tenemos una secuencia de 8.192 tokens.
En lugar de procesarla como una sola matriz cuadrática, podemos dividirla en bloques de 256 tokens.
Obtenemos:
[
8192/256=32
]
fragmentos.
Dentro de cada fragmento, el mecanismo puede utilizar operaciones paralelas.
Entre fragmentos, se transmite un estado recurrente.
Por ejemplo:
Fragmento 1 → Estado 1
Fragmento 2 + Estado 1 → Estado 2
Fragmento 3 + Estado 2 → Estado 3
Y así sucesivamente.
¿Qué ventajas ofrece?
Permite aprovechar operaciones matriciales dentro de cada bloque.
También evita construir una matriz de atención completa sobre toda la secuencia.
Al mantener fijo el tamaño del fragmento y las dimensiones internas, el coste del procesamiento puede crecer linealmente respecto a la longitud global.
¿Qué ocurre con los fragmentos anteriores?
Sus contribuciones se resumen en el estado recurrente.
El siguiente fragmento utiliza ese estado como contexto adicional.
Sin embargo, esta memoria comprimida no equivale a conservar individualmente todos los tokens anteriores.
La recuperación de información específica puede estar limitada por la capacidad del estado y los mecanismos aprendidos.
Formulación matemática de la equivalencia recurrente
Podemos demostrar la relación entre retención paralela y recurrente utilizando un ejemplo sencillo.
Consideremos la actualización:
[
S_t=\gamma S_{t-1}+k_tv_t^T
]
Con estado inicial:
[
S_0=0
]
La primera actualización es:
[
S_1=k_1v_1^T
]
La segunda:
[
S_2=\gamma k_1v_1^T+k_2v_2^T
]
La tercera:
[
S_3=\gamma^2k_1v_1^T+
\gamma k_2v_2^T+
k_3v_3^T
]
En general:
[
S_t=
\sum_{j=1}^{t}
\gamma^{t-j}k_jv_j^T
]
Si calculamos:
[
o_t=q_t^TS_t
]
obtenemos:
[
o_t=
\sum_{j=1}^{t}
\gamma^{t-j}
(q_t^Tk_j)v_j
]
Esta ecuación coincide con la formulación simplificada de retención ponderada.
Por tanto, la misma operación puede calcularse acumulando estados o evaluando una suma sobre las posiciones anteriores.
Este resultado proporciona la base matemática de la dualidad entre las formas paralela y recurrente.
RetNet y la codificación posicional xPos
RetNet utiliza información posicional para distinguir las posiciones dentro de una secuencia.
El artículo original relaciona su formulación con xPos, una técnica de representación posicional relativa.
En determinadas formulaciones, las consultas y claves incorporan factores complejos dependientes de la posición.
Esto permite introducir información sobre distancias y fases relativas.
Una representación simplificada utiliza:
[
e^{it\theta}
]
Donde:
- (t) representa la posición.
- (\theta) representa parámetros asociados con la frecuencia.
Estos factores permiten representar relaciones posicionales mediante operaciones de rotación.
El mecanismo recuerda conceptualmente a otras técnicas de codificación posicional rotatoria.
Sin embargo, los detalles de xPos y la formulación de retención no son idénticos a cualquier implementación de RoPE.
La codificación posicional constituye un componente importante para mantener coherencia entre los cálculos paralelos y recurrentes.
¿Qué es Gated Multi-Scale Retention?
RetNet utiliza un mecanismo de compuerta para regular la información producida por sus cabezas de retención.
Una representación conceptual puede expresarse como:
[
Y=
\operatorname{Gate}(X)
\odot
\operatorname{MSR}(X)
]
Donde:
- (\operatorname{MSR}(X)) representa el resultado de Multi-Scale Retention.
- (\operatorname{Gate}(X)) representa una transformación aprendida.
- (\odot) representa una multiplicación elemento a elemento.
El mecanismo original incorpora normalización, una activación de compuerta y proyecciones de salida.
La finalidad es controlar cómo se incorpora la información temporal a las representaciones finales.
Esta estrategia se relaciona conceptualmente con los mecanismos de compuertas utilizados en otras arquitecturas recurrentes.
Sin embargo, no debe confundirse directamente con las compuertas de LSTM, GRU o RWKV.
Cada arquitectura utiliza una formulación diferente.
¿Por qué RetNet puede reducir la memoria de inferencia?
Durante generación autorregresiva, un Transformer convencional suele almacenar claves y valores de posiciones anteriores.
Si la secuencia continúa creciendo, la caché KV también aumenta, salvo que se utilicen restricciones o mecanismos especiales.
RetNet utiliza un estado recurrente para cada cabeza de retención.
El tamaño del estado depende de las dimensiones internas del modelo.
Por tanto, puede permanecer constante respecto a la longitud histórica de la secuencia.
Ejemplo conceptual
Supongamos que procesamos:
1.000 tokens.
Después:
10.000 tokens.
Finalmente:
100.000 tokens.
En un Transformer con caché KV convencional sin restricciones, la memoria destinada a claves y valores aumenta con el número de posiciones retenidas.
En RetNet recurrente, el tamaño estructural del estado de retención puede permanecer constante.
Sin embargo, el modelo sigue necesitando memoria para pesos, activaciones y otros componentes.
Además, conservar un estado compacto no significa que pueda recuperar todos los detalles de los 100.000 tokens anteriores.
Complejidad computacional de RetNet
La complejidad de RetNet depende de la modalidad utilizada.
| Modalidad | Estrategia | Escalabilidad respecto a longitud |
|---|---|---|
| Paralela | Matrices de retención completas | Puede presentar coste cuadrático |
| Recurrente | Actualización de estado por token | Coste constante por token con dimensiones fijas |
| Recurrente por fragmentos | Paralelismo local y estado entre bloques | Coste lineal con tamaño de bloque fijo |
Esta distinción es importante.
No sería correcto afirmar que todas las formas de cálculo de RetNet tienen siempre complejidad lineal.
La ventaja principal está en poder utilizar diferentes algoritmos para distintas etapas.
Durante entrenamiento, la representación paralela facilita aprovechar aceleradores.
Durante inferencia, la representación recurrente evita que el coste del estado de retención crezca con la longitud del historial.
Durante procesamiento de secuencias largas, el método por fragmentos proporciona un equilibrio entre paralelismo y escalabilidad.
RetNet frente a Transformer convencional
| Característica | Transformer causal convencional | RetNet |
|---|---|---|
| Mecanismo temporal | Autoatención | Retention |
| Softmax de atención | Sí, habitualmente | No como mecanismo central |
| Multi-head | Multi-Head Attention | Multi-Scale Retention |
| Decaimiento temporal explícito | No necesariamente | Sí |
| Entrenamiento paralelo | Sí | Sí |
| Generación recurrente | No como formulación central | Sí |
| Caché KV creciente | Habitual | No necesaria en modo recurrente |
| Procesamiento por fragmentos | Depende de implementación | Modalidad central |
| Complejidad de inferencia por token | Depende del historial y optimizaciones | Constante respecto al historial con dimensiones fijas |
RetNet conserva una organización general similar a la de los Transformers.
Sin embargo, cambia cómo se calcula la información contextual.
En lugar de utilizar necesariamente una distribución softmax sobre todos los tokens anteriores, combina representaciones mediante retención ponderada.
La diferencia más importante es que esa operación admite una formulación recurrente compacta.
RetNet frente a RWKV
La arquitectura RWKV, estudiada en la Entrada 115, también combina entrenamiento paralelizable con generación recurrente.
Ambas utilizan mecanismos de ponderación temporal y estados acumulativos.
Sin embargo, presentan diferencias.
RWKV utiliza Receptance Weighted Key Value, Time Mixing y Channel Mixing.
RetNet utiliza un mecanismo de retención con múltiples escalas, codificación posicional y tres modalidades explícitas de cálculo.
| Característica | RWKV | RetNet |
|---|---|---|
| Mecanismo principal | Weighted Key Value | Multi-Scale Retention |
| Decaimiento temporal | Sí | Sí |
| Estados recurrentes | Sí | Sí |
| Entrenamiento paralelizable | Sí | Sí |
| Tres modalidades explícitas | Depende de versión | Paralela, recurrente y por fragmentos |
| Posiciones relativas | Según versión | Incorporadas a retención |
| Compuertas | Receptance | Gated Retention |
| Enfoque original | RNN escalable para LLM | Dualidad de retención y recurrencia |
Ambas arquitecturas muestran que es posible construir grandes modelos de lenguaje sin utilizar atención softmax convencional como mecanismo principal.
Sin embargo, sus parámetros, estados y reglas de actualización no son idénticos.
RetNet frente a Mamba y Mamba-2
RetNet también puede compararse con los modelos de espacio de estados selectivos.
Mamba utiliza un modelo SSM donde determinados parámetros cambian según la entrada.
Mamba-2 desarrolla Structured State Space Duality para relacionar modelos de estado y atención estructurada.
RetNet utiliza una retención ponderada con decaimiento temporal y formulaciones equivalentes de procesamiento.
| Característica | RetNet | Mamba | Mamba-2 |
|---|---|---|---|
| Fundamento | Retention | SSM selectivo | SSM estructurado |
| Estado recurrente | Sí | Sí | Sí |
| Atención softmax convencional | No | No | No |
| Decaimiento explícito | Sí | Transición de estado | Transición estructurada |
| Entrenamiento paralelo | Sí | Selective Scan | Algoritmo SSD |
| Procesamiento por fragmentos | Sí | Según algoritmo | Sí, central en SSD |
| Innovación principal | Tres modalidades de retención | Selección dependiente de entrada | Dualidad SSM-atención |
Estas arquitecturas presentan similitudes en sus objetivos de eficiencia.
Sin embargo, RetNet no debe describirse simplemente como una variante de Mamba.
Sus investigaciones originales y sus mecanismos matemáticos pertenecen a líneas de desarrollo diferentes.
RetNet frente a Linear Transformer
Linear Transformer utiliza funciones kernel para calcular atención mediante estadísticas acumuladas.
RetNet también permite una formulación recurrente con estados derivados de claves y valores.
Sin embargo, incorpora decaimiento temporal y mecanismos posicionales específicos.
En una formulación simplificada, Linear Transformer acumula:
[
S_t=S_{t-1}+\phi(k_t)v_t^T
]
RetNet incorpora un factor de retención:
[
S_t=\gamma S_{t-1}+k_tv_t^T
]
Estas expresiones muestran una similitud estructural.
Ambas utilizan estados acumulativos.
La diferencia es que RetNet incorpora un decaimiento explícito y una parametrización de retención específica.
Además, las versiones completas utilizan distintos procedimientos de normalización y transformación de características.
Por ello, la similitud de las ecuaciones simplificadas no significa que las arquitecturas sean equivalentes.
Resultados experimentales de RetNet
Los investigadores evaluaron RetNet en tareas de modelado del lenguaje y compararon su comportamiento con distintos modelos de referencia.
Escalabilidad del entrenamiento
Los experimentos mostraron que RetNet podía entrenarse utilizando operaciones paralelas y mantener un rendimiento competitivo de modelado del lenguaje.
Calidad de predicción
El artículo comunicó resultados favorables de escalabilidad y perplejidad bajo las configuraciones evaluadas.
Memoria de inferencia
Durante generación recurrente, el tamaño del estado de retención no necesita crecer con la longitud histórica de la misma manera que una caché KV convencional.
Rendimiento de generación
Los investigadores observaron ventajas de throughput y latencia en determinados experimentos con modelos de gran tamaño.
Contextos largos
La representación recurrente por fragmentos permitió estudiar un procesamiento eficiente de secuencias extensas.
Los resultados originales respaldan la utilidad de la arquitectura.
Sin embargo, no deben interpretarse como una clasificación actual frente a todas las implementaciones optimizadas de Transformers, RWKV o Mamba.
Aplicaciones prácticas de RetNet
1. Modelado del lenguaje
RetNet puede utilizarse como arquitectura base para entrenar modelos autorregresivos de predicción de tokens.
2. Generación de texto
Su formulación recurrente permite generar secuencias utilizando estados actualizables.
3. Procesamiento de documentos extensos
La modalidad recurrente por fragmentos puede resultar útil para procesar secuencias largas con memoria controlada.
4. Sistemas de inferencia incremental
RetNet puede utilizarse en investigaciones donde la latencia por token y el tamaño de la memoria recurrente son factores relevantes.
5. Modelos de lenguaje locales
Las propiedades de inferencia recurrente pueden resultar interesantes para arquitecturas diseñadas para ejecutarse con memoria limitada.
La viabilidad depende del checkpoint y del hardware.
6. Investigación sobre memoria neuronal
RetNet proporciona un mecanismo de referencia para estudiar decaimiento temporal y estados acumulativos.
7. Arquitecturas híbridas
Los principios de retención pueden combinarse con otros mecanismos de procesamiento dentro de diseños especializados.
8. Sistemas de inteligencia artificial generativa
RetNet puede servir como componente de modelos generativos, siempre que esté integrado en un sistema entrenado adecuadamente.
Ejemplo práctico: crear un modelo RetNet con Python
La implementación oficial de RetNet se encuentra dentro del proyecto TorchScale de Microsoft.
El repositorio está disponible en:
La instalación documentada utiliza:
pip install torch torchscale
Después, podemos crear una instancia de RetNet.
import torchfrom torchscale.architecture.config import RetNetConfigfrom torchscale.architecture.retnet import RetNetDecoderconfig = RetNetConfig( vocab_size=32000)model = RetNetDecoder(config)print(model)
Este ejemplo utiliza las interfaces documentadas por el repositorio oficial.
El programa crea una arquitectura RetNet con parámetros inicializados de acuerdo con la configuración.
No carga automáticamente un modelo de lenguaje entrenado.
Por tanto, no generará texto coherente sin un procedimiento de entrenamiento o sin utilizar pesos preentrenados compatibles.
La compatibilidad de la biblioteca con versiones recientes de PyTorch debe verificarse en el entorno elegido.
Ejemplo educativo: implementar Retention con NumPy
Para comprender la formulación recurrente, podemos construir una implementación sencilla de retención.
Este ejemplo utiliza claves, valores, consultas y un factor de decaimiento.
No reproduce todos los componentes de RetNet, como xPos, múltiples cabezas, normalización o compuertas.
Su objetivo es demostrar cómo funciona el estado recurrente.
Primero, instalamos NumPy:
pip install numpy
Después, ejecutamos:
import numpy as nprng = np.random.default_rng(42)sequence_length = 6key_dim = 4value_dim = 3queries = rng.normal( size=(sequence_length, key_dim))keys = rng.normal( size=(sequence_length, key_dim))values = rng.normal( size=(sequence_length, value_dim))gamma = 0.9state = np.zeros((key_dim, value_dim))outputs = []for t in range(sequence_length): state = ( gamma * state + np.outer(keys[t], values[t]) ) output = queries[t] @ state outputs.append(output)outputs = np.stack(outputs)print("Output shape:", outputs.shape)print(outputs)
El programa mantiene una matriz de estado.
Cada token modifica ese estado utilizando su clave y valor.
El factor gamma atenúa progresivamente las contribuciones anteriores.
La consulta actual utiliza el estado para generar una representación de salida.
Este procedimiento ilustra la idea fundamental de Recurrent Retention.
Ejemplo: demostrar la equivalencia entre retención paralela y recurrente
Una de las propiedades más interesantes de RetNet es que la misma operación de retención puede calcularse utilizando una formulación paralela o recurrente.
Podemos comprobarlo mediante NumPy.
El siguiente ejemplo implementa exactamente la misma retención simplificada de ambas maneras.
import numpy as nprng = np.random.default_rng(7)length = 8key_dim = 5value_dim = 3Q = rng.normal(size=(length, key_dim))K = rng.normal(size=(length, key_dim))V = rng.normal(size=(length, value_dim))gamma = 0.85# Método 1: formulación paralelapositions = np.arange(length)distance = ( positions[:, None] - positions[None, :])decay_mask = np.where( distance >= 0, gamma ** np.maximum(distance, 0), 0.0)scores = Q @ K.Tparallel_output = ( (scores * decay_mask) @ V)# Método 2: formulación recurrentestate = np.zeros((key_dim, value_dim))recurrent_output = []for t in range(length): state = ( gamma * state + np.outer(K[t], V[t]) ) recurrent_output.append( Q[t] @ state )recurrent_output = np.stack(recurrent_output)print("Parallel output:")print(parallel_output)print("Recurrent output:")print(recurrent_output)print( "Equivalent:", np.allclose( parallel_output, recurrent_output, atol=1e-10 ))
El programa calcula las salidas mediante dos procedimientos.
La formulación paralela construye una matriz de relaciones y aplica una máscara causal con decaimiento.
La formulación recurrente actualiza un estado interno en cada posición.
Ambas producen el mismo resultado matemático para este ejemplo.
El objetivo es ilustrar el fundamento de RetNet.
La implementación completa incorpora operaciones adicionales, por lo que la equivalencia numérica entre sus tres modalidades también debe considerar esos detalles.
Ejemplo de procesamiento recurrente por fragmentos
Podemos ampliar el ejercicio anterior para procesar la secuencia en bloques.
import numpy as nprng = np.random.default_rng(9)length = 12chunk_size = 4key_dim = 4value_dim = 2Q = rng.normal(size=(length, key_dim))K = rng.normal(size=(length, key_dim))V = rng.normal(size=(length, value_dim))gamma = 0.92state = np.zeros((key_dim, value_dim))chunkwise_outputs = []for start in range(0, length, chunk_size): end = min(start + chunk_size, length) for t in range(start, end): state = ( gamma * state + np.outer(K[t], V[t]) ) output = Q[t] @ state chunkwise_outputs.append(output)chunkwise_outputs = np.stack( chunkwise_outputs)print( "Output shape:", chunkwise_outputs.shape)
Este ejemplo divide la secuencia en fragmentos y conserva el estado entre ellos.
Sin embargo, utiliza un bucle recurrente incluso dentro de cada fragmento.
Por tanto, no implementa la optimización paralela interna de Chunkwise Recurrent Retention.
Su propósito es mostrar cómo puede mantenerse la continuidad del estado entre bloques.
La implementación real de RetNet combina operaciones matriciales dentro de los fragmentos con propagación recurrente entre ellos.
¿Qué significa recurrent_chunk_size?
En implementaciones de RetNet, el parámetro de tamaño de fragmento controla cuántas posiciones se agrupan para determinadas operaciones.
Por ejemplo:
recurrent_chunk_size = 256
puede utilizarse para organizar el procesamiento en bloques de 256 tokens, según la configuración.
La elección influye en:
- El paralelismo disponible.
- La memoria temporal necesaria.
- La cantidad de operaciones matriciales.
- La propagación del estado entre bloques.
- La latencia del procesamiento.
Un bloque más grande no siempre es mejor.
Un tamaño excesivo puede incrementar la memoria temporal.
Un bloque demasiado pequeño puede reducir la eficiencia del cálculo matricial.
La configuración adecuada debe determinarse mediante pruebas.
RetNet y el procesamiento del lenguaje en español
RetNet es una arquitectura general de procesamiento secuencial.
No depende de un idioma específico.
Por tanto, puede utilizarse como base para construir modelos entrenados en español.
Sin embargo, la arquitectura por sí sola no contiene conocimientos lingüísticos.
Para desarrollar una aplicación son necesarios un tokenizador, datos adecuados y parámetros entrenados.
Por ejemplo, podría utilizarse RetNet para investigar generación de texto, modelado de lenguaje o procesamiento de secuencias empresariales en español.
También podrían desarrollarse sistemas especializados utilizando corpus técnicos.
No obstante, es importante considerar la disponibilidad real de checkpoints.
La existencia de una implementación de arquitectura no significa que exista un modelo preentrenado adecuado para cualquier idioma o tarea.
Para proyectos empresariales conviene comparar la calidad con modelos ya disponibles antes de asumir el coste de entrenamiento de una arquitectura nueva.
Ventajas de RetNet
Entrenamiento paralelo
La representación paralela permite procesar numerosas posiciones simultáneamente.
Inferencia recurrente
La generación puede realizarse utilizando estados internos actualizables.
Memoria recurrente acotada
El tamaño del estado de retención no necesita crecer con toda la longitud del historial.
Procesamiento por fragmentos
La modalidad Chunkwise Recurrent permite combinar paralelismo y recurrencia.
Múltiples escalas temporales
Multi-Scale Retention proporciona diferentes factores de decaimiento para modelar dependencias de distintas duraciones.
Flexibilidad computacional
La misma operación de retención admite varias estrategias de ejecución.
Arquitectura orientada a grandes modelos
El estudio original evaluó su escalabilidad para modelado de lenguaje autorregresivo.
Limitaciones de RetNet
Aunque RetNet ofrece ventajas, presenta varias limitaciones.
La primera está relacionada con la compresión de la información histórica.
El estado recurrente tiene una capacidad limitada.
Por ello, conservar un estado de tamaño fijo no garantiza recordar todos los detalles anteriores.
Otra limitación es que las diferentes modalidades requieren implementaciones cuidadosas para mantener la equivalencia matemática y la estabilidad numérica.
La representación paralela también puede presentar un coste cuadrático si se calcula mediante matrices densas.
Por tanto, no debe asumirse que toda ejecución de RetNet tiene automáticamente complejidad lineal.
Además, los resultados de rendimiento dependen del hardware y de la implementación.
Los Transformers modernos utilizan técnicas optimizadas como FlashAttention y diferentes estrategias de gestión de caché.
Esto puede modificar considerablemente las comparaciones prácticas.
También existen limitaciones relacionadas con la disponibilidad de modelos preentrenados y herramientas especializadas.
Finalmente, RetNet no garantiza automáticamente una mejor capacidad de comprensión, razonamiento o generación de texto que otras arquitecturas.
Estas propiedades dependen del entrenamiento, los datos y la escala del modelo.
RetNet y la inteligencia artificial generativa
RetNet resulta especialmente relevante para los modelos generativos autorregresivos.
Durante la generación, el sistema produce tokens sucesivamente.
Cada nuevo token modifica el estado recurrente.
Posteriormente, el estado actualizado contribuye a calcular la siguiente predicción.
La ausencia de una caché KV histórica convencional puede reducir las necesidades de memoria durante secuencias largas.
Sin embargo, una memoria recurrente compacta no equivale a una memoria semántica ilimitada.
Los modelos pueden olvidar o comprimir información relevante.
Para aplicaciones empresariales que necesitan recuperar datos exactos, puede resultar conveniente complementar el modelo con mecanismos de recuperación externa.
Por ejemplo, un sistema RAG puede utilizar una base documental para recuperar información antes de generar una respuesta.
RetNet puede formar parte de un sistema generativo, pero no constituye por sí misma una arquitectura de agentes ni un sistema completo de recuperación documental.
Importancia de RetNet en la evolución de los modelos de lenguaje
La principal aportación de RetNet consiste en demostrar que un mecanismo temporal puede diseñarse desde el principio para admitir múltiples estrategias computacionales.
Su representación paralela facilita el entrenamiento.
Su representación recurrente reduce el coste de procesar nuevos tokens.
Su representación por fragmentos proporciona una estrategia eficiente para secuencias largas.
Además, Multi-Scale Retention permite modelar diferentes escalas temporales mediante factores de decaimiento.
Estas innovaciones contribuyen a conectar la investigación sobre atención, recurrencia y memoria neuronal.
RetNet comparte objetivos con arquitecturas como RWKV, Linear Transformer y Mamba, pero utiliza un mecanismo propio.
Su estudio ayuda a comprender que la eficiencia de un modelo no depende solamente de reducir operaciones.
También depende de diseñar una formulación matemática que admita diferentes algoritmos según la etapa de ejecución.
Preguntas frecuentes sobre RetNet
¿Qué es RetNet en inteligencia artificial?
RetNet es una arquitectura neuronal autorregresiva que utiliza mecanismos de retención para combinar entrenamiento paralelo, inferencia recurrente y procesamiento eficiente de secuencias largas.
¿Qué significa RetNet?
RetNet significa Retentive Network, o red de retención.
¿Quién desarrolló RetNet?
Fue presentada en 2023 por Yutao Sun, Li Dong, Shaohan Huang, Shuming Ma, Yuqing Xia, Jilong Xue, Jianyong Wang y Furu Wei.
¿Qué es Retention?
Es un mecanismo que combina representaciones de consultas, claves y valores utilizando ponderación temporal y factores de decaimiento.
¿Qué es Multi-Scale Retention?
Es un mecanismo que utiliza diferentes cabezas de retención para representar dependencias de distintas escalas temporales.
¿Qué es Parallel Retention?
Es una formulación que permite procesar numerosas posiciones simultáneamente mediante operaciones matriciales.
¿Qué es Recurrent Retention?
Es una formulación que mantiene y actualiza un estado interno conforme llegan nuevos tokens.
¿Qué es Chunkwise Recurrent Retention?
Es una modalidad que combina procesamiento paralelo dentro de fragmentos con estados recurrentes que transmiten información entre bloques.
¿RetNet utiliza autoatención softmax?
No como mecanismo central. Utiliza retención ponderada y procedimientos propios de normalización.
¿RetNet necesita una caché KV?
No necesita una caché KV histórica convencional durante su modalidad recurrente. Utiliza estados internos de retención.
¿RetNet tiene complejidad lineal?
Su modalidad recurrente por fragmentos puede ofrecer coste lineal respecto a la longitud total cuando el tamaño de los bloques y las dimensiones permanecen constantes. La modalidad paralela densa puede tener coste cuadrático.
¿RetNet es una red neuronal recurrente?
Puede ejecutarse recurrentemente, aunque su arquitectura también admite representaciones paralelas y por fragmentos.
¿Cuál es la diferencia entre RetNet y RWKV?
RWKV utiliza Weighted Key Value, Time Mixing y Receptance. RetNet utiliza Multi-Scale Retention y tres modalidades explícitas de cálculo.
¿Cuál es la diferencia entre RetNet y Mamba?
Mamba utiliza modelos de espacio de estados selectivos. RetNet utiliza un mecanismo de retención con decaimiento temporal y estados acumulados.
¿Qué significa Time Decay?
Es un mecanismo que controla cómo disminuye la influencia de información anterior conforme aumenta su distancia temporal.
¿RetNet puede procesar documentos largos?
Sí. Su modalidad recurrente por fragmentos está diseñada para procesar secuencias extensas con memoria controlada. Esto no garantiza recuperar todos los detalles históricos.
¿RetNet puede generar texto?
Sí. La arquitectura está diseñada para modelado autorregresivo y puede utilizarse para generación si dispone de parámetros entrenados.
¿RetNet puede utilizarse con Python?
Sí. Microsoft proporciona una implementación de RetNet dentro de la biblioteca TorchScale.
¿RetNet funciona con español?
Puede entrenarse para español, pero la calidad depende del tokenizador, los datos y los pesos del modelo.
¿RetNet es mejor que Transformer?
Puede ofrecer ventajas de memoria y latencia en determinados escenarios, pero no es universalmente superior. La elección depende de la tarea, el modelo y el entorno.
¿Por qué es importante estudiar RetNet?
Porque demuestra cómo combinar entrenamiento paralelo, generación recurrente y procesamiento por fragmentos mediante distintas representaciones de un mismo mecanismo de retención.
Conclusión
La arquitectura RetNet representa una contribución importante a la investigación sobre grandes modelos de lenguaje eficientes.
Su innovación principal es el mecanismo Retention, que permite combinar información histórica utilizando consultas, claves, valores y factores de decaimiento temporal.
La característica más destacada es que la operación admite tres modalidades de cálculo: paralela, recurrente y recurrente por fragmentos.
Esta flexibilidad permite aprovechar el paralelismo durante el entrenamiento y mantener estados compactos durante la generación.
Además, Multi-Scale Retention proporciona múltiples escalas temporales para representar dependencias de distinta duración.
Aunque RetNet ofrece ventajas computacionales interesantes, sus estados recurrentes tienen capacidad limitada y sus resultados deben evaluarse frente a modelos y sistemas actuales.
Para estudiantes, investigadores y desarrolladores de inteligencia artificial, RetNet ofrece una lección fundamental:
Una arquitectura neuronal puede mejorar su eficiencia no solamente reduciendo la complejidad matemática de sus operaciones, sino diseñando mecanismos que puedan calcularse de forma paralela durante el entrenamiento y recurrente durante la inferencia.
Comprender RetNet permite profundizar en los fundamentos de retención temporal, memoria recurrente, atención estructurada, cálculo por fragmentos y optimización de modelos generativos.
Referencias y fuentes oficiales
- Sun, Y., Dong, L., Huang, S., Ma, S., Xia, Y., Xue, J., Wang, J. y Wei, F. (2023). Retentive Network: A Successor to Transformer for Large Language Models. arXiv. https://arxiv.org/abs/2307.08621
- Microsoft Research. Retentive Network: A Successor to Transformer for Large Language Models. https://www.microsoft.com/en-us/research/publication/retentive-network-a-successor-to-transformer-for-large-language-models/
- Microsoft. RetNet — Repositorio del proyecto. https://github.com/microsoft/unilm/tree/master/retnet
- Microsoft. TorchScale — Implementación de RetNet. https://github.com/microsoft/torchscale
- Microsoft. RetNetDecoder — Código de arquitectura. https://github.com/microsoft/torchscale/blob/main/torchscale/architecture/retnet.py
- Hugging Face. Retentive Network — Artículo científico. https://huggingface.co/papers/2307.08621
- Peng, B. et al. (2023). RWKV: Reinventing RNNs for the Transformer Era. https://arxiv.org/abs/2305.13048
- Gu, A. y Dao, T. (2023). Mamba: Linear-Time Sequence Modeling with Selective State Spaces. https://arxiv.org/abs/2312.00752
- Katharopoulos, A. et al. (2020). Transformers are RNNs: Fast Autoregressive Transformers with Linear Attention. https://arxiv.org/abs/2006.16236
